我想使用注释包来选择性地包含/排除文档的部分内容。虽然“ \begin{sol}
”和“ \end{sol}
”对与\includecomment
或组合\excludecomment
可以选择性地包含家庭作业问题的解决方案,但我宁愿写\version{sol}
和\endversion{sol}
。我知道制作名称以“end”开头的宏很棘手,所以我选择了\eversion
。这不起作用:显然放入文档中的宏在某些方面与我不理解的\end{sol}
不同:\end{sol}
\documentclass{article}
\RequirePackage{comment}
\excludecomment{sol}
\newcommand{\version}[1]%
{\begin{#1}}
\newcommand{\eversion}[1]%
{\end{#1}}
\begin{document}
Test.
\version{sol}
Test text.
\eversion{sol}
%\end{sol}
\end{document}
这会产生一个 pdflatex 错误(“扫描使用 \next 时文件结束”),但如果我注释掉“eversion”行并取消注释\end{sol}
,它就会起作用。有人能解释一下为什么吗?
答案1
正如评论中所建议的,我建议使用类似的\begin{version}...\end{version}
东西\excludecomment{version}
。
如果这不可能,那么我建议手动编写自己的“类似注释”的环境。对我来说,使用\version{sol}...\endversion{sol}
似乎太麻烦了(因为是一个sol
实际上不执行任何操作的伪参数),所以我会使用\version{...}
。
以下是实现此目的的一种方法:
\documentclass{article}
\newif\ifSolutions% define \ifSolutions <solutions code>\else <no solutions code>\fi.
\newcommand\version[1]{\ifSolutions #1\fi}% print #1 only if \Solutionstrue
\begin{document}
Test
\Solutionsfalse\version{Solutions are off}% should not print
\Solutionstrue\version{Solutions are on}% should print
\end{document}
得出的结果为:
如果你真的想使用\version{sol}...\endversion{sol}
那么这里有一个可怕的黑客可以让你做到这一点:
\documentclass{article}
\newif\ifSolutions% define \ifSolutions <solutions code>\else <no solutions code>\fi.
\long\def\version#1#2\endversion#3{\ifSolutions #2\fi}
\begin{document}
Test
\Solutionsfalse\version{sol}Solutions are off\endversion{sol}
\Solutionstrue\version{sol}Solutions are on\endversion{sol}
\end{document}
这为您提供了所需的语法,但我不建议您使用它!代码正在做的是将定义\version
为一个宏,该宏需要\endversion
第二个和第三个参数之间的三个参数。如果 ,则打印第二个参数,\Solutionstrue
并且丢弃第一个和第三个参数。 是\long
必需的,因为这允许#2
(实际参数)包含段落分隔符,这可能是您在用例中想要的。这个宏是对 TeX 语言的滥用,它可能会让我因为提出这个建议而得到一些反对票!
如果您想走这条路,那么我建议删除{sol}
并使用:
\long\def\version#1\endversion{\ifSolutions #1\fi}
\version Sol/version code\endversion