是否有一个环境可以提供类似的功能\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