\ensuremath 的环境等效项

\ensuremath 的环境等效项

是否有一个环境可以提供类似的功能\ensuremath{}(除了我实际上感兴趣的是插入\[ … \]而不是\( … \))?

动机:我想定义一个用户能够嵌套的类似数学的环境。因此我想要这种行为(简化示例):环境将创建一个array环境。如果我们尚未处于数学模式,它将把它封闭在中\[ … \]。因为\[ … \]不能嵌套,代码的第一个草图:

\newenvironment{myenv}{%
  \[
  \begin{array}{|l}
}{%
  \end{array}
  \]%
}

显然不能按预期工作。我也不能这样做:

\newenvironment{myenv}{%
  \TextOrMath{\[}{}
  \begin{array}{|l}
}{%
  \end{array}
  % Here we are in math mode anyway, so to know when to insert \],
  % we need to remember at which level of nesting we are.
}

因此,一个半解决方案是计算嵌套层数,这在大多数情况下可能有效。但是,当 amyenv嵌套在 a 内的文本模式内容中时(不太可能?),它会失败myenv。为了准确跟踪嵌套,我们应该使用堆栈。如果使用纯 (La)TeX 可能的话,这开始远远超出我的 TeX 技能。

答案1

这可能被认为是一种糟糕的黑客攻击,但在我看来这是最简单的解决方案:

\documentclass{minimal}
\newenvironment{suremath}
{\ifmmode \def\endsuremath{}\else\def\endsuremath{\]}\[\fi}{}

\begin{document}

\begin{suremath}
  \begin{array}{c}
    a = b x + c \\ z = u x - v
  \end{array}
\end{suremath}

\begin{equation}
  \begin{suremath}
    E = mc^2
  \end{suremath}
\end{equation}

\end{document}

在此处输入图片描述

答案2

受 Pieter van Oostrum 的回答启发,这里是另一个可行的解决方案,它应该比重新定义\end<NAME OF ENV>自身更不可怕。它设置一个标志,以指示true当前环境是否从文本打开,以及false是否从数学打开。

环境的所有实例都suremath使用相同的标志名称 ( suremath@InText),但嵌套仍然有效,因为环境形成组,并且在 TeX 中,变量对于组来说是局部的。因此,当嵌套环境重新定义(更改)变量的值时,它不会影响封闭环境中同名的变量。

\makeatletter

  \newif\ifsuremath@InText

  \newenvironment{suremath}{%
    \TextOrMath{%
      % if opening from text context:
      \suremath@InTexttrue%
      \[%
    }{%
      % if opening from math context:
      \suremath@InTextfalse%
    }%
  }{%
    \ifsuremath@InText%
      % if closing back to text context:
      \]%
    \else%
      % if closing back to math context:
    \fi%
  }

\makeatother

相关内容