考虑以下最小示例:
\documentclass{article}
\begin{document}
foo
\setbox0=\vbox\bgroup
\label{baz}
\ref{baz}
\egroup
bar
\end{document}
每当你运行 LaTeX 时,你都会收到类似这样的警告
LaTeX Warning: Reference `baz' on page 1 undefined on input line 7.
这是完全可以接受的,也是意料之中的。但是,如何才能省去任意(但有效)的 LaTeX 内容而不打印这样的警告呢?
我为什么要问这个问题或者我想要实现什么。我尝试为考试编写一个模板,其中我有一个名为的环境,solution
并按如下方式使用它:
\begin{solution}
foo ...
\end{solution}
每当我切换布尔值时,解决方案环境中的内容应该被排版或省略。我通过将所有内容保存在框内来实现后者,如上面的最小示例所示。即使我verbatim
的环境中有一个环境,这也能正常工作solution
。
答案1
我用的是这个:
\newif\ifsolution\solutiontrue
\colorlet{darkgreen}{green!40!black}
\usepackage{comment}
\specialcomment{solution}{\begingroup\color{darkgreen}}{\endgroup}
%
%\solutionfalse % uncomment this to hide the solution
\ifsolution\relax\else\excludecomment{solution}\fi
...并且它运行得很好(我还没有用真正棘手的东西来检查它,但它似乎lstlisting
有效)。
(另一个布尔值似乎被过度使用是因为我\ifsolution
在更多宏中使用了该构造)。
更新
当我在我的第一篇非英语文本上使用它时,我发现问题在问题中得到了解释comment.sty 和 UTF8 编码--- 因此,感谢@egreg,真正的解决方案是:
\newif\ifsolution\solutiontrue
\colorlet{darkgreen}{green!40!black}
\usepackage{comment}
%% fix comment.sty for utf8 encoding https://tex.stackexchange.com/a/159824/38080
\renewcommand\ThisComment[1]{%
\immediate\write\CommentStream{\unexpanded{#1}}%
}
\specialcomment{solution}{\begingroup\color{darkgreen}}{\endgroup}
%
%\solutionfalse % uncomment this to hide the solution
\ifsolution\relax\else\excludecomment{solution}\fi