原文:
http://bbs.pep.com.cn/forum.php?mod=viewthread&tid=2512217
我都用过,不过,还是用 tikz 比较多,对付高中数学作图来说基本够用了。等有空的时候,写几个
用 tikz 作函数图像, 立体几何,算法流程图的例子吧。
(1)关于试卷纸张选择及页面设置
关于纸张的写上
\documentclass[10pt,a4paper]{ctexart}
上面的 10pt 是全篇正文的字号大小,只有 10, 11, 12 三种选择,个人建议使用 10。
好了,下面看页边距,一般设为 2cm, 只要写上
\usepackage[margin=2cm]{geometry}
这样,上下左右的边距都是 2cm,也可以分开指定right, top, ... ,也可以在此处
用 paperwidth 和 paperheight 指定纸张大小等。
\documentclass[10pt,a4paper]{ctexart}
上面的 10pt 是全篇正文的字号大小,只有 10, 11, 12 三种选择,个人建议使用 10。
好了,下面看页边距,一般设为 2cm, 只要写上
\usepackage[margin=2cm]{geometry}
这样,上下左右的边距都是 2cm,也可以分开指定right, top, ... ,也可以在此处
用 paperwidth 和 paperheight 指定纸张大小等。
(2) 试卷标题的设计
\begin{document}
\title{2012年某某中学高三数学测试题}
\author{总分:150分and 时间120分钟}
\date{命题人: 某某某}
\maketitle
\begin{document}
\title{2012年某某中学高三数学测试题}
\author{总分:150分and 时间120分钟}
\date{命题人: 某某某}
\maketitle
(3) 大题、小题题号的排版
高中数学试卷一般有三道大题、21道左右的小题。我开始排版大题的时候,就自己写了一个
计数器。后来发现,模式都是固定的,没有变化,可以直接写一、二、三就行了。
\begin{enumerate}
\item[一、] 选择题请把......
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item[二、] 填空题 ......
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item[三、] 解答题 ......
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\end{enumerate}
\end{document}
高中数学试卷一般有三道大题、21道左右的小题。我开始排版大题的时候,就自己写了一个
计数器。后来发现,模式都是固定的,没有变化,可以直接写一、二、三就行了。
\begin{enumerate}
\item[一、] 选择题请把......
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item 等下写选择题小题内容
\item[二、] 填空题 ......
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item 等下写填空题小题内容
\item[三、] 解答题 ......
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\item 等下写解答题小题内容
\end{enumerate}
\end{document}
(4) 选择题括号的排版
我们来想一想,这个括号应该怎样排版呢?
首先想到的是直接用括号( )。当然,直接这样写是不行的。当我们按照我前面说的
设计下来的话,第一道小题的 1. 后面可以排下 45 个中文汉字。 如果你的第一题的内容的最后一行
恰好有 43 个汉字的话,那么很不幸的是你将看到你的一半括号在上行,另一半在下行,这个不是你
希望的,怎么办呢?很简单,改为
\mbox{( )}
现在,你的一对儿括号肯定是出现在同一行了。但是,问题还没解决,你如果按照我写的排版
的话,你一定看到的是两个括号挨着的,就像 ( ) 一样。因为 LaTeX 是吃掉多余空格的。怎么办?
你可能会想到在中间加上 (~~~~)或者 (\qquad\qquad)等等。我开始也是这么想的,后来
发现这个办法不能使括号真正对齐(想想为什么? 具体原因等我有时间讲到 TeX 排版原理的时候,
可以来解释)。我的解决办法是
\mbox{(\hspace{1cm})}
我们一般希望在选择题的括号前面加上前导符,所以修改为
\dotfill\mbox{(\hspace{1cm})}
这样一般不会出问题了,你也会感觉比较漂亮,括号基本出现在右侧。但是,如果选择题的最后
一行恰好是 43-45 个汉字的话,你将看不到前导符,而且括号也跑到下一行的行首去了。所以,我们将
禁止在前导符的前面断行,修改为
\nolinebreak\dotfill\mbox{(\hspace{1cm})}
这样基本美观了,唯一的一个遗憾是,如果最后一行有42个汉字的话,你将看不到前导符,就是
文字后面紧跟括号。如果你不想出现这样的话,可以修改为
\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}{$\cdots$}(\hspace{1cm})}
最后,我们将它设定为一个自定义命令,放到 \begin{document} 之前
\newcommand{\xz}{\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}
{$\cdots$}(\hspace{1cm})}}
这样,以后你只需要在选择题的题干写完后加上 \xz, 就可以看到漂亮的前导符和括号了。如
果你还要修改的话,也可以改为
\newcommand{\xz}[1][1]{\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}
{$\cdots$}(\hspace{#1 cm})}\\ }
我为什么加两个 [1] ? 我在最后加了一个换行 \\, 千万注意后面的空格不能省略,想想,
为什么? 这两个问题留给大家自己思考吧。
我们来想一想,这个括号应该怎样排版呢?
首先想到的是直接用括号( )。当然,直接这样写是不行的。当我们按照我前面说的
设计下来的话,第一道小题的 1. 后面可以排下 45 个中文汉字。 如果你的第一题的内容的最后一行
恰好有 43 个汉字的话,那么很不幸的是你将看到你的一半括号在上行,另一半在下行,这个不是你
希望的,怎么办呢?很简单,改为
\mbox{( )}
现在,你的一对儿括号肯定是出现在同一行了。但是,问题还没解决,你如果按照我写的排版
的话,你一定看到的是两个括号挨着的,就像 ( ) 一样。因为 LaTeX 是吃掉多余空格的。怎么办?
你可能会想到在中间加上 (~~~~)或者 (\qquad\qquad)等等。我开始也是这么想的,后来
发现这个办法不能使括号真正对齐(想想为什么? 具体原因等我有时间讲到 TeX 排版原理的时候,
可以来解释)。我的解决办法是
\mbox{(\hspace{1cm})}
我们一般希望在选择题的括号前面加上前导符,所以修改为
\dotfill\mbox{(\hspace{1cm})}
这样一般不会出问题了,你也会感觉比较漂亮,括号基本出现在右侧。但是,如果选择题的最后
一行恰好是 43-45 个汉字的话,你将看不到前导符,而且括号也跑到下一行的行首去了。所以,我们将
禁止在前导符的前面断行,修改为
\nolinebreak\dotfill\mbox{(\hspace{1cm})}
这样基本美观了,唯一的一个遗憾是,如果最后一行有42个汉字的话,你将看不到前导符,就是
文字后面紧跟括号。如果你不想出现这样的话,可以修改为
\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}{$\cdots$}(\hspace{1cm})}
最后,我们将它设定为一个自定义命令,放到 \begin{document} 之前
\newcommand{\xz}{\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}
{$\cdots$}(\hspace{1cm})}}
这样,以后你只需要在选择题的题干写完后加上 \xz, 就可以看到漂亮的前导符和括号了。如
果你还要修改的话,也可以改为
\newcommand{\xz}[1][1]{\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}
{$\cdots$}(\hspace{#1 cm})}\\ }
我为什么加两个 [1] ? 我在最后加了一个换行 \\, 千万注意后面的空格不能省略,想想,
为什么? 这两个问题留给大家自己思考吧。
(5)选择题选项的排版
这个可能是整个试卷排版最难的一个地方了。敲的太累了,我就不写编写过程了。写下代码,大家
慢慢看吧。
首先在 \begin{document} 之前加上
\usepackage{ifthen}
\newlength{\la}
\newlength{\lb}
\newlength{\lc}
\newlength{\ld}
\newlength{\lhalf}
\newlength{\lquarter}
\newlength{\lmax}
\newcommand{\xx}[4]{\\[.5pt]%
\settowidth{\la}{A.~#1~~~}
\settowidth{\lb}{B.~#2~~~}
\settowidth{\lc}{C.~#3~~~}
\settowidth{\ld}{D.~#4~~~}
\ifthenelse{\lengthtest{\la > \lb}} {\setlength{\lmax}{\la}} {\setlength{\lmax}{\lb}}
\ifthenelse{\lengthtest{\lmax < \lc}} {\setlength{\lmax}{\lc}} {}
\ifthenelse{\lengthtest{\lmax < \ld}} {\setlength{\lmax}{\ld}} {}
\setlength{\lhalf}{0.5\linewidth}
\setlength{\lquarter}{0.25\linewidth}
\ifthenelse{\lengthtest{\lmax > \lhalf}} {\noindent{}A.~#1 \\ B.~#2 \\ C.~#3 \\ D.~#4 } {
\ifthenelse{\lengthtest{\lmax > \lquarter}} {\noindent\makebox[\lhalf][l]{A.~#1~~~}%
\makebox[\lhalf][l]{B.~#2~~~}%
\makebox[\lhalf][l]{C.~#3~~~}%
\makebox[\lhalf][l]{D.~#4~~~}}%
{\noindent\makebox[\lquarter][l]{A.~#1~~~}%
\makebox[\lquarter][l]{B.~#2~~~}%
\makebox[\lquarter][l]{C.~#3~~~}%
\makebox[\lquarter][l]{D.~#4~~~}}}}
当你排版选择题的时候,你只需输入
\xx{选项 A 的内容}{选项 B 的内容}{选项 C 的内容}{选项 D 的内容}
上面代码的意思是取四个选项的最长宽度,加上 “A.” 以及左右留空,作为选项的最长宽度。将
它和行宽的 1/2 以及 1/4 作比较, 来决定把 4 个选项排成一行、两行或者四行及以上。
这个可能是整个试卷排版最难的一个地方了。敲的太累了,我就不写编写过程了。写下代码,大家
慢慢看吧。
首先在 \begin{document} 之前加上
\usepackage{ifthen}
\newlength{\la}
\newlength{\lb}
\newlength{\lc}
\newlength{\ld}
\newlength{\lhalf}
\newlength{\lquarter}
\newlength{\lmax}
\newcommand{\xx}[4]{\\[.5pt]%
\settowidth{\la}{A.~#1~~~}
\settowidth{\lb}{B.~#2~~~}
\settowidth{\lc}{C.~#3~~~}
\settowidth{\ld}{D.~#4~~~}
\ifthenelse{\lengthtest{\la > \lb}} {\setlength{\lmax}{\la}} {\setlength{\lmax}{\lb}}
\ifthenelse{\lengthtest{\lmax < \lc}} {\setlength{\lmax}{\lc}} {}
\ifthenelse{\lengthtest{\lmax < \ld}} {\setlength{\lmax}{\ld}} {}
\setlength{\lhalf}{0.5\linewidth}
\setlength{\lquarter}{0.25\linewidth}
\ifthenelse{\lengthtest{\lmax > \lhalf}} {\noindent{}A.~#1 \\ B.~#2 \\ C.~#3 \\ D.~#4 } {
\ifthenelse{\lengthtest{\lmax > \lquarter}} {\noindent\makebox[\lhalf][l]{A.~#1~~~}%
\makebox[\lhalf][l]{B.~#2~~~}%
\makebox[\lhalf][l]{C.~#3~~~}%
\makebox[\lhalf][l]{D.~#4~~~}}%
{\noindent\makebox[\lquarter][l]{A.~#1~~~}%
\makebox[\lquarter][l]{B.~#2~~~}%
\makebox[\lquarter][l]{C.~#3~~~}%
\makebox[\lquarter][l]{D.~#4~~~}}}}
当你排版选择题的时候,你只需输入
\xx{选项 A 的内容}{选项 B 的内容}{选项 C 的内容}{选项 D 的内容}
上面代码的意思是取四个选项的最长宽度,加上 “A.” 以及左右留空,作为选项的最长宽度。将
它和行宽的 1/2 以及 1/4 作比较, 来决定把 4 个选项排成一行、两行或者四行及以上。
(6) 填空题横线的排版
这个比较简单,直接在 \begin{document} 之前加上
\newcommand{\tk}[1][2.5]{\,\underline{\mbox{\hspace{#1 cm}}}\,}
当编写到填空题的时候,加上 \tk 即可,可以加在一句话中间,也可以加到一句话末尾,当在
末尾的时候,可以在后面加上句号。
横线的默认长度是 2.5cm, 可以使用
\tk[3]
将横线改为 3cm。
这个比较简单,直接在 \begin{document} 之前加上
\newcommand{\tk}[1][2.5]{\,\underline{\mbox{\hspace{#1 cm}}}\,}
当编写到填空题的时候,加上 \tk 即可,可以加在一句话中间,也可以加到一句话末尾,当在
末尾的时候,可以在后面加上句号。
横线的默认长度是 2.5cm, 可以使用
\tk[3]
将横线改为 3cm。
(7) 插图的排版
这个说来就话长了,相关教程很多。象 Metapost, tikz, pstrics, asymptote,...
我都用过,不过,还是用 tikz 比较多,对付高中数学作图来说基本够用了。等有空的时候,写几个
用 tikz 作函数图像, 立体几何,算法流程图的例子吧。