192 lines
12 KiB
Plaintext
192 lines
12 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"开始编译教师版本pdf文件: 临时文件/复数预选_教师用_20220922.tex\n",
|
|
"0\n",
|
|
"开始编译学生版本pdf文件: 临时文件/复数预选_学生用_20220922.tex\n",
|
|
"0\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import os,re,time,json\n",
|
|
"\n",
|
|
"\"\"\"\n",
|
|
"模板文件目录下 题目清单.tex 文件不能缺失\n",
|
|
"\"\"\"\n",
|
|
"\n",
|
|
"\"\"\"---设置题目列表---\"\"\"\n",
|
|
"#留空为编译全题库\n",
|
|
"problems = r\"\"\"\n",
|
|
"000162,000163,000164,000165,000166,000167,000168,000169,000170,000171,000173,000174,000328,000339,000348,000366,000387,000396,000422,000427,000438,000447,000460,000469,000477,000490,000502,000509,000529,000557,000566,000598,000609,000618,000628,000637,000649,000677,000687,000718,000732,000763,000777,000788,000817,000831,000838,000847,000858,000872,000881,000892,000900,000902,000933,000953,001992,001993,001994,001995,001996,001997,001998,001999,002000,002001,002002,002003,002004,002005,002006,002007,002008,002010,002011,002012,002013,002014,002015,002016,002017,002018,002020,002021,002022,002023,002024,002025,002026,002027,002028,002029,002032,002034,002035,002036,002037,002038,002039,002040,002041,002042,002043,002044,002045,002046,002047,002048,002049,002050,002051,002052,002053,002054,002055,002057,002058,002059,002063,002065,002066,002067,002068,002069,002070,002071,002074,002076,002077,002078,002079,002080,002081,002084,002085,002086,002087,002088,002089,002090,002091,002092,002093,003502,003503,003504,003505,003506,003507,003508,003509,003510,003511,003512,003513,003514,003515,003516,003517,003519,003520,003521,003522,003523,003524,003527,003528,003530,003531,003532,003533,003534,003535,003538,003539,003540,003541,003542,003543,003544,003545,003549,003550,003551,003553,003589,003612,003632,003656,003677,003722,003758,003762,003794,003821,003866,003872,003880,003908,003922,003926,003940,003955,004072,004081,004101,004113,004126,004145,004176,004185,004206,004222,004233,004253,004307,004319,004471,004489,004503,004512,004556,004621,004641,004688,004706,004725,004745,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,007034,007037,007038,007039,007040,007041,007042,007043,007044,007045,007046,007047,007048,007049,007050,007051,007052,007054,007055,007056,007057,007060,007061,007062,007063,007064,007065,007066,007067,007068,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,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,007135,007136,007137,007138,007139,007143,007144,007145,007146,007147,007148,007149,007151,007153,007157,007158,007159,007160,007161,007162,007163,007164,007166,007167,007168,007169,007170,007171,007172,007173,007174,007175,007176,007177,007178,007179,007180,007181,007182,007184,007185,007186,007187,007188,007189,007190,007191,007192,007193,007194,007195,007197,007198,007199,007200,007201,007202,007203,007204,007205,007206,007207,007208,007209,007210,007211,007212,007215,007216,007217,007218,007219,007222,007223,007224,007225,007226,007227,007228,007229,007230,007231,007233,007235,007236,007237,007238,007239,007240,007241,007242,007243,007244,007245,007246,007247,007248,007249,007250,007251,007254,007255,007256,007257,007258,007260,007261,007262,007263,007264,007265,007266,007267,007268,007269,007270,007271,007272,007273,007274,007275,007276,007277,007278,007279,007280,007281,007283,007284,007291,007292,007295,007296,007297,007298,007299,007300,007301,007302,007303,007304,007305,007306,007307,007308,007309,007312,007313,007314,007315,007316,007317,007318,007320,007322,007325,007327,007328,007329,007330,007331,007332,007333,007334,007335,007336,007337,007338,007339,007342,007343,007344,007345,007346,007347,007349,007351,008969,008970,008971,008972,008973,008974,008975,008976,008977,008978,008979,008980,008981,008982,008983,008984,008985,008986,008987,008988,008989,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,009024,009025,009028,009029,009030,009031,009032,009033,009037,009038,009039,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,009101,009643,009644,009645,009646,009647,009648,009649,009650,009651,009652,009653,009654,009656,009658,009660,009661,009662,009984,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,010415,010416,010417,010419,010420,010421,010423,010424,010425,010426,010427,010428\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 \"\\n\"+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.9.7 ('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.9.7"
|
|
},
|
|
"orig_nbformat": 4,
|
|
"vscode": {
|
|
"interpreter": {
|
|
"hash": "e4cce46d6be9934fbd27f9ca0432556941ea5bdf741d4f4d64c6cd7f8dfa8fba"
|
|
}
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|