将文本添加到文档的不同部分

将文本添加到文档的不同部分

我目前正在编写一份 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以问题编号为参数的宏中定义。

相关内容