% -*- 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}
