为了编写问题表,我有一个自定义的定理环境,用于pr
问题,还有一个特殊注释,用于solution
解决方案。见下面的例子。现在我的问题是,是否有可能得到自动地下列:
第一页:没有解决方案的问题表
下一页:每个问题下方都有解决方案的问题表
我强烈倾向于不使用特殊文档类的解决方案exam
。
\documentclass[a4paper, 11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{amsmath} %
\usepackage{nccmath}
\usepackage{amsfonts} %
\usepackage{enumerate}
\usepackage[amsmath]{ntheorem}%
\makeatletter
\newtheoremstyle{mystyle}%
{\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont%
##1\ ##2\theorem@separator}\hbox{\strut}}}]}%}
{\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\theorem@separator]%
\hfill{\normalfont(##3)}\newline}
\theorembodyfont{\normalfont}
\theoremindent0cm
\makeatother
\theoremstyle{mystyle}
\newtheorem{pr}{Problem}
\usepackage{comment}
\specialcomment{solution}{\noindent\small Solution: }{\\\normalfont \normalsize}
%\excludecomment{solution}
\begin{document}
\begin{pr}
Problem
\end{pr}
\begin{solution}
Solution
\end{solution}
\begin{pr}
Problem
\end{pr}
\begin{solution}
Solution
\end{solution}
\end{document}
答案1
您可以存储pr
和solution
环境的内容,并在第一次传递时仅打印前者。然后,您可以自动打印存储的文本。以下是方法:
\documentclass[a4paper, 11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{amsmath} %
\usepackage{nccmath}
\usepackage{amsfonts} %
\usepackage{enumerate}
\usepackage[amsmath]{ntheorem}%
\makeatletter
\newtheoremstyle{mystyle}%
{\item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont%
##1\ ##2\theorem@separator}\hbox{\strut}}}]}%}
{\item[\hskip\labelsep \theorem@headerfont ##1\ ##2\theorem@separator]%
\hfill{\normalfont(##3)}\newline}
\theorembodyfont{\normalfont}
\theoremindent0cm
\makeatother
\theoremstyle{mystyle}
\newtheorem{prinn}{Problem}
\newenvironment{solinn}
{\noindent\small Solution: \ignorespaces}{\par\addvspace{\medskipamount}}
\usepackage{environ}
\newtoks\prsoltoks
\NewEnviron{pr}[1][]{%
\global\prsoltoks=\expandafter{\the\prsoltoks\prinn}%
\if\relax\detokenize{#1}\relax\else
\global\prsoltoks=\expandafter{\the\prsoltoks[#1]}%
\fi
\global\prsoltoks=\expandafter{\the\expandafter\prsoltoks\BODY\endprinn}%
\showthe\prsoltoks
\expandafter\prinn\if\relax\detokenize{#1}\relax\else[#1]\fi\BODY\endprinn
}
\NewEnviron{solution}{%
\global\prsoltoks=\expandafter{\the\prsoltoks\begin{solinn}}%
\global\prsoltoks=\expandafter{\the\expandafter\prsoltoks\BODY\end{solinn}}%
}
\AtEndDocument{\clearpage\begin{center}\Large Solutions\end{center}
\setcounter{prinn}{0}\the\prsoltoks}
\begin{document}
\begin{center}\Large Problems\end{center}
\begin{pr}[2 points]
Problem
\end{pr}
\begin{solution}
Solution
\end{solution}
\begin{pr}
Problem
\end{pr}
\begin{solution}
Solution
\end{solution}
\end{document}
该environ
包非常有用,因为它收集环境的内容并允许通过将其存储在宏中来执行所需的操作\BODY
。每次pr
出现环境时,其内容都会存储在令牌寄存器中\prsoltoks
,前后依次为\begin{prinn}
和\end{prinn}
;对于也是如此solution
,但问题也会被打印出来。
注意我是如何实现自动打印的,通过挂接到\AtEndDocument
:现在解决方案也将被打印。
还要注意环境的不同定义solution
(在内部是solinn
,但从用户的角度来看无关紧要):每当环境将文本放在开头时,其“开始部分”应以 结尾\ignorespaces
。为了获得垂直空间,最好使用\par\medskip
或甚至
\par\addvspace{\medskipamount}
使用您喜欢的任何跳过方式,例如\addvspace{\bigskipamount}
或\addvspace{3cm}
。
答案2
在我开发解决方案的过程中,egreg 回答了 :-(——但是我会展示我的方法。
\documentclass[a4paper, 11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{amsmath} %
\usepackage{nccmath}
\usepackage{amsfonts} %
\usepackage{enumerate}
\usepackage[amsmath]{ntheorem}%
\usepackage{storebox}
\newcounter{problemcount}
\newsavebox\problembox
\newsavebox\solutionbox
\newenvironment{pr}{%
\refstepcounter{problemcount}
\global\setbox\problembox\vbox\bgroup%
\trivlist\item\relax%
\subsubsection*{Problem~\theproblemcount}%
}{\endtrivlist\egroup%
\copy\problembox%
}
\newenvironment{solution}{%
\global\setbox\solutionbox\vbox\bgroup
\trivlist\item\relax%
\textit{Solution:}~\ignorespaces
}{\endtrivlist\egroup%
\clearpage
\box\problembox
\box\solutionbox
\clearpage
}
\begin{document}
\begin{pr}
Problem
\end{pr}
\begin{solution}
Solution
\end{solution}
\begin{pr}
Problem
\end{pr}
\begin{solution}
Solution
\end{solution}
\end{document}