This repository has been archived on 2024-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
mathdeptv2/工具/题号选题pdf生成.ipynb

204 lines
16 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"开始编译教师版本pdf文件: 临时文件/测验预选_教师用_20221011.tex\n",
"0\n",
"开始编译学生版本pdf文件: 临时文件/测验预选_学生用_20221011.tex\n",
"0\n"
]
}
],
"source": [
"import os,re,time,json,sys\n",
"\n",
"\"\"\"\n",
"模板文件目录下 题目清单.tex 文件不能缺失\n",
"\"\"\"\n",
"\n",
"\"\"\"---设置题目列表---\"\"\"\n",
"#留空为编译全题库, a为读取临时文件中的题号筛选.txt文件生成题库\n",
"problems = r\"\"\"\n",
"000330,000355,000358,000366,000367,000368,000374,000377,000378,000380,000381,000382,000386,000388,000390,000396,000397,000401,000405,000406,000407,000409,000413,000415,000416,000422,000423,000425,000426,000427,000428,000433,000434,000437,000438,000441,000445,000446,000447,000448,000449,000450,000456,000458,000459,000460,000461,000463,000466,000468,000469,000471,000472,000476,000479,000487,000489,000490,000494,000495,000496,000497,000502,000504,000505,000506,000507,000509,000520,000525,000526,000529,000535,000536,000537,000538,000541,000547,000549,000550,000552,000554,000556,000559,000566,000567,000571,000572,000576,000577,000582,000583,000585,000586,000587,000590,000592,000594,000596,000598,000604,000607,000608,000609,000612,000614,000616,000617,000618,000626,000627,000628,000634,000636,000639,000642,000644,000646,000647,000648,000649,000650,000653,000660,000662,000664,000665,000666,000673,000675,000676,000677,000678,000684,000686,000687,000693,000697,000699,000700,000701,000702,000706,000709,000715,000716,000718,000726,000730,000732,000736,000742,000746,000748,000750,000756,000758,000759,000761,000762,000763,000766,000767,000768,000769,000776,000777,000782,000785,000789,000797,000799,000803,000807,000808,000810,000816,000817,000818,000819,000826,000831,000834,000836,000838,000845,000846,000847,000850,000851,000855,000857,000859,000862,000868,000872,000879,000881,000890,000891,000896,000898,000899,000900,000904,000910,000911,000912,000913,000915,000918,000919,000920,000921,000926,000930,000931,000932,000933,000936,000937,000942,000944,000945,000947,000949,000953,000955,000961,000964,000965,000967,000970,000973,000975,000976,000979,000980,000982,000983,000984,000985,000987,000988,000989,000990,000991,000992,000993,000994,000995,000996,000997,000998,000999,001000,001001,001002,001004,001005,001006,001007,001008,001009,001010,001011,001012,001013,001017,001029,001040,001041,001042,001043,001044,001045,001046,001047,001048,001051,001052,001053,001054,001055,001056,001057,001058,001059,001060,001061,001062,001063,001064,001065,001066,001067,001068,001070,001071,001075,001076,001077,001078,001079,001080,001081,001082,001083,001084,001087,001088,001089,001090,001091,001092,001093,001094,001095,001097,001098,001099,001100,001101,001102,001103,001104,001105,001106,001107,001108,001109,001110,001111,001112,001113,001114,001115,001116,001118,001119,001121,001122,001124,001125,001126,001129,001131,001133,001135,001136,001137,001140,001141,001142,001143,001144,001145,001146,001147,001148,001149,001150,001151,001152,001153,001154,001155,001156,001157,001158,001159,001160,001161,001162,001163,001165,001166,001167,001169,001170,001172,001173,001174,001175,001176,001177,001178,001179,001180,001181,001182,001183,001184,001185,001186,001187,001188,001189,001190,001191,001192,001193,001194,001195,001196,001197,001198,001199,001200,001201,001202,001203,001204,001205,001206,001207,001208,001209,001210,001212,001213,001214,001215,001216,001217,001219,001220,001222,001223,001224,001225,001228,001229,001230,001232,001233,001234,001235,001236,001237,001240,001241,001243,001246,001247,001248,001249,001250,001251,001252,001253,001254,001255,001256,001257,001258,001259,001260,001261,001263,001264,001265,001266,001267,001268,001269,001271,001272,001273,001274,001275,001276,001278,001279,001280,001281,001282,001283,001284,001285,001288,001289,001290,001291,001293,001294,001295,001297,001298,001299,001301,001302,001303,001304,001306,001307,001310,001311,001313,001315,001317,001318,001319,001320,001321,001322,001323,001327,001332,001333,001334,001335,001336,001337,001338,001341,001342,001344,001346,001347,001348,001349,001350,001354,001364,001366,001368,001369,001370,001372,001373,001374,001375,001376,001377,001378,001379,001380,001381,001382,001383,001384,001385,001386,001387,001388,001390,001391,001392,001393,001394,001395,001396,001397,001398,001400,001401,001402,001403,001404,001405,001406,001407,001408,001409,001410,001411,001413,001414,001415,001416,001417,001418,001419,001420,001421,001422,001423,001424,001425,001426,001427,001428,001429,001430,001431,001432,001433,001434,001435,001436,001437,001438,001439,001440,001441,001442,001443,001444,001445,001446,001447,001448,001449,001450,001451,001452,001453,001454,001455,001456,001457,001458,001459,001460,001461,001462,001463,001464,001465,001466,001467,001468,001469,001470,001471,001473,001474,001475,001476,001477,001478,001479,001482,001483,001485,001486,001487,001488,001489,001490,001491,001493,001494,001499,001500,001501,001502,001503,001504,001505,001506,001507,001508,001509,001510,001511,001512,001514,001515,001516,001517,001518,001519,001520,001521,001522,001523,001524,001525,001526,001527,001528,001529,001530,001531,001532,001533,001534,001536,001539,001540,001541,001542,001543,001544,001545,001546,001547,001548,001549,001550,001551,001552,001553,001555,001556,001558,001559,001560,001561,001562,001563,001564,001565,001566,001567,001568,001569,001570,001571,001572,001573,001574,001575,001576,001577,001578,001579,001580,001581,001582,001583,001584,001585,001587,001588,001589,001590,001591,001595,001598,001605,001610,001629,001642,001682,001695,001832,001849,001851,001854,001855,001859,001861,001862,001865,001866,001867,001868,001872,001873,001874,001875,001876,001878,001879,001880,001881,001883,001884,001885,001887,001890,001891,001893,001897,001899,001900,001901,001903,001904,001908,001909,001915,001917,001993,001994,001995,001996,001997,001998,002002,002003,002005,002006,002009,002011,002014,002015,002019,002021,002022,002023,002024,002027,002028,002029,002030,002031,002033,002034,002035,002036,002037,002039,002040,002041,002042,002043,002044,002045,002046,002047,002048,002049,002050,002051,002052,002053,002054,002055,002056,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,002087,002089,002090,002091,002092,002093,002094,003603,003604,003620,003625,003642,003645,003646,003667,004059,004066,004067,004069,004070,004072,004074,004076,004079,004081,004086,004089,004090,004092,004094,004097,004098,004111,004113,004115,004116,004119,004123,004125,004126,004130,004132,004135,004136,004137,004139,004143,004144,004145,004149,004151,004153,004154,004155,004160,004162,004165,004168,004172,004174,004175,004176,004185,004186,004191,004194,004198,004199,004202,004203,004205,004206,004208,004209,004214,004215,004217,004219,004220,004222,004227,004228,004229,004233,004234,004235,004236,004238,004240,004244,004249,004253,004256,004258,004259,004261,004266,004269,004270,004271,004272,004273,004274,004277,004278,004279,004284,004285,004286,004287,004289,004290,004291,004292,004293,004301,004302,004305,004307,004311,004313,004314,004315,004316,004319,004323,004325,004326,004329,004332,004335,004336,004337,004339,004344,004347,004349,004350,004353,004354,004355,004357,004358,004360,004362,004364,004365,004366,004368,004371,004373,004374,004375,004376,004377,004378,004379,004380,004381,004382,004383,004384,004386,004387,004388,004389,004390,004392,004395,004396,004397,004399,004401,004403,004405,004406,004407,004408,004410,004411,004413,004414,004415,004416,004417,004418,004419,004420,004421,004422,004423,004424,004425,004427,004429,004431,004432,004433,004435,004436,004438,004442,004443,004445,004446,004447,004449,004452,004455,004456,004457,004458,004461,004463,004464,004465,004466,004468,004469,004471,004477,004481,004483,004485,004486,004489,004490,004496,004498,004499,004500,004502,004503,004506,004509,004510,004512,004515,004516,004518,004522,004523,004525,004527,004531,004532,004533,004540,004541,004542,004543,004544,004545,004546,004549,004552,004554,004555,004556,004559,004562,004563,004564,004569,004571,004619,004620,004621,004623,004630,004631,004634,004636,004637,004640,004641,004646,004649,004650,004657,004658,004745,004754,004755,004756,004757,004759,004760,004762,004763\n",
"\n",
"\n",
"\"\"\"\n",
"\"\"\"---设置题目列表结束---\"\"\"\n",
"\n",
"\"\"\"---设置文件名---\"\"\"\n",
"#目录和文件的分隔务必用/\n",
"filename = \"临时文件/测验预选\"\n",
"\"\"\"---设置文件名结束---\"\"\"\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",
"elif problems.strip()[0] == \"a\":\n",
" with open(\"临时文件/题号筛选.txt\",\"r\",encoding = \"utf8\") as f:\n",
" problems = f.read()\n",
" problem_list = [id for id in generate_number_set(problems.strip(),pro_dict) if id in pro_dict]\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 = \"\\\\textcolor{red}{\" + (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 += \"\\\\textcolor{blue}{\" + 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",
"\n",
"#识别操作系统\n",
"if sys.platform != \"win32\":\n",
" latex_raw = re.sub(r\"fontset[\\s]*=[\\s]*windows\",\"fontset = fandol\",latex_raw)\n",
" latex_raw = re.sub(r\"\\\\setCJKmainfont\",r\"% \\\\setCJKmainfont\",latex_raw)\n",
"\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
}