文档中出现两次相同的文本

文档中出现两次相同的文本

我正在写一本问题解答书。我决定把问题和解答分开;书的前半部分是问题,后半部分是解答。但是解答部分也需要问题的文本。

例如。


第一部分

问题 3.3:找出飞机的速度……


第二部分

问题 3.3:找出飞机的速度……

问题的解决方法如下...


我正在考虑一个类型的命令

\problem{prob33}{Find the speed of the airplane...}

\solution{prob33}

所以这个想法是,命令\solution会以某种方式连接到命令\problem,并且调用\solution{prob33}会再次打印文本“查找飞机的速度......”,这是由定义的\problem

有没有什么好的办法可以解决我的问题?

感谢您的帮助!

答案1

对于问题和解决方案,有两个由@Thorsten 建议的优秀软件包:(exsheets参见手册第 6 节)和probsoln

但是,如果您想烘焙自己的版本,或者您仍然好奇如何实现这一点,这里有一个选择。

您可以定义一个宏来显示您的问题,同时将文本存储在宏中:

\newcommand{\problem}[2]{%
    \expandafter\def\csname #1\endcsname{#2}%
    #2 %
}

然后命令 \problem{p1}{bla}将调用\expandafter\def\csname #1\endcsname{#2},然后重写为,\def\p1{bla}以便您\p1在需要再次打印该问题时可以调用。魔法是通过\csname<something>\endcsname创建一个令牌 \<something>并允许您调用/定义动态计算的宏名称来完成的。请注意,当您从这样的参数创建宏时,使用前缀以避免与已定义的宏发生冲突(例如使用)更为安全\problem{emph}{bla}

现在\solution宏很容易定义:

\newcommand{\solution}[2]{
    Recall the problem:
    \csname #1\endcsname \par
    \textbf{Solution:} #2 \par
}

为了获得更好的解决方案,您还可以引入计数器来正确处理交叉引用:

\newcounter{problem}
\newcommand{\problem}[2]{%
    \refstepcounter{problem}
    \expandafter\def\csname problem#1\endcsname{#2}%
    \textbf{Problem \theproblem:} #2 \par
    \label{probl:#1}
}

\newcommand{\solution}[2]{
    Recall problem~\ref{probl:#1}:
    \csname problem#1\endcsname \par
    \textbf{Solution:} #2 \par
}

答案2

这与 Bordaigorl 的答案非常相似,但定义的形式更易读。

我用\@namedef而不是\expandafter\def\csname ...\endcsname\@nameuse而不是\csname ...\endcsname

\documentclass{article}

\makeatletter
\newcommand{\problem}[2]{%
    \@namedef{#1}{#2}%
    #2%
}
\newcommand{\solution}[1]{%
    \@nameuse{#1}%
}
\makeatother

\begin{document}

\section*{Part I}

\problem{prob33}{Find the speed of the airplane...}

\section*{Part II}

\solution{prob33}

\end{document} 

在此处输入图片描述

答案3

此替代方案利用prob与计数器关联的环境section。问题陈述在解决方案中通过 \@namedef 和 \@nameuse 重复

 \documentclass[a4paper]{article}
 \usepackage[margin=1in]{geometry}

 \newtheorem{prob}{Problem}[section]

 \makeatletter
 \newcommand{\problem}[1]{%
 \begin{prob}
 \par #1 \par
 \end{prob}
 \@namedef{\theprob}{#1}
 }

 \newcommand{\solution}[2]{%
 \vspace*{1cm}   % adjust for distance between solutions
 \noindent\textbf{Problem #1:} \@nameuse{#1} \par
 \noindent\texttt{\bf Solution #1:} #2  
 }
 \makeatother

 \begin{document}

 \section*{Part A}

 \section{Section I}

 \problem{Find the speed of the airplane...}

 \problem{This is the second problem to find the speed of the car...}

 \section{Section II}

 \problem{This is the thrid problem in section II.}

 \section*{Part B}

 \solution{1.1}{This is the solution for airplane. }

 \solution{1.2}{This is the solution for the second problem. }

 \solution{2.1}{This is the solution for the third problem.}
 \end{document} 

在此处输入图片描述

相关内容