summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/jnuexam/jnuexam.tex
blob: e19f1416b60666d8f6f65910fc2dbcbe72fb1bfc (plain)
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
% -*- coding: utf-8 -*-
% !TEX program = xelatex

\documentclass[12pt]{beamer}

\usepackage[UTF8,noindent]{ctex}
\usepackage{arev}
\usefonttheme{professionalfonts}

\makeatletter

\providecommand{\beamer@endinputifotherversion}[1]{}

\ifxetex
  \setCJKsansfont{SimHei} % fix for ctex 2.0
  \setCJKmonofont{SimHei}
  \renewcommand\CJKfamilydefault{\CJKsfdefault}%
\else
  \@ifpackagelater{ctex}{2014/03/01}{}{\AtBeginDocument{\heiti}} %无效?
\fi

\makeatother

\renewcommand{\baselinestretch}{1} % ctex 2.4.1 开始为 1,之前为 1.3
\renewcommand{\arraystretch}{1.3}

\setlength{\parskip}{7pt plus 1pt minus 1pt}

\setbeamersize{text margin left=8mm,text margin right=8mm}

\setbeamercolor{normal text}{bg=gray!20}

\setbeamertemplate{frametitle}{\strut\insertframetitle\strut\par}
\setbeamertemplate{navigation symbols}{}

\newcommand{\cdotfill}{\leavevmode\xleaders\hbox to 0.5em{\hss$\cdot$\hss}\hfill\kern0pt\relax}

\usepackage{tabularx}

\newcommand{\ulinefill}[1]{\xleaders\hbox{\underline{\vphantom{#1}\kern1pt}}\hfill\kern0pt}
\newcommand{\fillbox}[1]{\ulinefill{#1}\underline{#1}\ulinefill{#1}}

\setbeamertemplate{title page}{%
  \renewcommand{\arraystretch}{2}%
  \usebeamerfont{title}
  \begin{tabularx}{\linewidth}{|X|}
    \hline
    模板名称:\fillbox{\usebeamercolor[fg]{title}\inserttitle} \\
    模板作者:\fillbox{\insertauthor} \\
    所在单位:\fillbox{\insertinstitute} \\
    更新日期:\fillbox{\the\year}年\fillbox{\the\month}月\fillbox{\the\day}日\\
    \hline
  \end{tabularx}%
}

\usepackage{ragged2e}

\justifying
\let\oldraggedright\raggedright
\let\raggedright\justifying

\usepackage{fancyvrb}

\newenvironment{framex}{\begin{frame}[fragile=singleslide,environment=framex]}{\end{frame}}

\DefineVerbatimEnvironment{code}{Verbatim}{%
  formatcom=\color{blue!50!red}%
}

\begin{document}

\title{暨南大学试卷 LaTeX 模板}
\author{吕\ 荐\ 瑞}
\institute{暨南大学数学系}

\begin{frame}[plain]
\titlepage
\end{frame}

\section{模板介绍}

\begin{framex}
\frametitle{简单介绍}
本文档介绍 \verb!jnuexam! 文档类。这个文档类提供暨南大学考试试卷的 LaTeX 模板。
\par
这个模板将格式和内容分开,而且可以从一份 \verb!tex! 文件编译出四份试卷(A卷 / B卷 / A卷答案 / B卷答案),使用方便。
\par
这个模板的最新版本可以在下面地址下载:\newline
 \color{blue}{\href{https://lvjr.bitbucket.io/jnuexam.html?\the\year}{\ttfamily https://lvjr.bitbucket.io/jnuexam.html}}
\end{framex}

\begin{framex}
\frametitle{编译方式}
这个文档类要求所有 \verb!tex! 文件都使用 \verb!UTF8! 编码,
若使用 \verb!GBK! 编码则无法得到正确结果。
\par
如果对文件编码不熟悉,可以直接复制例子文件,然后在其中修改,即可正常编译。
\par
这个文档类同时支持 \verb!XeLaTeX! 和 \verb!PDFLaTeX! 方式编译。为得到最好的中文显示效果,
推荐用较先进的 \verb!XeLaTeX! 编译。
\end{framex}

\section{试卷结构}

\begin{framex}
\frametitle{试卷结构}
下面是 \verb!jnuexam! 试卷文档的基本结构:
\begin{code}
\documentclass[chinese]{jnuexam}
% 导言区
\begin{document}
% 正文区
\end{document}
\end{code}
试卷包含中文和英文两种模板,必须在文档开头指明。\par
导言区用于设定装订线和草稿纸等等选项。\par
正文区用于填写试卷表头和输入试卷内容。
\end{framex}

\begin{framex}
\frametitle{装订草稿}
在文档的导言区可以设定装订线和草稿纸。比如:
\begin{code}
\SetExamOption{
  binding = 2, % 装订线
  scratch = 1, % 草稿纸
}
\end{code}
其中 \verb!binding! 取 0 表示没有装订线,
取 1 表示仅空白试卷有,取 2 表示空白试卷和试卷答案都有。\par
而 \verb!scratch! 的取值表示草稿纸数量,以 A3 大小双面印刷计算。
草稿纸仅在空白试卷中出现,试卷答案里不会带草稿纸。
\end{framex}

\begin{framex}
\frametitle{试卷正文}
\begin{code}
\documentclass{jnuexam}
\begin{document}
......
\examtitle{...} %生成试卷表头,见下页
......
\exampart{填空题}[题数分值]
......
\exampart{单选题}[题数分值]
......
\exampart{计算题}[题数分值]
......
\exampart{证明题}[题数分值]
......
\examdata{可能用到的数据} %附录数据
......
\end{document}
\end{code}
\end{framex}

\begin{framex}
\frametitle{试卷表头}
\begin{code}
\examtitle{
  niandu  = 2017--2018,
  xueqi   = 2,
  kecheng = 大学数学,
  zhuanye = 理工四学分,     % 可以为空白
  jiaoshi = {张三,李四},   % 教师姓名
  shijian = 2018年6月28日,
  bixiu   = 1,            % 1 为必修,0 为选修
  bijuan  = 1,            % 1 为闭卷,0 为开卷
  shijuan = A,            % A 或 B 或 C 卷
  neizhao = 1,            % 1 打勾,0 不勾
  waizhao = 0,            % 1 打勾,0 不勾
}
\end{code}
其中 \verb!zhuanye! 和 \verb!shijian! 选项的内容可以为空。
\end{framex}

\begin{framex}
\frametitle{评分表格}
在 \verb!\examtitle! 后面,可以用 \verb!\gradetable! 命令生成空白的评分表格。比如:
\begin{code}
\gradetable[total=6,strut=2em]
\end{code}
其中 \verb!\gradetable! 命令的各个参数含义如下:
\begin{description}
  \item[total] 表示试卷总共有多少部分,默认是 \verb!6!。
  \item[strut] 表示空白单元格的支架高度,默认是 \verb!2.5em!。
\end{description}
\end{framex}

\begin{framex}
\frametitle{判断题目}
\begin{code}
\exampart{判断题}[题数分值]

\begin{question}
第一道判断题描述。\tickout{t}
\end{question}

\begin{question}
第二道判断题描述。\tickout{f}
\end{question}
\end{code}
其中 \verb!\tickout{t}! 和 \verb!\tickout{f}!
分别表示打勾(\textcolor{blue}{$\checkmark$})和打叉(\textcolor{blue}{\large$\times$})。
还可用大写的 \verb!\tickout{T}! 和 \verb!\tickout{F}!,
分别表示输出 \textcolor{blue}{\textsf{T}} 和 \textcolor{blue}{\textsf{F}}。
\par
答案必须放在 \verb!\tickout! 命令里;这样才能在生成空白试卷时隐藏它。
\end{framex}

\begin{framex}
\frametitle{填空题目}
\begin{code}
\exampart{填空题}[题数分值]

\begin{question}
第一道填空题描述\fillout{答案}。
\end{question}

\begin{question}
第二道填空题描述\fillout{答案}。
\end{question}
\end{code}
\verb!\fillout! 命令将用下划线填满整行。另有个 \verb!\fillin! 命令,只留下最小宽度的下划线。
\par
答案必须放在 \verb!\fillout! 或 \verb!\fillin! 命令里面;这样才能在生成空白试卷时隐藏它。
\end{framex}

\begin{framex}
\frametitle{选择题目}
\begin{code}
\exampart{单选题}[题数分值]

\begin{question}
第一道单选题描述\pickout{答案}。
\end{question}

\begin{question}
第二道单选题描述\pickout{答案}。
\end{question}
\end{code}
\verb!\pickout! 命令将把选择圆括号放在本行最右边。另外有个 \verb!\pickin! 命令,将选择圆括号放在当前位置。
\par
答案必须放在 \verb!\pickout! 或 \verb!\pickin! 命令里面;这样才能在生成空白试卷时隐藏它。
\end{framex}

\begin{framex}
\frametitle{选项排版}
选择题的四个选项可以用 \verb!abcd! 环境来排版。比如:
\begin{code}
\begin{abcd}
  \item 第一个选项
  \item 第二个选项
  \item 第三个选项
  \item 第四个选项
\end{abcd}
\end{code}
此时 \verb!abcd! 环境将根据各选项长度自动将四个选项分为一行、两行或四行排版,非常方便。
\end{framex}


\begin{framex}
\frametitle{答题表格}
在填空题和选择题前面,还可以用 \verb!\answertable! 命令生成空白答题栏。比如:
\begin{code}
\answertable[total=6,column=3,strut=3em]
\end{code}
其中 \verb!\answertable! 命令的各个参数含义如下:
\begin{description}
  \item[total] 表示总共有多少个题目。
  \item[column] 表示每行排版几个题目。
  \item[strut] 表示空白单元格的高度,默认是 \verb!1em!。
  \item[notice] 表示答题表格前面提示文本的内容。
\end{description}
\end{framex}

\begin{framex}
\frametitle{计算题目}
\begin{code}
\exampart{计算题}[题数分值]

\begin{question}
第一道计算题描述。
\end{question}
\begin{solution}
第一道计算题答案。
\end{solution}

\begin{question}
第二道计算题描述。
\end{question}
\begin{solution}
第二道计算题答案。
\end{solution}
\end{code}
\end{framex}

\begin{framex}
\frametitle{证明题目}
\begin{code}
\exampart{证明题}[题数分值]

\begin{question}
第一道证明题描述。
\end{question}
\begin{solution}
第一道证明题答案。
\end{solution}

\begin{question}
第二道证明题描述。
\end{question}
\begin{solution}
第二道证明题答案。
\end{solution}
\end{code}
\end{framex}

\begin{framex}
\frametitle{解答名称}
通过重定义关键词的翻译,可以改变 \verb!solution! 环境的显示名称。
比如下面例子将“解”改为“证”:
\begin{code}
\SetExamTranslation{solution-Solution = 证}
\end{code}
\end{framex}

\begin{framex}
\frametitle{评分命令}
计算题和证明题等主观题的排版方法是完全一样的。在编写这些主观题的解答时,
可以用 \verb!\points! 命令给出各步骤得分。比如:
\begin{code}
\begin{solution}
$1+1=2$ \points{4}
$2+2=4$ \points{8}
\end{solution}
\end{code}
评分命令 \verb!\points! 也可在 \verb!align*! 等数学环境中使用,此时评分显示在公式编号位置。
\end{framex}

\begin{framex}
\frametitle{对齐命令}
此文档类提供几个对齐命令,用于在不同行之间对齐。比如
\vskip1em\hrule
我们有$(a+b)^2 = (a+b)(a+b)$ \par
\leavevmode\phantom{我们有$(a+b)^2$}${}= a^2 + 2ab + b^2$ \hfill$\cdots\cdots$ 2分
\vskip0.6em\hrule\vskip1em
\begin{code}
我们有$(a+b)^2 \? = (a+b)(a+b)$ \\
               \+$= a^2+2ab+b^2$ \points{2}
\end{code}
第一个公式内部的 \verb!\?! 保存当前水平位置,
而第二个公式前面的 \verb!\+! 表示跳到之前保存的位置。
\par
这两个对齐命令 \verb!\?! 和 \verb!\+! 需要编译两次才能生效。
\end{framex}

\begin{framex}
\frametitle{对齐命令}
此文档类提供几个对齐命令,用于在不同行的对齐。比如
\vskip1em\hrule
我们有$(a+b)^2 = (a+b)(a+b)$ \par
\leavevmode\phantom{我们\,}${}= a^2 + 2ab + b^2$ \hfill$\cdots\cdots$ 2分
\vskip0.6em\hrule\vskip1em
\begin{code}
我们有 \? $(a+b)^2 = (a+b)(a+b)$ \\
      \< $= a^2+2ab+b^2$ \points{2}
\end{code}
第一行公式前面的 \verb!\?! 保存当前水平位置,
而第二行公式前面的 \verb!\<! 表示跳到之前保存位置的左侧(左移一个等号的宽度)。
\par
这两个对齐命令 \verb!\?! 和 \verb!\<! 需要编译两次才能生效。
\end{framex}

\begin{framex}
\frametitle{其它题型}
除了上述四种题型之外,其它题型可以用下面方式编写:
\begin{code}
\exampart{某题型}[题数分值]

\begin{question}
第一题描述。\answer{第一题答案}
\end{question}

\begin{question}
第二题描述。\answer{第二题答案}
\end{question}
\end{code}
其中题目答案必须放在 \verb!\answer! 命令里面;这样才能在生成空白试卷时隐藏它。
\end{framex}

\begin{framex}
\frametitle{附录数据}
在试卷最后,可以用下面命令增加附录数据部分:
\begin{code}
\examdata{可能用到的数据} %附录数据
......
\end{code}
附录数据必须放在 \verb!\examdata! 命令后面;否则在从A卷生成B卷时会出问题。
\end{framex}

\section{模板选项}

\begin{framex}
\frametitle{空白试卷}
假设 \verb!exam-a-answer.tex! 是含答案的试卷。新建一个包含以下内容的 \verb!exam-a-blank.tex! 文档,
编译后将得到不含答案的空白试卷。
\begin{code}
\PassOptionsToClass{noanswer}{jnuexam}
\input{exam-a-answer}
\end{code}
也就是说,给 \verb!jnuexam! 文档类加上 \verb!noanswer! 选项后,编译时将会自动隐藏试卷答案。
\end{framex}

\begin{framex}
\frametitle{乱序出题}
假设 \verb!exam-a-answer.tex! 是含答案的A卷。新建一个包含以下内容的 \verb!exam-b-answer.tex! 文档,
编译后将得到乱序出题的B卷。
\begin{code}
\PassOptionsToClass{random}{jnuexam}
\input{exam-a-answer}
\end{code}
也就是说,给 \verb!jnuexam! 文档类加上 \verb!random! 选项后,编译时将会乱序排列各题型的小题。
\end{framex}

\begin{framex}
\frametitle{竖直空白}
在试卷的各个小题后面,可以留下一些竖直空白。本文档类支持下列这些竖直空白命令:\par
\renewcommand{\arraystretch}{1.3}%
\begin{tabularx}{\linewidth}{l<{\qquad}X}
  \hline
  \texttt{\string\smallskip} & 竖直小空白 \\
  \hline
  \texttt{\string\medskip} & 竖直中空白 \\
  \hline
  \texttt{\string\bigskip} & 竖直大空白 \\
  \hline
  \texttt{\string\vfill} & 竖直填充 \\
  \hline
\end{tabularx}\par
当然,竖直空白命令可以连续使用多个,以得到所需的空白。
\vfill
在试卷中可以使用分页命令 \verb!\newpage!,
\alert{不要}使用其他分页命令,比如 \verb!\clearpage! 等,
以免导致 B 卷格式错乱。
\end{framex}

\begin{framex}
\frametitle{双栏试卷}
假设 \verb!exam-a-blank.tex! 是原来试卷的 TeX 文件。新建一个包含以下内容的文档,
编译后将得到的 A3 纸张的试卷。
\begin{code}
\PassOptionsToClass{a3paper}{jnuexam}
\input{exam-a-blank}
\end{code}
也就是说,给 \verb!jnuexam! 文档类加上 \verb!a3paper! 选项后,编译时将会按照 A3 纸张排版出双栏试卷。
\end{framex}

\begin{framex}
\frametitle{双栏试卷}
假设 \verb!exam-a-blank.pdf! 是原来试卷的 PDF 文件。新建一个包含以下内容的文档,
编译后将得到的 A3 纸张的试卷。
\begin{code}
\documentclass[a3input]{jnuexam}
\begin{document}
\includepdf[pages=-,nup=2x1]{exam-a-blank}
\end{document}
\end{code}
%\includepdf[pages=-,nup=2x1,offset=0 0,delta=0 0]{exam-a-blank}
这种用法直接读入 A4 试卷的 PDF 文件,生成双栏的 A3 试卷,适合没有 TeX 文件时使用。
\end{framex}

\end{document}