使用LaTeX重制数学试卷

本文最后更新于 2026年10月2日 上午

写在前面

今天久违的更新一次博客,想把这一段时间用 LaTeX\LaTeX 制作数学试卷的经验分享出来

安装

TexLive

Windows版推荐使用TexLive,下载地址:https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/texlive.iso

对于Linux,可以使用包管理器直接下载TexLive,这里以Arch为例:

1
sudo pacman -S texlive

该texlive是一个软件包组,会下载TexLive中的内容。

exam-zh

对于卷子本体,我选择了exam-zh这个宏包来方便排版。项目地址:https://github.com/xkwxdyy/exam-zh

如果你使用的是上面的TexLive发行版,可以直接在终端中使用它自带的tlmgr这个宏包管理器安装exam-zh这个宏:

在Windows下,可以按下组合键Win+X,在弹出的选择框内选择“终端(管理员)”或“Windows Powershell(管理员)”,之后在出现的窗口中输入以下内容:

1
2
3
tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet/ #设置镜像源
tlmgr update --self #更新tlmgr
tlmgr install exam-zh #安装exam-zh

Linux使用的命令同上,但可能需要以root权限运行以上命令

更多关于exam-zh的内容可以参考官方仓库

配置

对于 LaTeX\LaTeX 文本编辑器,我选择了 Visual Studio Code

在VSCode中安装LaTeX Workshow,LaTex等插件,更详细的教程可以参考这个,在这里就不过多叙述了

值得注意的是这个exam-zh强制要求使用 XeLaTeX 作为编译器,然而上面的插件默认使用pdflatex构建,于是我们需要按下Ctrl+Shift+P,然后搜索Preferences: Open User Settings来打开VSCode的设置页面

之后在设置页面内搜索recipe,将搜索结果中的Latex-workshop › Latex › Recipe: Default下的内容从first改为latexmk (xelatex)

这样你就可以享受到每次保存/切换窗口的时候自动构建了,构建出的内容应当是和.tex文件同目录,同名称的.pdf文件

试卷

文字内容

拼好题

如果你想要干的是拼好题的话,试卷中的文字内容,我十分建议使用带有识图功能的DeepSeek,豆包等AI直接通过卷子图片转成LaTeX文字内容

就让AI直接按下面的格式生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
\documentclass[fontset=fandol]{exam-zh}
\usepackage{unicode-math,microtype,esvect,xeCJK}
\examsetup{
question/show-answer = false,
fillin/no-answer-type = none,
title/title-format=\bfseries \LARGE,
%page/size = a3paper, % 使用横版样式
}

\hfuzz=5pt

\begin{document}

\title{训练}
\maketitle

\section{选择题}
\begin{question}
已知空间向量 $\symbfit{a}=(\sqrt{3},0,1),\symbfit{b}=\left(\dfrac14,0,\dfrac{\sqrt{3}}4\right)$,则 $\symbfit{a}$ 在 $\symbfit{b}$ 上的投影向量的模为
\begin{choices}
\item $\sqrt{3}$
\item $1$
\item $2$
\item $\dfrac12$
\end{choices}
\end{question}

\section{多选题}
\begin{question}
已知直线 $l:2x-y+4=0$,则下列说法正确的是
\begin{choices}
\item $l$ 在 $x$ 轴上的截距为 $2$
\item $l$ 与直线 $x+2y+4=0$ 垂直
\item $l$ 与直线 $2x-y-1=0$ 之间的距离为 $\sqrt{5}$
\item $l$ 与圆 $x^2+y^2=4$ 相离
\end{choices}
\end{question}

\section{填空题}
\begin{question}
已知两直线 $3x+y-3=0$ 与 $3x+y-1=0$ 之间的距离为 \fillin.
\end{question}

\section{解答题}
\begin{problem}[points = 15]
求满足下列条件的直线方程:
\begin{enumerate}
\item 过点 $(1,2)$,且与直线 $3x-2y+3=0$ 平行的直线方程;
\item 过点 $(-1,2)$,且与直线 $3x-y+2=0$ 垂直的直线方程;
\item 过点 $(1,-2)$,且在两坐标轴上截距相等的直线方程.
\end{enumerate}
\vspace{3cm}
\end{problem}
\end{document}

这样生成出来的试卷还是比较赏心悦目的,只有题,没有其他很复杂的内容

如果更想要带主标题,科目,注意事项等的高考试卷对应的样式的卷子的话可以看这个模板

图片内容

对于立体几何,找到一个趁手的工具还是很困难的,你总不能说你爱对着TikZ搓吧(

那么我们就可以使用InkScape这个矢量画图工具

首先我们可以把照片中的几何图形(或者你在geogebra中绘制好的,调好透视的3d图形)复制到画布中

接着创建新图层,将原来的图片锁定,在新图层中把线,点,标签什么的都描一遍

这个工具的吸附功能还是比较好用的,可以在右上角开启

具体怎么用,我可能会出一期视频,或者你也可以找找其他的教程

画完之后隐藏原来只含有源图片的图层,然后Ctrl+A全选,Ctrl+Shift+D打开画布控制菜单,最后点击缩放内容到画布右边的按钮就可以限制尺寸了

我推荐内容保存成默认的InkScape SVG便于之后的更改,但是想要插入 LaTeX\LaTeX 文档里面的话这个格式肯定是不方便的,于是我们就要在左上角的文件>保存副本中手动保存成.pdf格式,这样更方便使用

图文混编

那接下来要做的就是把图片和文字混编起来了,常见的有下面几种形式

图文并列

wrapstuff

wrapstuff是嵌入到exam-zh内的功能,混编之后就像这样:

wrapstuff

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
\begin{question}
\begin{wrapstuff}[r]
\includegraphics[width=0.35\linewidth]{img/p10-1.pdf}
\end{wrapstuff}
如图,平行六面体 $ABCD-A_1B_1C_1D_1$ 的所有棱长均为 $1$,且 $\angle BAD=60^\circ,\angle A_1AB=120^\circ,\angle A_1AD=90^\circ$,记 $\vv{AB}=\symbfit{a},\vv{AD}=\symbfit{b},\vv{AA_1}=\symbfit{c}$,则下列说法正确的是
\begin{choices}
\item $\vv{BD_1}=\symbfit{b}+\symbfit{c}-\symbfit{a}$
\item $|\vv{BD_1}|=\sqrt{3}$
\item $\vv{AC_1}\perp \vv{A_1D}$
\item 直线 $BD_1$ 与 $A_1D$ 所成角的余弦值为 $\dfrac{\sqrt{6}}6$
\end{choices}
\end{question}

其中的width=0.35\linewidth的意思是占这一行的35%,嫌大嫌小都可以调

但是这个方法有较大的局限性,比如在大题里用很可能会让排版爆掉,于是就有了下面这个灵活性更高的方法

minipage

minipage是 LaTeX\LaTeX 中自带的宏,效果如下:

minipage

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
\begin{problem}[points = 13]
如图,在平行六面体 $ABCD-A_1B_1C_1D_1$ 中,$M$ 为 $AC$ 与 $BD$ 的交点,$N$ 为 $BB_1$ 的靠近 $B$ 的三等分点,若 $\vv{A_1B_1}=\symbfit{a},\vv{A_1D_1}=\symbfit{b},\vv{A_1A}=\symbfit{c}$.
\par\noindent
\begin{minipage}[t]{0.7\linewidth}
\begin{enumerate}
\item 用 $\symbfit{a},\symbfit{b},\symbfit{c}$ 表示 $\vv{A_1C},\vv{NM}$ 向量;
\item 若 $\angle B_1A_1D_1=\angle B_1A_1A=\angle D_1A_1A=\dfrac{\pi}{3}$,$|\vv{A_1B_1}|=|\vv{A_1D_1}|=|\vv{A_1A}|=2$,计算 $\vv{A_1C}\cdot\vv{NM}$.
\end{enumerate}
\vspace{3cm}
\end{minipage}
\hfill
\begin{minipage}[t]{0.3\linewidth}
\vspace{0pt}
\includegraphics[width=\linewidth]{img/p15-1.pdf}
\end{minipage}
\end{problem}

这个[t]代表顶部对齐,写上可以让小题与题干之间的距离看起来更赏心悦目

然而下面的这个\vspace{0pt}如果去掉就会让整个排版很诡异的崩溃

上面的\vspace{3cm}可以自己改动。如果这个题比较难写,需要留空比较多的话可以把数字写大一点

这里的\includegraphics[width=\linewidth]指的就是minipage中的宽度了,如果想调文字和图片的占比的话就要调整\begin{minipage}后面的数字了。注意相加需要不大于1(多了会超出边距),可以小于1(适用于想让文字与图片空隙大一点的情况)

图文分排

center & flushright/left

center,flushright,flushleft同样是 LaTeX\LaTeX 自带的宏,我们以center为例,效果如下:

center

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
\begin{question}
如图,在棱长为 $1$ 的正方体 $ABCD-A_1B_1C_1D_1$ 中,$E,F$ 分别是 $AB,AD$ 的中点,$M$ 为线段 $C_1D_1$ 上的动点,则下列说法正确的是
\begin{center}
\includegraphics[width=0.3\linewidth]{img/p11-1.pdf}
\end{center}
\begin{choices}
\item 三棱锥 $M-A_1EF$ 的体积为定值
\item 不存在点 $M$,使得 $EF\perp ME$
\item 平面 $MEF$ 与平面 $ABCD$ 所成角的正切值的最大值为 $2\sqrt{2}$
\item $\vv{D_1M}=\dfrac12\vv{D_1C_1}$ 时,平面 $MEF$ 截该正方体的外接球所得截面的面积为 $3\pi$
\end{choices}
\end{question}

其中的\begin{center}可以换成\begin{flushright},\begin{flushleft}等,效果为靠右或者靠左

textfigure

textfigure是exam-zh内置的一个宏,效果和flushright有点像,只不过好像会引入额外的间隔,效果如下:

textfigure

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{question}
\textfigure{
如图,一个结晶体的形状为平行六面体$ABCD-A_1B_1C_1D_1$,其中,以顶点$A$为端点的三条棱长都相等,且它们彼此的夹角都是$60^\circ$,下列说法中正确的是
}{
\includegraphics[width=0.3\linewidth]{img/image10.png}
}
\begin{choices}
\item $(\vv{AA_1}+\vv{AB}+\vv{AD})^2=2\vv{AC}^2$
\item $\vv{AC_1}\cdot(\vv{AB}−\vv{AD})=0$
\item 向量$\vv{B_1C}$与$\vv{AA_1}$的夹角是$60^\circ$
\item $\vv{BD_1}$与$\vv{AC}$所成角的余弦值为$\dfrac{\sqrt{6}}{3}$
\end{choices}
\end{question}

AI说这个在大题中可能会有问题,需要注意一下,尽量还是用minipage或者flushright比较好吧(其实我也不清楚QwQ)

多图并排

multifigures是exam-zh内置的一个宏,可以实现多个图片的横向/纵向并排,效果如下:

multifigures-vertical

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{problem}[points = 17]
如图①所示,在$Rt\triangle{ABC}$中,$\angle{C}=90°,BC=3,AC=6$,$D,E$分别是$AC,AB$上的点,
且$DE\parallel{BC},DE=2$,将$\triangle{ADE}$沿$DE$折起到$\triangle{A_1DE}$的位置,使$A_1C\perp{CD}$,如图②所示.
\begin{enumerate}
\item 求证:$A_1C\perp$平面$BCDE$;
\item 若$M$是$A_1D$的中点,求直线$CM$与平面$A_1BE$所成角的大小;
\item 线段$BC$上是否存在点$P$,使平面$A_1DP$与平面$A_1BE$垂直?并说明理由.
\end{enumerate}
\begin{multifigures}[columns=1, xshift=0.75\linewidth]
\item[图①] \includegraphics[width=0.4\linewidth]{img/image19-1.png}
\item[图②] \includegraphics[width=0.4\linewidth]{img/image19-2.png}
\end{multifigures}
\end{problem}

这里面的xshift=0.75\linewidth指的是图片向右偏移到0.75列宽的位置,比较适合大题

其中把columns=1改成其他的数值,比如columns=2就可以有横向编排的效果,比如:

multifigures-horizonal

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
\begin{question}
如图,在空间四边形$ABCD$中,$AC$和$BD$为对角线,$G$为$\triangle{ABC}$的重心,$E$是$BD$上一点,$BE=3ED$,以$\{\vv{AB},\vv{AC},\vv{AD}\}$为基底,则$\vv{GE}=$ \fillin
\end{question}

\begin{question}
如图,在直三棱柱$ABC-A_1B_1C_1$中,$\angle{ABC}=90^\circ$,$AB=BC=AA_1=2$,点$D$是$AC$的中点,则异面直线$A_1D$和$B_1C$所成角的大小为 \fillin
\end{question}

\begin{multifigures}[columns = 2, column-gap=2cm]
\item[13题图] \includegraphics[width=0.4\linewidth]{img/image13.png}
\item[14题图] \includegraphics[width=0.4\linewidth]{img/image14.png}
\end{multifigures}

其中的column-gap=2cm指的是两张图片之间的间距,可以变大也可以变小

横向的比较适用于填空题,选择题的多张图片挤在一起

导出

做完这这一切就可以导出了。其实在每次按下保存的时候,VSCode中的插件就会自动为我们编译好,不过为了防止未定义行为(究竟在未定义些什么。。。),我们可以手动编译一下:

1
xelatex paper.tex

其中的paper.tex为你的tex文件的文件名,还是尽量不要用中文比较好,可能会引发其他很难定位的问题

如果想要A3大小的横排,就在我刚开始给出的模板中取消page/size = a3paper那一行前面的%符号(这个符号代表 LaTeX\LaTeX 中的注释)

享受你的试卷吧

结语

这篇文章是我在做了这几次粘贴来的试卷的数字化(迫真)后总结出来的,可能会有照顾不到的地方,也可能有一些更好的但是我不知道的解决方法,恳请看到这个文章的各位大佬发现问题后点明,谢谢大家!


使用LaTeX重制数学试卷
https://blog.mailset.top/使用LaTeX重制数学试卷/
作者
mail_set
发布于
2026年10月2日
许可协议