我目前正在编写一份 LaTeX 文档,其中有一些问题(在环境中创建{theorem}
),供读者阅读。我想把这些问题的解决方案放在文档的末尾。当然,我可以在最后添加另一个名为“解决方案”的章节,并将它们写在那里。但是,由于问题很可能被重新排序,并且会添加新的问题,我必须手动更改解决方案的顺序,这可能会相当麻烦。我想知道是否可以在文档的某个部分编写 LaTeX 代码,然后将其出现在最终文档的不同部分。理想情况下,我想写一些类似的东西
\begin{problem} \label{someProblem}
Here is some problem.
\end{problem}
\addTextToTheSolutionsChapter{
Solution to problem \ref{someProblem}
}
它将问题排版到正确的位置,并将括号中的文本附加到后面的部分。
答案1
当我读到这个问题时,我首先想到了一个外部文件,这在某种程度上是一种标准解决方案。但是,使用您提出的宏设计,这不是必需的。一个可能的(可能是最简单但不是最快的——参见@egreg 的答案)实现与一个小测试可以像这样:
\documentclass{book}
\usepackage{amsmath,amsthm}
\newtheorem{problem}{Problem}[chapter]
\makeatletter
\def\solutionsname{Solutions}
\let\@sol=\@empty
\newcommand{\printsolutions}[1][chapter]{\@nameuse{#1}{\solutionsname}\@sol}
\newcommand{\addtosolutions}[1]{%
\protected@xdef\@sol{%
\@sol {\noindent\bfseries\theproblem}\space#1\par\vskip 1em plus 4pt minus 4pt\par
}%
}
\makeatother
\begin{document}
\chapter{Groups}
\begin{problem}
Let $(G,\circ)$ be a finite group and $g\in G$. Prove that the order of $g$ divides the cardinality of $G$.
\addtosolutions{%
Because $G$ is finite there is $\operatorname{ord}_G(g)=:m<\infty$. Hence, there exists a cyclic subgroup $U_g=\lbrace e,g,g^2,\ldots,g^{m-1}\rbrace$. Obviously $\lvert U_g\rvert=m=\operatorname{ord}_G(g)$ holds. Therefore the claim follows from Lagrange theorem.
}
\end{problem}
\begin{problem}
Let $(G,\circ)$ be a group. Show that $m\circ G=G\quad\forall m\in G$.
\addtosolutions{%
The inclusion $m\circ G\subseteq G$ is evident due to the closure of $\circ$ on $G$. Let $m,n\in G$. By calculating
\[
n=e\circ n=(m\circ m^{-1})\circ n=m\circ(m^{-1}\circ n)\in m\in G,
\]
we obtain $G\subseteq m\circ G$.
}
\end{problem}
\appendix
\printsolutions
\end{document}
概要与 OP 中的描述完全一致:(1)\addtosolutions
收集环境中的解决方案,(2)解决方案将在您希望它们所在的位置problem
与宏一起打印。(可以使用可选参数调用,该参数根据分段命令设置分段级别;默认值:'chapter'。)\printsolutions
\printsolutions
请注意,\appendix
我示例中的呼叫可能会被挂断。我发现它非常适合这种情况。
答案2
这是 Ruben 解决方案的一个变种,它使用令牌寄存器而不是依赖\protected@xdef
(应该会快一点)。主要区别在于没有对 的参数进行扩展\solution
。
\documentclass{book}
\usepackage{amsmath,amsthm}
\theoremstyle{definition}
\newtheorem{problem}{Problem}[chapter]
\providecommand\solutionsname{Solutions}
\makeatletter
\newtoks\@soltoks
\newcommand\printsolutions[1][\solutionsname]{%
\chapter{#1}
\the\@soltoks}
\newcommand\solution[1]{%
\edef\@soltemp{%
\the\@soltoks % the previously stored solutions
\noexpand\solutionpreamble{\theproblem}% we only want \theproblem to be expanded
\unexpanded{#1}%
}
\global\@soltoks=\expandafter{\@soltemp}
}
\newcommand{\solutionpreamble}[1]{%
\par\medskip\noindent\textbf{#1}\enspace\ignorespaces
}
\makeatother
%A small test
\begin{document}
\chapter{Groups}
\begin{problem}
Let $(G,\circ)$ be a finite group and $g\in G$. Prove that the order
of $g$ divides the cardinality of $G$.
\solution{Because $G$ is finite there is $\operatorname{ord}_G(g)=:m<\infty$.
Hence, there exists a cyclic subgroup $U_g=\lbrace e,g,g^2,\ldots,g^{m-1}\rbrace$.
Obviously $\lvert U_g\rvert=m=\operatorname{ord}_G(g)$ holds. Therefore the
claim follows from Lagrange theorem.}
\end{problem}
\begin{problem}
Let $(G,\circ)$ be a group. Show that $m\circ G=G\quad\forall m\in G$.
\solution{The inclusion $m\circ G\subseteq G$ is evident due to the
closure of $\circ$ on $G$. Let $m,n\in G$. By calculating
\[
n=e\circ n=(m\circ m^{-1})\circ n=m\circ(m^{-1}\circ n)\in m\in G,
\]
we obtain $G\subseteq m\circ G$.}
\end{problem}
\printsolutions
\end{document}
可以键入\printsolutions[Solutions of selected exercises]
而不必修改标准\solutionsname
。解决方案的格式可以在\solutionpreamble
以问题编号为参数的宏中定义。