这听起来可能很奇怪,但我想知道是否有一种干净的方法来做到这一点。
当我完成一个项目时,我将编写两个 .tex 文件:一个包含问题,另一个包含解决方案。出于同行评审的目的,我想知道是否有一种方法可供我使用,\include
以便如果每个问题和每个问题的解决方案仅跨越一页,则问题和解决方案将配对在一起,以便问题是第一个,解决方案是第二个。
除了手动复制/粘贴代码之外,还有其他方法(或更好的方法)可以做到这一点吗?
梅威瑟:
问题:
\documentclass[12pt]{article}
\usepackage[margin=2cm]{geometry}
\usepackage{enumitem}
\begin{document}
\begin{center}
\textbf{Mock Exam}
\end{center}
\begin{enumerate}
\item Here's a question.
\begin{enumerate}[label=(\Alph*)]
\item Option A
\item Option B
\item Option C
\item Option D
\item Option E
\end{enumerate}
\newpage
\item Here's another question.
\begin{enumerate}[label=(\Alph*)]
\item Option A
\item Option B
\item Option C
\item Option D
\item Option E
\end{enumerate}
\end{enumerate}
\end{document}
解决方案:
\documentclass[12pt]{article}
\usepackage[margin=2cm]{geometry}
\begin{document}
\begin{center}
\textbf{SOLUTION}
\end{center}
\begin{enumerate}
\item (A)
\vspace{0.2cm}
-Some stuff telling you why the answer is (A)-
\newpage
\item (C)
\vspace{0.2cm}
-Some stuff telling you why the answer is (C)-
\end{enumerate}
\end{document}
这是我过去为公司创建 MC 考试和解决方案的一般方法,而且现在项目还处于非常早期的阶段,因此我可以根据需要更改代码以使其正常工作。只是我发现将解决方案复制并粘贴到新文件中以供同行评审非常耗时。
答案1
尝试这个。
\documentclass{article}
\usepackage{enumitem}
\usepackage{amsmath}
\usepackage{filecontents}
\begin{document}
\begin{filecontents}{question-01}
What is an aardvark?\par
\end{filecontents}
\begin{filecontents}{answer-01}
\pagebreak
The aardvark Orycteropus afer is a medium-sized, burrowing, nocturnal mammal
\end{filecontents}
% questions and answers here
\input{question-01}
\input{answer-01}
\end{document}
我建议首先明确定义您的需求,先尝试使用主文件,然后使用宏和命名方案我会把考试的所有答案和问题保存在一个主要的文件如上所述。但是我建议将各个问题和答案保存在单独的文件中。这样您就可以随时混合搭配。将所有内容保存在一个目录中,并将目录命名为maths-exam-101-summer-14
。
请注意,您还可以将文件关联到\jobname
以下位置:
\begin{filecontents}{\jobname-01-answer}
\pagebreak
The aardvark Orycteropus afer is a medium-sized, burrowing, nocturnal mammal
\end{filecontents}
\input{question-01}
\input{\jobname-01-answer}
答案2
这是对我原来的解决方案的一次实质性的修改——有一些有趣的问题需要解决,所以即使有一个可以接受的答案,我也会发布它。
下面的 MWE 生成这些 pdf 作为输出:
这是源文件。
首先,测试,你必须编译两次才能获得正确的引用。
\documentclass{article}
\input{testpreamble}
%\toggletrue{showanswers} % this is the default
\togglefalse{showanswers}
\begin{document}
\testname{Mock Exam}
\begin{enumerate}
\item Compute $2 + 2$.
\begin{choices}
\item 1
\item 2
\item 3
\item 4 \correct{Count on your fingers.}
\item 5
\end{choices}
\item Compute $e^{i\pi}$.
\begin{choices}
\item $e$
\item -1
\correct{
There are several ways to go about proving that
\begin{equation*}
e^{i\pi} = -1
\end{equation*}
but for this exam just \emph{knowing} the answer gets full credit.
}
\item $\pi$
\item whatever
\end{choices}
\item What is the name of this test?
\begin{choices}
\item There is no way to tell
\end{choices}
\end{enumerate}
\end{document}
本文件answerkeymaster.tex
,提供答案:
\documentclass{article}
\begin{document}
\input{answerkey}
\end{document}
该机制全部隐藏在中testpreamble.tex
,对于所有测试来说都是相同的:
% testpreamble
%
\usepackage{enumitem}
\usepackage{amsmath}
\usepackage{etoolbox}
% decide whether answers appear in the test
\newtoggle{showanswers}
\toggletrue{showanswers}
% does the current question have an answer?
\newtoggle{hasanswer}
\togglefalse{hasanswer}
% file containing answer key is written
\newcommand{\answerkeyfilename}{answerkey}
\newwrite\answerkey
\immediate\openout\answerkey=\answerkeyfilename
\newcommand{\testname}[1]{%
\begin{center}
\textbf{#1}
\end{center}
\immediate\write\answerkey{%
\noexpand\begin{center}
\noexpand\textbf{#1}
\noexpand\par
Answer Key
\noexpand\end{center}
}}
% explanatory words that accompany each answer
\newcommand{\theexplanation}{}
\newcommand{\answer}{%
\iftoggle{hasanswer}{%
\immediate\write\answerkey{\noexpand\par\theenumi -- \ref{answer:\theenumi}}
\iftoggle{showanswers}{%
\par\emph{Answer}:
\ref{answer:\theenumi}
\theexplanation{}}
{} % don't show answers
}
{\immediate\write\answerkey{\noexpand\par\theenumi -- no answer}
\iftoggle{showanswers}{%
\par\emph{Answer}: none }
{} % don't show nonanswer
}
}
\newcommand{\correct}[1]{%
\toggletrue{hasanswer}
\label{answer:\theenumi}
\global\renewcommand{\theexplanation}{#1}
}
\newenvironment{choices}
{\begin{enumerate}[label=(\Alph*)]}
{\answer{}\end{enumerate}}
您可以通过在测试中实施一些@YiannisLazarides 命名约定来改善您的工作流程。