食用指南:使用python 语言实现了latex纯文本自动化编排
一、需求描述😗
工作原因,需要制作一张含有100多道选择题试卷。
为了排版美观,我找了份LaTeX选择题模板,
手动输入每一道过于麻烦,便找到了对应的自动化模块
最让人尴尬的事情发生了,我发现编辑器自带替换的功能,
而且支持正则表达式
二、解决方案✅
1. 内容处理
(1)文本答案挖除
将几页问卷复制txt文本文件中,为了把这些正确答案挖除,直接使用正则表式的替换
2. 排版处理
(1)模板在本地miktex中的编译
为了实现这一步,主要注意三点.
- 安装miktex选择为所有用户安装
(确保软件能够启动,更新,旧版本有一些要命的bug) - 使用xelatex编译
(为了能正常编译一些宏包) - 使用ctex宏包中的ctexart文档类
(未了正确显示中文,确保已安装ctex宏包,安装可参考缺少lastpage宏包处理办法)
(2)模板的源代码分析
3.文本与latex的交互
把每一个题目看做是一个基本单元,对这个基本单元进行函数封装
然后调用100次函数就可以实现整篇文稿的写作。
三、遇到的bug🤣
1. LaTeX出现问题
将LaTeX选择题模板复制到TeXworks过程中,出现了如下报错。
重现安装,记得选择为所有用户
通配符使用问题
通过参考这篇博客的方法如下:
我完美的解决了这个问题
环境问题
[已解决] LaTeX中的enumerate环境出现overfull box的情况
四、奇技淫巧❎
##(一)复制到WPS处理(word也是一样的,支持正版国产)
##(二)使用word的替换序列
使用通配符替换
1.题号替换(先两位数替换,再替换一位数:至于为什么不一次性替换完,应为我不会😅)
先看通配符的内容:^#表示任意数字,不要忘记后面的“、”,不然可能会匹配到题干中的数字
^#^#、
我想把序列直接换成latex中的item命令,因为\item命令可以自动生成有序列,下面是latex的源码,对照着来看,很容易理解,替换的目标
但是悲伤的是直接替换会报错的,
所以我改进了一下
下面是我第五次替换了,} 必须要有因为如果导入latex中,D选后面你会发现没办替换口号了,难道要手动一个个添加吗,后来我发现可以换序号,只要手动删掉第一个,给最后一个添加有括号就行了。^p换行符号,不加也可以,或者跟着自己需求多加几个。是为了让我的latex源码更加易读。(latex的源码里面,分段等于换行,应为编译器要吃掉一个空行才知道一行完结)^092的原因不说了,~是用来当空格使用的,在latex中,不然\item与后面的中文之间没有间隔,会出现无法识别命令的情况
^#^#、
}^p^092item~
##(三)题干答案挖空
直接使用
( )
进行选择括号
替换成
~^092underline{~~~~~~~~}
##(四)A选项替换为命令
这个命令决定了选择题我是排成一行,还是两行,还是四行。
由于选项大部分较短,处于减少手动修改的目的,选择单行命令,
在这里插入图片描述
当让修改完不要编译,肯定不过的,应为有一些个选项只有ABC没有D, 我参考写的单行函数比较菜,做不到自适应三个选项的。
^#^#、
}^p^092item~
##(五)B,CD选型替换成对应的括号}{
^$表示任意的字母
这个就是最令人尴尬的事情了
其他参考文献😎
-
AttributeError: module ‘scipy.sparse’ has no attribute ‘coo_array’
-
使用networkx画图时,报错:AttributeError: module ‘scipy.sparse’ has no attribute ‘coo_array’
补充的两步走😎
最小可以运行的方案
\documentclass{ctexart}%
\usepackage{lineno,hyperref}
\usepackage{colortbl}
\usepackage{amsmath,amssymb,amsfonts}
\usepackage{algorithmic}
\usepackage{graphicx}
\usepackage{float}
\usepackage[T1]{fontenc}%
\usepackage[utf8]{inputenc}%
\usepackage{lmodern}%
\usepackage{textcomp}%
\usepackage{ctex}
\usepackage{enumerate}
\usepackage{geometry}
\geometry{a4paper,left=2cm,right=2cm,top=2cm,bottom=2cm}
\newcommand{\twolines}[4]{\\\begin{tabular}{*{2}{@{}p{8cm}}}(A)~#1 & (B)~#2\end{tabular}\\
\begin{tabular}{*{2}{@{}p{8cm}}}(C)~#3 &(D)~#4\end{tabular}} %两行四个
\newcommand{\twolinesT}[3]{\\\begin{tabular}{*{2}{@{}p{8cm}}}(A)~#1 & (B)~#2\end{tabular}\\
\begin{tabular}{*{2}{@{}p{8cm}}}(C)~#3\end{tabular}} %两行四个
\newcommand{\fourlines}[4]{\\(A)~#1 \\ (B)~#2 \\ (C)~#3 \\ (D)~#4} %
\newcommand{\fourlinesT}[3]{\\(A)~#1 \\ (B)~#2 \\ (C)~#3} % 3行每行1个
%===========================================
\begin{document}
\par
\section{单项选择题(共90题)}
\begin{enumerate}
\item 食品生产经营者在采购食品原料时,除需要查验供货者的许可证外,还应查验~\underline{~~~~~~~~}
\twolines{产品合格证明文件 }{健康证明}{培训证明 }{法人授权委托书}
\end{enumerate}
\section{多项选择题(共10题)}
\begin{enumerate}
\item~进口的食品添加剂应当有~\underline{~~~~~~~~}。
\twolines{出口国标识}{中文标签}{中文说明书}{英文说明}
\item~在食品安全事故调查中,任何单位或者个人不得对食品安全事故~\underline{~~~~~~~~},不得毁灭有关证据。
\twolines{隐瞒}{谎报}{向媒体报道}{缓报}
\end{enumerate}
\end{document}
第二部:使用替换功能
这样直接挖空也是可以的
我的括号是全角的,但是部分大小写,个数无所谓
……092underline{~~~~~~~}
(*)