新增 系列讲义生成(替代原有的讲义生成)功能, 及辅助的一些json和database_tools
This commit is contained in:
parent
7c3dfbc72e
commit
aa9578f1b0
|
|
@ -887,6 +887,53 @@ def XeLaTeXCompile(filedir,filename): #在filedir目录中用XeLaTeX编译filena
|
|||
flagsuc = False
|
||||
return flagsuc # 若第二次编译成功则返回True, 否则返回False
|
||||
|
||||
|
||||
def GenerateSectionBodyString2024(problems,sectiontitles,pro_dict,obj_dict,bk_dict,misc,consecutivenumbering= True): #生成学生版的.tex文件的主体内容
|
||||
bodystring = ""
|
||||
count = 0
|
||||
for i in range(len(problems)):
|
||||
if problems[i][0] in "0123456789":
|
||||
idlist = generate_number_set(problems[i],pro_dict)
|
||||
sectionstring = f"\\section{{{sectiontitles[i]}}}\n\\begin{{enumerate}}\n\\setcounter{{enumi}}{{{count if consecutivenumbering else 0}}}\n\n"
|
||||
for id in idlist:
|
||||
count += 1
|
||||
sectionstring += generateLaTeXBodyContent(id,pro_dict,obj_dict,misc)
|
||||
sectionstring += "\\end{enumerate}\n\n"
|
||||
bodystring += sectionstring
|
||||
if problems[i][0] == "K":
|
||||
idlist = problems[i].split(",")
|
||||
sectionstring = f"\\section{{{sectiontitles[i]}}}\n\\begin{{enumerate}}\n\n"
|
||||
for objid in idlist:
|
||||
sectionstring += f"\\item {objid} \\ {(obj_dict[objid]['content'] if objid in obj_dict else '目标编号有误')}\n\n"
|
||||
sectionstring += "\\end{enumerate}\n\n"
|
||||
bodystring += sectionstring
|
||||
if problems[i][0] == "B":
|
||||
idlist = problems[i].split(",")
|
||||
sectionstring = f"\\section{{{sectiontitles[i]}}}\n\\begin{{enumerate}}\n\n"
|
||||
for bkid in idlist:
|
||||
if bkid in bk_dict:
|
||||
bk = bk_dict[bkid]["content"]
|
||||
else:
|
||||
bk = bkid + " \\ 基础知识编号有误"
|
||||
sectionstring += f"\\item {(bk)}\n\n"
|
||||
sectionstring += "\\end{enumerate}\n\n"
|
||||
bodystring += sectionstring
|
||||
return bodystring #返回主题内容字符串
|
||||
|
||||
# if not objlist == []:
|
||||
# output += "\\section{课时目标}\n\n"
|
||||
# output += "\\begin{enumerate}\n\n"
|
||||
# for objid in objlist:
|
||||
# output += "\\item %s \\ %s \n\n"%(objid,objdict[objid]["content"])
|
||||
# output += "\\end{enumerate}\n\n" #生成学习目标
|
||||
# if not bnlist == []:
|
||||
# output += "\\section{双基梳理}\n\n"
|
||||
# basic_body = ""
|
||||
# for bnid in bnlist:
|
||||
# basic_body += "\\item %s\n\n"%basicknowledgedict[bnid]["content"]
|
||||
# output += "\\begin{enumerate}\n\n %s\n\n\\end{enumerate}\n\n"%basic_body #生成基础知识梳理
|
||||
|
||||
|
||||
def GenerateStudentBodyString(problems,sectiontitles,pro_dict,consecutivenumbering= True,answered= True,spaceflag=True): #生成学生版的.tex文件的主体内容
|
||||
bodystring = ""
|
||||
if len(problems) == len(sectiontitles):
|
||||
|
|
@ -1499,6 +1546,47 @@ def select_grade_from_pro_dict(prodict,grades):
|
|||
adict[id]["usages"] = new_usages.copy()
|
||||
return adict
|
||||
|
||||
def GenerateSingleLessonNote2024(id,notesdict,pro_dict,obj_dict,bk_dict,templatepath,outputfilepath,misc,consecutivenumbering = False): #20231215版讲义生成
|
||||
notetitle = id + r" \ " + notesdict["notes"][id]["name"]
|
||||
structure = notesdict["structures"][id[0].upper()]["structure"]
|
||||
note_contents = notesdict["notes"][id]
|
||||
output = ""
|
||||
sections_list = []
|
||||
problems_list = []
|
||||
for key in structure:
|
||||
if not len(note_contents[key]) == 0:
|
||||
sections_list.append(key)
|
||||
problems_list.append(",".join(note_contents[key]))
|
||||
rawoutput = GenerateSectionBodyString2024(problems=problems_list,sectiontitles=sections_list,pro_dict=pro_dict,obj_dict=obj_dict,bk_dict=bk_dict,misc=misc,consecutivenumbering= consecutivenumbering)
|
||||
# rawoutput = GenerateStudentBodyString(problems=problems_list,sectiontitles=sections_list,pro_dict=metadict,consecutivenumbering= consecutivenumbering, answered= answered, spaceflag = True)
|
||||
paragraphs = [p for p in rawoutput.split("\\section") if not p.strip() == ""]
|
||||
for item in paragraphs:
|
||||
sectionkey, content = re.findall(r"\{([\S]*)\}\n([\S\s]*)$",item)[0]
|
||||
if not len(paragraphs) == 1:
|
||||
output += "\\section{" + structure[sectionkey]["name"] + "}\n\n"
|
||||
# if not structure[sectionkey]["spaceflag"] or answered:
|
||||
# content = re.sub(r"\\vspace[\*]?\{[\S]*\}","\n",content)
|
||||
output += content + "\n\n"
|
||||
|
||||
latex_raw = ReadTextFile(templatepath)
|
||||
latex_raw = latex_raw.replace(r"学号\blank{50} \ 姓名\blank{80}","上海市控江中学") #替换掉模板中的姓名学号
|
||||
|
||||
if sys.platform != "win32": #非win系统用默认字体
|
||||
latex_raw = re.sub(r"fontset[\s]*=[\s]*none","fontset = fandol",latex_raw)
|
||||
latex_raw = re.sub(r"\\setCJKmainfont",r"% \\setCJKmainfont",latex_raw)
|
||||
|
||||
latex_data = StringSubstitute(r"<<[\s\S]*?待替换[\s\S]*?>>",latex_raw,(notetitle,output)) #替换标题和bodystring
|
||||
SaveTextFile(latex_data,outputfilepath) #保存.tex文件
|
||||
|
||||
outputdir,filename = os.path.split(outputfilepath)
|
||||
print(f"{filename}编译中...")
|
||||
if XeLaTeXCompile(outputdir,filename):
|
||||
print("编译成功")
|
||||
return latex_data # 返回0
|
||||
else:
|
||||
print("编译失败")
|
||||
return latex_data # 返回有错误的latex源代码
|
||||
|
||||
def GenerateSingleLessonNote(id,notesdict,metadict,templatepath,outputfilepath,consecutivenumbering = False, answered = False): #20231215版讲义生成
|
||||
notetitle = id + r" \ " + notesdict["notes"][id]["name"]
|
||||
structure = notesdict["structures"][id[0].upper()]["structure"]
|
||||
|
|
|
|||
|
|
@ -32,5 +32,22 @@
|
|||
"备注": true,
|
||||
"届别": []
|
||||
}
|
||||
},
|
||||
"系列讲义生成.py": {
|
||||
"讲义标题格式": "[EWGVI]202601\\d{2}",
|
||||
"输出路径": "临时文件",
|
||||
"教师版": true,
|
||||
"字段显示设置": {
|
||||
"题后空间": true,
|
||||
"课时目标": true,
|
||||
"题目标签": true,
|
||||
"答案": true,
|
||||
"解答与提示": true,
|
||||
"使用记录": [3,-1],
|
||||
"使用记录说明": "[a,b]表示显示最好的a个和最差b个, 有-2表示不显示, 无-2但有-1表示全部显示",
|
||||
"来源": true,
|
||||
"备注": true,
|
||||
"届别": []
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
# lessonpattern = r"U20240501" # 正则表达式, 数据库中讲义的编号([A-Z][0-9]{4}[(01)|(02)][[0-9]{2}), 字母表示类型, 四位数字表示届别, 2位数字表示学期及其他, 2位数字表示序号
|
||||
# outputdir = "d:/temp/26届材料" # 输出文件夹, 不建议修改
|
||||
# answered = True # 设置是否编译答案
|
||||
|
||||
from database_tools import *
|
||||
|
||||
configjson = load_dict("文本文件/config.json")["系列讲义生成.py"]
|
||||
|
||||
lessonpattern = configjson["讲义标题格式"] # 正则表达式, 数据库中讲义的编号([A-Z][0-9]{4}[(01)|(02)][[0-9]{2}), 字母表示类型, 四位数字表示届别, 2位数字表示学期及其他, 2位数字表示序号
|
||||
outputdir = configjson["输出路径"] # 输出文件夹, 不建议修改
|
||||
# answered = configjson["提供答案"] # 设置是否编译答案
|
||||
|
||||
|
||||
jsonpath = "../备课组" #有json文件的根目录, 文件名需为"校本材料.json"
|
||||
jsondicts = []
|
||||
for loc,dirs,files in os.walk(jsonpath):
|
||||
if "校本材料.json" in files:
|
||||
jsondicts.append(load_dict(os.path.join(loc,"校本材料.json")))
|
||||
|
||||
|
||||
pro_dict = load_dict("../题库0.3/problems.json")
|
||||
obj_dict = load_dict("../题库0.3/LessonObj.json")
|
||||
basicknowledge_dict = load_dict("../题库0.3/BasicKnowledge.json")
|
||||
|
||||
dictionaries = {} #合并字典
|
||||
for t in (obj_dict,basicknowledge_dict,pro_dict):
|
||||
dictionaries.update(t)
|
||||
|
||||
papernames = []
|
||||
multitexdata = []
|
||||
|
||||
for notes_dict in jsondicts:
|
||||
for lessonid in notes_dict["notes"]:
|
||||
if re.findall(lessonpattern,lessonid) != []:
|
||||
filename = notes_dict["notes"][lessonid]["id"]+notes_dict["notes"][lessonid]["filename"]+".tex"
|
||||
papertype = lessonid[0]
|
||||
consecutivenumbering = notes_dict["structures"][papertype]["consecutivenumbering"]
|
||||
texdata = GenerateSingleLessonNote2024(id = lessonid,notesdict=notes_dict,pro_dict=pro_dict,obj_dict=obj_dict,bk_dict=basicknowledge_dict,templatepath=".\模板文件\讲义模板.txt",outputfilepath = os.path.join(outputdir,filename),misc=configjson,consecutivenumbering = consecutivenumbering)
|
||||
# texdata = GenerateSingleLessonNote(id = lessonid,notesdict = notes_dict, metadict = dictionaries, templatepath = ".\模板文件\讲义模板.txt", outputfilepath = os.path.join(outputdir,filename),consecutivenumbering=consecutivenumbering,answered=answered)
|
||||
papernames.append(notes_dict["notes"][lessonid]["id"]+" \\ "+notes_dict["notes"][lessonid]["name"])
|
||||
multitexdata.append(re.findall(r"\\begin{center}\n{\\bf\\large \\papername}\n\\end{center}([\s\S]*\\end\{enumerate\})",texdata)[0])
|
||||
|
||||
|
||||
merged = ""
|
||||
for i in range(len(papernames)):
|
||||
merged += "\n\n\\chapter{"+papernames[i]+"}\n\n\n"
|
||||
merged += multitexdata[i]
|
||||
|
||||
mergedtext = StringSubstitute(r"<<待替换[\d]+>>",ReadTextFile("./模板文件/合集模板.txt"),[merged])
|
||||
|
||||
SaveTextFile(mergedtext,os.path.join(outputdir,f"合集{GetDate()}.tex"))
|
||||
|
||||
tocompile = input("需要编译合集吗?(Y/[N]):")
|
||||
if tocompile[0].upper() == "Y":
|
||||
XeLaTeXCompile(outputdir,f"合集{GetDate()}.tex")
|
||||
|
||||
Reference in New Issue