diff --git a/工具v4/database_tools_2.py b/工具v4/database_tools_2.py index f95fddc7..3f7432e0 100644 --- a/工具v4/database_tools_2.py +++ b/工具v4/database_tools_2.py @@ -1860,7 +1860,22 @@ def generateLaTeXBodyContentfromMariaDB(cursor,id,misc): #根据id,读取的json output = f"\\item ({id}) 题号有误!!!" return output +def generateLaTeXobjsfromDict(objid,objdict): + objid = str(objid).upper().strip() + if objid == "KNONE": + return "" + else: + output = f"\\item {objid} {objdict[objid]['objcontent']}\n\n" + return output +def generateLaTeXbnsfromDict(bnid,bndict): + bnid = str(bnid).upper().strip() + if not bnid in bndict: + bn_content = f"{bnid} 基础知识目标编号有误" + else: + bn_content = f"{bndict[bnid]['bncontent']}" + output = f"\\item {bn_content}\n\n" + return output def generateLaTeXobjsfromMariaDB(cursor,objid): objid = str(objid).upper().strip() @@ -2395,6 +2410,48 @@ def select_grade_from_pro_dict(prodict,grades): adict[id]["usages"] = new_usages.copy() return adict +def GenerateSectionBodyStringfromDict(problems,sectiontitles,prodict,objdict,bndict,misc,consecutivenumbering): + bodystring = "" + count = 0 + for i in range(len(problems)): + if problems[i][0] in "0123456789": + idlist = generate_number_set(problems[i]) + 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 += generateLaTeXBodyContentFromDict(id,prodict,objdict,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 += generateLaTeXobjsfromDict(objid,objdict) + 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 bnid in idlist: + sectionstring += generateLaTeXbnsfromDict(bnid,bndict) + sectionstring += "\\end{enumerate}\n\n" + bodystring += sectionstring + return bodystring #返回主题内容字符串 + +def GenerateSingleLessonTeXfromDict(id,notesdict,pro_dict,obj_dict,bn_dict,misc,consecutivenumbering=False): + structure = notesdict["structures"][id[0].upper()]["structure"] + note_contents = notesdict["notes"][id] + sections_list = [] + problems_list = [] + for key in structure: + if not len(note_contents[key]) == 0: + sections_list.append(structure[key]["name"]) + problems_list.append(",".join(note_contents[key])) + rawoutput = GenerateSectionBodyStringfromDict(problems=problems_list,sectiontitles=sections_list,prodict=pro_dict,objdict=obj_dict,bndict=bn_dict,misc=misc,consecutivenumbering= consecutivenumbering) + if len(sections_list) == 1: + rawoutput = re.sub(r"\\section\{[^\n]*","",rawoutput) + return rawoutput + def GenerateSingleLessonNotefromMariaDB(cursor,id,notesdict,templatepath,outputfilepath,misc,consecutivenumbering = False): #20240415版讲义生成 notetitle = id + r" \ " + notesdict["notes"][id]["name"] structure = notesdict["structures"][id[0].upper()]["structure"] diff --git a/工具v4/系列讲义生成.py b/工具v4/系列讲义生成.py index bc8d6228..33e10cd9 100644 --- a/工具v4/系列讲义生成.py +++ b/工具v4/系列讲义生成.py @@ -87,14 +87,12 @@ class MyWindow_jysc(QWidget,Ui_Form): mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = self.database_name) mycursor = mydb.cursor() - # raw_pro_dict = load_dict("../题库0.3/Problems.json") - # obj_dict = load_dict("../题库0.3/LessonObj.json") - # basicknowledge_dict = load_dict("../题库0.3/BasicKnowledge.json") + raw_pro_dict,obj_dict,bn_dict,unit_obj_dict = generateDictsfromMariaDB(mycursor) if self.radioButton_teacher.isChecked() and self.checkBox_usages.isChecked() and not self.lineEdit_grades.text().strip() == "": grades = self.lineEdit_grades.text().strip().split(",") else: grades = [] - # pro_dict = select_grade_from_pro_dict(raw_pro_dict,grades) + pro_dict = select_grade_from_pro_dict(raw_pro_dict,grades) # dictionaries = {} #合并字典 # for t in (obj_dict,basicknowledge_dict,pro_dict): # dictionaries.update(t) @@ -128,11 +126,29 @@ class MyWindow_jysc(QWidget,Ui_Form): filename = notes_dict["notes"][lessonid]["id"]+notes_dict["notes"][lessonid]["filename"]+".tex" papertype = lessonid[0] consecutivenumbering = notes_dict["structures"][papertype]["consecutivenumbering"] - texdata = GenerateSingleLessonNotefromMariaDB(cursor = mycursor, id = lessonid,notesdict=notes_dict,templatepath="./模板文件/讲义模板.txt",outputfilepath = os.path.join(self.outputpath,filename),misc=configjson,consecutivenumbering = consecutivenumbering) + texdata = GenerateSingleLessonTeXfromDict(id=lessonid, notesdict=notes_dict, pro_dict=pro_dict, obj_dict=obj_dict,bn_dict=bn_dict,misc = configjson, consecutivenumbering= consecutivenumbering) papernames.append(notes_dict["notes"][lessonid]["id"]+" \\ "+notes_dict["notes"][lessonid]["name"]) print(f"已生成 {papernames[-1]} 文件") - multitexdata.append(re.findall(r"\\begin{center}\n{\\bf\\large \\papername}\n\\end{center}([\s\S]*\\end\{enumerate\})",texdata)[0]) - # print(lessonid) + multitexdata.append(texdata) + latex_raw = ReadTextFile("./模板文件/讲义模板.txt") + latex_raw = latex_raw.replace(r"学号\blank{50} \ 姓名\blank{80}","上海市控江中学") #替换掉模板中的姓名学号 + + if sys.platform == "darwin": #非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,(papernames[-1],texdata)) #替换标题和bodystring + outputfilepath = os.path.join(self.outputpath,filename) + SaveTextFile(latex_data,outputfilepath) #保存.tex文件 + + if configjson["编译单个文件"] == True: + outputdir,filename = os.path.split(outputfilepath) + print(f"{filename}编译中...") + if XeLaTeXCompile(outputdir,filename): + print("编译成功") + else: + print("编译失败") + # print(lessonid) # print(configjson) # print("\n".join(patterns)) mydb.close() @@ -166,7 +182,7 @@ class MyWindow_jysc(QWidget,Ui_Form): if __name__ == '__main__': app = QApplication([]) - windows = MyWindow() + windows = MyWindow_jysc("tikutest") windows.show() app.exec()