{ "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "开始编译教师版本pdf文件: 临时文件/第五单元选题_教师用_20220918.tex\n", "0\n", "开始编译学生版本pdf文件: 临时文件/第五单元选题_学生用_20220918.tex\n", "0\n" ] } ], "source": [ "import os,re,time,json\n", "\n", "\"\"\"\n", "模板文件目录下 题目清单.tex 文件不能缺失\n", "\"\"\"\n", "\n", "\"\"\"---设置题目列表---\"\"\"\n", "#留空为编译全题库\n", "problems = r\"\"\"\n", "000138,000139,000140,000141,000142,000143,000144,000145,000146,000147,000148,000149,000150,000151,000152,000153,000154,000155,000156,000157,000158,000159,000160,000161,000162,000163,000164,000165,000166,000167,000168,000169,000170,000171,000172,000173,000174,000328,000339,000348,000354,000366,000382,000387,000390,000396,000401,000405,000414,000422,000427,000438,000447,000460,000469,000477,000481,000490,000502,000509,000515,000529,000535,000554,000557,000566,000571,000598,000609,000618,000628,000637,000649,000653,000662,000677,000687,000699,000701,000718,000732,000760,000763,000777,000785,000788,000792,000817,000819,000831,000838,000847,000855,000858,000871,000872,000881,000883,000892,000894,000900,000902,000919,000930,000933,000936,000947,000953,000955,000973,001846,001847,001848,001849,001850,001851,001852,001853,001854,001855,001856,001857,001858,001859,001860,001861,001862,001863,001864,001865,001866,001867,001868,001869,001870,001871,001872,001873,001874,001875,001876,001877,001878,001879,001880,001881,001882,001883,001884,001885,001886,001887,001888,001889,001890,001891,001892,001893,001894,001895,001896,001897,001898,001899,001900,001901,001902,001903,001904,001905,001906,001907,001908,001909,001910,001911,001912,001913,001914,001915,001916,001917,001992,001993,001994,001995,001996,001997,001998,001999,002000,002001,002002,002003,002004,002005,002006,002007,002008,002009,002010,002011,002012,002013,002014,002015,002016,002017,002018,002019,002020,002021,002022,002023,002024,002025,002026,002027,002028,002029,002030,002031,002032,002033,002035,002036,002038,002039,002040,002041,002042,002043,002044,002045,002047,002048,002050,002051,002052,002053,002054,002055,002056,002057,002058,002059,002060,002061,002062,002063,002064,002065,002066,002067,002068,002069,002070,002071,002072,002073,002074,002075,002076,002077,002078,002079,002080,002081,002082,002083,002084,002085,002086,002087,002088,002089,002090,002091,002092,002093,002094,003326,003327,003328,003329,003330,003331,003332,003333,003334,003335,003336,003337,003338,003339,003340,003341,003342,003343,003344,003345,003346,003347,003348,003349,003350,003351,003352,003353,003354,003355,003356,003357,003358,003359,003360,003361,003501,003502,003503,003504,003505,003506,003507,003508,003509,003510,003511,003512,003513,003514,003515,003516,003517,003518,003519,003520,003521,003522,003523,003524,003525,003526,003527,003528,003529,003530,003531,003532,003533,003534,003535,003536,003537,003538,003539,003540,003541,003542,003543,003544,003545,003546,003547,003548,003549,003550,003551,003552,003553,003589,003592,003612,003621,003632,003633,003656,003677,003702,003703,003722,003723,003725,003758,003762,003771,003784,003794,003798,003808,003820,003821,003836,003841,003847,003853,003864,003866,003871,003872,003878,003880,003888,003901,003908,003915,003922,003926,003940,003946,003949,003955,003961,003967,004069,004072,004081,004090,004101,004113,004116,004126,004132,004145,004160,004162,004167,004176,004185,004194,004199,004206,004208,004219,004222,004233,004253,004258,004279,004301,004302,004307,004315,004319,004325,004337,004471,004477,004481,004485,004489,004490,004498,004503,004512,004518,004543,004556,004621,004634,004641,004688,004692,004703,004706,004725,004733,004745,004754,006992,006993,006994,006995,006996,006997,006998,006999,007000,007001,007002,007003,007004,007005,007006,007007,007008,007009,007010,007011,007012,007013,007014,007015,007016,007017,007018,007019,007020,007021,007022,007023,007024,007025,007026,007027,007028,007029,007030,007031,007032,007033,007034,007035,007036,007037,007038,007039,007040,007041,007042,007043,007044,007045,007046,007047,007048,007049,007050,007051,007052,007053,007054,007055,007056,007057,007058,007059,007060,007061,007062,007063,007064,007065,007066,007067,007068,007069,007070,007071,007072,007073,007074,007075,007076,007077,007078,007079,007080,007081,007082,007083,007084,007085,007086,007087,007088,007089,007090,007091,007092,007093,007094,007095,007096,007097,007098,007099,007100,007101,007102,007103,007104,007105,007106,007107,007108,007109,007110,007111,007112,007113,007114,007115,007116,007117,007118,007119,007120,007121,007122,007123,007124,007125,007126,007127,007128,007129,007130,007131,007132,007133,007134,007135,007136,007137,007138,007139,007140,007141,007142,007149,007150,007151,007152,007153,007154,007155,007156,007157,007158,007159,007160,007161,007162,007163,007164,007165,007166,007167,007168,007174,007175,007176,007177,007178,007179,007180,007181,007182,007183,007184,007185,007186,007187,007188,007189,007190,007191,007192,007193,007194,007195,007196,007197,007198,007199,007200,007201,007203,007204,007205,007206,007207,007208,007209,007210,007211,007212,007213,007214,007215,007216,007217,007218,007219,007220,007221,007222,007223,007224,007225,007226,007227,007228,007229,007230,007231,007232,007233,007234,007235,007236,007237,007238,007239,007240,007241,007242,007243,007244,007245,007246,007247,007248,007249,007250,007251,007252,007253,007254,007255,007256,007257,007258,007259,007260,007261,007262,007263,007264,007265,007266,007267,007268,007269,007270,007271,007272,007273,007274,007275,007276,007277,007278,007279,007280,007281,007282,007283,007284,007285,007286,007287,007288,007289,007290,007291,007292,007293,007294,007295,007296,007297,007298,007299,007300,007301,007302,007303,007304,007305,007306,007307,007308,007309,007310,007311,007312,007313,007314,007315,007316,007317,007318,007319,007320,007321,007322,007323,007324,007325,007326,007327,007328,007329,007330,007331,007332,007333,007334,007335,007336,007337,007338,007339,007340,007341,007342,007343,007344,007345,007346,007347,007348,007349,007350,007351,007352,008544,008545,008546,008547,008548,008549,008550,008551,008552,008553,008554,008555,008556,008557,008558,008559,008560,008561,008562,008563,008564,008565,008566,008567,008568,008569,008570,008571,008572,008573,008574,008575,008576,008577,008578,008579,008580,008581,008582,008583,008584,008585,008586,008587,008588,008589,008590,008591,008592,008593,008594,008595,008596,008597,008598,008599,008600,008601,008602,008603,008604,008605,008606,008607,008672,008676,008686,008687,008688,008689,008690,008696,008697,008708,008709,008710,008713,008714,008715,008716,008717,008718,008719,008720,008721,008722,008723,008724,008725,008726,008727,008728,008729,008730,008731,008732,008733,008734,008735,008736,008737,008738,008739,008740,008741,008742,008743,008744,008745,008746,008747,008969,008970,008971,008972,008973,008974,008975,008976,008977,008978,008979,008980,008981,008982,008983,008984,008985,008986,008987,008988,008989,008990,008991,008992,008993,008994,008995,008996,008997,008998,008999,009000,009001,009002,009003,009004,009005,009006,009007,009008,009009,009010,009011,009012,009013,009014,009015,009016,009017,009018,009019,009020,009021,009022,009023,009024,009025,009026,009027,009028,009029,009030,009031,009032,009033,009034,009035,009036,009037,009038,009039,009040,009041,009042,009043,009044,009045,009046,009047,009048,009049,009050,009051,009052,009053,009054,009055,009056,009057,009058,009059,009060,009061,009062,009063,009064,009065,009066,009067,009068,009069,009070,009071,009072,009073,009078,009091,009092,009093,009100,009101,009107,009613,009614,009615,009616,009617,009618,009619,009620,009621,009622,009623,009624,009625,009626,009627,009628,009629,009630,009631,009632,009633,009634,009635,009636,009637,009638,009639,009640,009641,009642,009643,009644,009645,009646,009647,009648,009649,009650,009651,009652,009653,009654,009655,009656,009657,009658,009659,009662,009663,009984,009994,010313,010314,010315,010316,010317,010318,010319,010320,010321,010322,010323,010324,010325,010326,010327,010328,010329,010330,010331,010332,010333,010334,010335,010336,010337,010338,010339,010340,010341,010342,010343,010344,010345,010346,010347,010348,010349,010350,010351,010352,010353,010354,010355,010356,010357,010358,010359,010360,010361,010362,010363,010364,010365,010366,010367,010368,010369,010370,010371,010372,010373,010374,010375,010376,010377,010378,010379,010380,010381,010382,010383,010384,010385,010386,010387,010388,010389,010390,010391,010392,010393,010394,010395,010396,010397,010398,010399,010400,010401,010402,010403,010404,010405,010406,010407,010408,010409,010410,010411,010412,010413,010414,010415,010416,010417,010418,010419,010420,010421,010422,010424,010425,010426,010427,010428\n", "\n", "\n", "\"\"\"\n", "\"\"\"---设置题目列表结束---\"\"\"\n", "\n", "\"\"\"---设置文件名---\"\"\"\n", "#目录和文件的分隔务必用/\n", "filename = \"临时文件/第五单元选题\"\n", "\"\"\"---设置文件名结束---\"\"\"\n", "\n", "\n", "#读取系统日期\n", "current_time = time.localtime()\n", "time_string = \"_\"+str(current_time.tm_year).zfill(4)+str(current_time.tm_mon).zfill(2)+str(current_time.tm_mday).zfill(2)\n", "\n", "teachers_latex_file = filename + \"_教师用\" + time_string + \".tex\"\n", "students_latex_file = filename + \"_学生用\" + time_string + \".tex\"\n", "\n", "#生成数码列表, 逗号分隔每个区块, 区块内部用:表示整数闭区间\n", "def generate_number_set(string,dict):\n", " string = re.sub(r\"[\\n\\s]\",\"\",string)\n", " string_list = string.split(\",\")\n", " numbers_list = []\n", " for s in string_list:\n", " if not \":\" in s:\n", " numbers_list.append(s.zfill(6))\n", " else:\n", " start,end = s.split(\":\")\n", " for ind in range(int(start),int(end)+1):\n", " numbers_list.append(str(ind).zfill(6))\n", " return numbers_list\n", "\n", "#将正确率转化为含颜色代码的字符串\n", "def get_color(value):\n", " value = float(value)\n", " if value>=0.5:\n", " (r,g,b)=(1,2-2*value,0)\n", " else:\n", " (r,g,b)=(2*value,1,0)\n", " return \"{\" + \"%.3f\" %(r) + \",\" + \"%.3f\" %(g) + \",0}\"\n", "\n", "\n", "def color_value(matchobj):\n", " value = matchobj.group(1)\n", " return \"\\t\"+\"\\\\fcolorbox[rgb]{0,0,0}\"+ get_color(value) +\"{\" + value +\"}\"\n", "\n", "\n", "#读取题库json文件并转化为字典\n", "with open(r\"../题库0.3/Problems.json\",\"r\",encoding = \"utf8\") as f:\n", " database = f.read()\n", "pro_dict = json.loads(database)\n", "\n", "#读取目标数据库json并转化为字典\n", "with open(r\"../题库0.3/LessonObj.json\",\"r\",encoding = \"utf8\") as f:\n", " database = f.read()\n", "obj_dict = json.loads(database)\n", "\n", "#生成题目列表\n", "if problems.strip() == \"\":\n", " problem_list = list(pro_dict.keys())\n", "else:\n", " problem_list = [id for id in generate_number_set(problems.strip(),pro_dict) if id in pro_dict]\n", "\n", "data_teachers = \"\"\n", "data_students = \"\"\n", "id_list = \"\"\n", "\n", "#生成教师题目字符串与学生题目字符串, 准备替换至latex文件\n", "for id in problem_list:\n", " problemset = pro_dict[id]\n", " problem = problemset[\"content\"]\n", " solution = (problemset[\"solution\"] if problemset[\"solution\"] != \"\" else \"暂无解答与提示\")\n", " answer = (problemset[\"ans\"] if problemset[\"ans\"] != \"\" else \"暂无答案\")\n", " remarks = (problemset[\"remark\"] if problemset[\"remark\"] != \"\" else \"暂无备注\")\n", " usages_list = problemset[\"usages\"]\n", " if len(usages_list) > 0:\n", " usage = re.sub(\"\\\\t([\\d]\\.[\\d]{0,10})\",color_value,\"\\n\\n\".join(usages_list))\n", " usage = re.sub(\"[\\\\t ]([\\d]\\.[\\d]{0,10})\",color_value,usage)\n", " else:\n", " usage = \"暂无使用记录\"\n", " origin = (problemset[\"origin\"] if problemset[\"origin\"] != \"\" else \"出处不详\")\n", " objects = problemset[\"objs\"]\n", " if len(objects) == 0:\n", " objects = \"暂未关联目标\\n\\n\"\n", " elif \"KNONE\" in [o.upper() for o in objects]:\n", " objects = \"该题的考查目标不在目前的集合中\\n\\n\"\n", " else:\n", " objects_string = \"\"\n", " for obj in objects:\n", " if not obj in obj_dict:\n", " objects_string = \"目标\" + obj + \"有误\\n\\n\"\n", " break\n", " else:\n", " objects_string += obj + \"|\" + obj_dict[obj][\"content\"] + \"\\n\\n\"\n", " objects = objects_string\n", " space = (\"\" if problemset[\"space\"] == \"\" else r\"\\vspace*{\"+problemset[\"space\"]+\"}\\n\")\n", " tags = (\"|\".join(problemset[\"tags\"]) if len(problemset[\"origin\"])>0 else \"暂无标签\")\n", " raw_string = \"\\\\item \" + \"{\\\\tiny (\"+id+\")}\"+problem\n", " teachers_string = raw_string.replace(\"\\\\tiny\",\"\")+\"\\n\\n关联目标:\\n\\n\"+ objects + \"\\n\\n标签: \" + tags + \"\\n\\n答案: \"+answer + \"\\n\\n\" + \"解答或提示: \" + solution + \"\\n\\n使用记录:\\n\\n\"+ usage + \"\\n\" + \"\\n\\n备注: \" + remarks + \"\\n\\n出处: \"+origin + \"\\n\"\n", " students_string = raw_string + space + \"\\n\\n\"\n", " data_teachers += teachers_string\n", " data_students += students_string\n", "\n", "\n", "\n", "#替换latex文件的内容并编译\n", "with open(\"模板文件/题目清单.tex\",\"r\",encoding = \"utf8\") as f:\n", " latex_raw = f.read()\n", "latex_teachers = latex_raw.replace(\"编译模板\",data_teachers)\n", "with open(teachers_latex_file,\"w\",encoding = \"utf8\") as f:\n", " f.write(latex_teachers)\n", "print(\"开始编译教师版本pdf文件: \", teachers_latex_file)\n", "d = re.search(\"/[^/]*$\",teachers_latex_file).span()[0]\n", "pdf_dir = teachers_latex_file[:d]\n", "os.system(\"xelatex -interaction=batchmode -output-directory=\" + pdf_dir + \" \"+ teachers_latex_file)\n", "print(os.system(\"xelatex -interaction=batchmode -output-directory=\" + pdf_dir + \" \"+ teachers_latex_file))\n", "\n", "latex_students = latex_raw.replace(\"编译模板\",data_students)\n", "with open(students_latex_file,\"w\",encoding = \"utf8\") as f:\n", " f.write(latex_students)\n", "print(\"开始编译学生版本pdf文件: \", students_latex_file)\n", "d = re.search(\"/[^/]*$\",students_latex_file).span()[0]\n", "pdf_dir = students_latex_file[:d]\n", "os.system(\"xelatex -interaction=batchmode -output-directory=\" + pdf_dir + \" \"+ students_latex_file)\n", "print(os.system(\"xelatex -interaction=batchmode -output-directory=\" + pdf_dir + \" \"+ students_latex_file))\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.8 ('base')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "d311ffef239beb3b8f3764271728f3972d7b090c974f8e972fcdeedf230299ac" } } }, "nbformat": 4, "nbformat_minor": 2 }