我如何检查当前代码是否在某个环境中?

我如何检查当前代码是否在某个环境中?

我想定义一个命令来检查它是否在某个环境中执行。就像这样:

\documentclass{article}

\newenvironment{myenv}[0]{at start}{ at end}

\newcommand{\inner}[0]{%
  % if iside a myenv
  (inner)
  % else
  \begin{myenv}
  (inner)%
  \end{myenv}
  % end
}

\begin{document}

\begin{myenv}
  \inner
\end{myenv}

\inner

\end{document}

参见 的定义\inner。这种形式的 if 条件可能吗?

答案1

LaTeX 将当前环境保留在宏中\@currenvir

\makeatletter
\newcommand{\inner}{%
  \ifx\@currenvir\@myenvname
    (inner)
  \else
    \begin{myenv}(inner)\end{myenv}
  \fi}
\newcommand*\@myenvname{myenv}
\makeatother

另一种方法是定义一个全局条件,通过myenv起始代码将其设置为 true,通过myenv结束代码将其设置为 false。这主要取决于您对环境的期望myenv:它是否可以嵌套在自身内部?

答案2

如果您使用pdftexetexxetex(我的意思是引擎),您可以定义一个完全可扩展的测试:

\makeatletter \def\IfEnvir #1%
% implicit #2 "what if true"
% implicit #3 "what if false"
{%
  \ifnum \strcmp{\@currenvir}{#1}=0
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}

\makeatother

这样的条件在包中定义gmutils: ,但是由于某种原因\@ifenvir它在那里。\protected

相关内容