是否存在一个“身份”(或“无操作”)环境,它只是不改变地使用其内容?

是否存在一个“身份”(或“无操作”)环境,它只是不改变地使用其内容?

在函数式编程范式中,函数接受其他函数作为参数是很常见的。LaTeX 中也可以遵循这种范式:宏可以接受参数,这些参数本身可以是宏或环境名称。对于这种用例,LaTeX 中缺少“恒等函数”的等价物:一个宏和一个表现得像不存在的环境。

基本上,我正在寻找类似这样的东西:

\documentclass{article}
\begin{document}

\newenvironment{identity}{}{}
\begin{identity}
  This will be parsed as if not surrounded by anything.
\end{identity}
\end{document}

如果标准 LaTeX 或任何“标准”包中已经存在类似的东西,我不愿意定义这个环境。LaTeX 中如何称呼“身份”?

答案1

除了egreg的回答之外:

如果取消它添加的组,则可以使环境更加透明。但是,您需要在最终代码中定义环境名称以使最终测试顺利进行。请注意,如果您使用其中一个\begin{identity}\end{identity}不使用另一个,这将不会给您正确的警告消息。相反,您会在警告消息中得到一个不同的环境名称。

\documentclass{article}

\makeatletter
\newenvironment{identity}
    {\endgroup\ignorespaces}
    {\begingroup\def\@currenvir{identity}\ignorespacesafterend}
\makeatother

\begin{document}

\newcommand\test{Grouping!}

\begin{identity}

    Some text ...
    \renewcommand\test{No Grouping!}

    This is the environment ``\csname @currenvir\endcsname''.
    %\tracingonline=1
    %\showgroups
\end{identity}

Grouping? \test

\end{document}

测试文件显示,内容没有进行有效的分组。

答案2

没有一个预定义的环境什么都不做。你可以用

\begin{empty}
Text
\end{empty}

但这会增加不必要的空格。所以可能

\newenvironment{identity}
  {\ignorespaces}
  {\ignorespacesafterend}

就是你所需要的。请注意,这将添加一个分组级别,因此真的“没做什么”。

相关内容