注释包和宏定义

注释包和宏定义

我想使用注释包来选择性地包含/排除文档的部分内容。虽然“ \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

相关内容