我有一套数学试卷需要用 TeX 编写,并根据其主题进行分组,例如抽象代数、实分析、微分方程等。可以实现以下操作吗?
按照试卷中问题的出现顺序输入试卷中出现的问题,并根据问题的主题给每个问题添加一些标签。在输出中,所有试卷中关于同一主题的问题都排列在一起。
答案1
可能有更好的方法来处理这个问题,但我对我的 LaTeX 书中的练习答案做了类似的事情,通过构建包中可用的扩展,verbatim
我可以将问题和答案放在一起,即使答案会打印在每章末尾的单独部分中。
这是我使用的代码(这些都在文件中,.cls
因此用作@
字母)。我将对清单进行注释,使事情更清楚
首先创建一个新的写入(每个类别都需要一个,但请记住,只有 16 个可用的写入流,并且 LaTeX 自己使用其中的一些)。
\newwrite\ans@out
\immediate\openout\ans@out=\jobname.ans
定义答案环境这是基于包verbatimwrite
中的示例环境verbatim
文档. 以 开头的行\immediate\write
用于添加输入文件之外的附加文本。
\def\answer{%
\@bsphack
\let\do\@makeother\dospecials
\immediate\write\ans@out{\string\preans}
\immediate\write\ans@out{\string\par\string\noindent
{\string\sc\space Exercise\string~\thequestion.}\quad}%
\immediate\write\ans@out{\string\vadjust{\string\nobreak}\relax}
\catcode`\^^M\active
\def\verbatim@processline{%
\immediate\write\ans@out
{\the\verbatim@line}}%
\verbatim@start}
\def\endanswer{%
\immediate\write\ans@out{}
\@esphack}
这是我用来格式化答案的宏之一。实际上,我对中间生成的输出标记的丑陋程度感到有点尴尬。
\def\preans{\if@nobreak\global\@nobreakfalse\else\bigfilbreak\fi}
定义一个命令来实际打印答案我们关闭写入然后读取我们重新写入的文件。
\def\printanswers{\immediate\closeout\ans@out
\@input{\jobname.ans}
}
排版宏问题这些不太有趣,并且仅仅为了完整性而出现在这里。
\newcounter{question}[chapter]
\def\thequestion{\thechapter-\arabic{question}}
\def\question{\par\refstepcounter{question}\noindent
{\sc Exercise \thequestion.}
\ignorespaces}
\def\endquestion{\par}
完成所有这些定义后,我们就可以在输入文件中执行如下操作:
\begin{question}
What \LaTeX\ commands would you type at the beginning of the input file for
an article which had the title ``Birds \& Bees of North
America,'' was written by ``Dr.~H.T. Jones'' and had today's date
printed for the date field?
\end{question}
\begin{answer}
\begin{verbatim}
\documentclass{article}
\title{Birds \& Bees of North America}
\author{Dr.~H.T. Jones}
\begin{document}
\maketitle
...
\end{verbatim}
Note that \& is input as \verb+\&+ and a \verb+~+ is used after
``Dr.''\ to prevent an end-of-sentence space from being printed
there (a \verb*+\ + could have been used as well). Today's date
was supplied by omitting the date field.
\end{answer}
产生question
在和answer
环境出现的地方命令出现的位置\printanswers
。
在您的情况下,您需要模拟answers
每个类别的环境,然后使用\printallofit
命令或类似命令关闭并重新读取所有生成的输入文件。
答案2
biblatex
plusoscola
可以满足您的需求,但学习难度较高。每个问题都将被定义为 biblatex 项目,并使用关键字字段来定义问题的主题类别。 oscola
具有为每个主题构建单独表格的工具。
或者,如果这是一项一次性任务,我可能会这样做:将所有问题放在一个纯文本文件中,每行一个问题;在每个问题前面加上前缀,其中每个\item \vphantom{\hphantom{keyword}}
主题keyword
用关键字替换;grep 文件将某个主题的所有问题发送到他们自己的文件中,然后将这些输出文件包含在主 LaTeX 文档中。