我正在重写我们的考试模板,我想创建一个\questionpart{Q}{A}
可以以某种方式设置的命令,以便我可以打开和关闭解决方案,以及自动格式化和编号等等。
我还想要一个\questionpart{Q}
仅创建问题而没有解决方案环境的版本。
现在,出于某种原因,我可以通过写入 获得所需的输出\questionpart{Q}{}
,但不能\questionpart{Q}
。为什么会这样?我怎样才能让我的命令按照我喜欢的方式运行?
\documentclass[11pt,a4paper]{article}
\usepackage{ifthen}
\newcommand\test[2]{
#1
\ifthenelse{\equal{#2}{}}
{}
{XXX: #2}
}
\begin{document}
\test{question}{solution}
\test{question without solution}
\test{question with empty solution}{}
\end{document}
提前致谢!
附言:如果您能想出更有意义的标题,请随意更改。
答案1
你可以如果后面跟着一个或两个支撑组,则define\questionpart
的行为会有所不同:
\usepackage{xparse}
\NewDocumentCommand{\questionpart}{+m +g}{%
\formatquestion{#1}%
\IfValueT{#2}{\formatanswer{#2}}%
}
其中\formatquestion
和\formatanswer
将负责格式化这两个部分。
这样你就会得到不同的结果
\questionpart{Q}{A}
\questionpart{Q}
\questionpart{Q}{}
我并不推荐这样做:命令应该具有明确定义的语法,并且使用可选的括号参数违反所有 LaTeX 正常约定。
更加标准
\usepackage{xparse}
\NewDocumentCommand{\questionpart}{+m +o}{%
\formatquestion{#1}%
\IfValueT{#2}{\formatanswer{#2}}%
}
语法如下
\questionpart{Q}[A]
\questionpart{Q}
\questionpart{Q}[]
答案2
当然,如果你的解决方案包含方括号,则必须将它们分组。
\documentclass[11pt,a4paper]{article}
\newcommand\test[1]{\def\savetestarg{#1}\testaux}
\newcommand\testaux[1][\TestAux]{\savetestarg\ifx\TestAux#1\relax\else: (#1)\fi}
\begin{document}
\test{question}[solution]
\test{question}[s{[o]}lution containing square brackets]
\test{question without solution}
\test{question with empty solution}[]
\end{document}
答案3
多谢大家的评价!
我不知道这个exercise
包,但我想我不能使用它。这个xparse
包也是一样。原因很简单——我和许多其他人一起工作,他们可以使用 Latex,但永远无法理解该代码,以防他们需要更改某些东西。
幸运的是,David Carlisle 的评论(不知道如何链接人们)确实解决了我的问题。我只需要替换\equal{#2}{}
为\equal{#2}{\par}
,它就可以正常工作。非常感谢!
这是工作代码,其中包含原始文档的屏幕截图,您可以在其中看到所有 3 个选项:
\documentclass[11pt,a4paper]{article}
\usepackage{ifthen}
\newcommand\test[2]{
#1
\ifthenelse{\equal{#2}{\par}} % Inserted \par here
{\par} % For some reason the linebreak disappeared, so I reinserted it
{XXX: #2}
}
\begin{document}
\test{question}{solution}
\test{question without solution}
\test{question with empty solution}{}
\end{document}