我正在写一本问题解答书。我决定把问题和解答分开;书的前半部分是问题,后半部分是解答。但是解答部分也需要问题的文本。
例如。
第一部分
问题 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}