如何在另一个环境中使用版本包定义的环境

如何在另一个环境中使用版本包定义的环境

当我使用版本包有条件地排除这样的内容:

\documentclass{article}
\usepackage{color}% just as example

\usepackage[tracing]{versions}
\excludeversion{vers}% opposite to \includeversion{vers}

\newenvironment{test}{%
START%
\vers%
\color{red}%
}{%
\endvers%
END% is excluded but should not be excluded 
}

\begin{document}
before

\begin{test}
% content is excluded for \excludeversion{vers}
%        and included for \includeversion{vers} above
inside
\end{test}

after
\end{document}

我可以排除环境内容vers,正如使用versions包所期望的那样。但同时也END被排除(在之后\endvers),这与我的意图相反。\includeversion{vers}同时也END被包括在内(如预期的那样)。我做错了什么,我该如何解决?

可以定义

\newcommand{\afterendvers}{%
END% and all other stuff I want to have executed here
}

\end{test}并在\end{test}\afterendvers整个文档中替换,但更“技术化”的解决方案会更好。

相关问题:虽然用\includeversion{vers} END红色印刷,

环境处理起来就像\begin{<version>}\end{<version>} 存在一样,然而它们形成了像 \begin{relax} <code> \end{relax}\begingroup <code> \endgroup

(来自版本手册),但是

\vers%
\bgroup%
\color{red}%
}{%
\egroup%
\endvers%
END%

导致END显示为黑色,正如预期的那样。即:在本例中\vers\endvers似乎不像\begingroup和那样起作用。\endgroup

答案1

出现问题的原因是,当 excluded\vers包含\let\end\fiand时\iffalse,会忽略所有内容,直到下一个\end{<current environment>},其中当前环境由最后一个 设定\begin,即test此处。我认为这\end并没有展开,因此其中的\endvers%andEND永远不会出现。

我试图通过查看软件包的源代码来找出解决方法versions,但这只是证实了它不支持这种用法。为此需要对该软件包进行更大规模的重写。

答案2

我不确定您的实际用例是什么,但似乎您的 MWE 应该根据版本有条件地为某些文本着色。这对我来说有效:

\documentclass{article}
\usepackage{color}% just as example
\usepackage[tracing]{versions}
\excludeversion{vers}

\def\colorbyversion{\normalcolor}
\begin{vers}
\gdef\colorbyversion{\color{red}}
\end{vers}

\newenvironment{test}{
START
\bgroup\colorbyversion}{%
\egroup
END% should not be excluded
}

\begin{document}
before

\begin{test}
inside
\end{test}

after
\end{document}

\includeversion{vers}

包含版本的示例文档

\excludeversion{vers}

不含 vers 的示例文档

需要\gdef来使 重新定义为\colorbyversion全局的。否则,环境内的定义vers将在 处失效\end{vers}

相关内容