检查是否处于 align* 环境中

检查是否处于 align* 环境中

如果 TeX 处于环境align*或正常数学环境中,我想使用不同样式的矩阵。我已经找到了一种检查它是否处于数学模式 ( \ifmmode) 的解决方案,但没有找到检查它是否处于 的解决方案align。到目前为止,我的代码如下所示:

\newcommand\cvec[1]{
    \relax\ifmmode\begin{smallmatrix}#1\end{smallmatrix}\else\begin{pmatrix}#1\end{pmatrix}\fi}

或者有其他简单的命令可以执行此操作吗?

答案1

我会避免使用这种方法。内联公式中的矩阵应谨慎使用,因为一旦smallmatrix超过两行,它就会破坏基线之间的等距。

amsmath软件包提供了\ifinalign@\ifingather@,因此您的目标可以通过以下方式实现

\makeatletter
\newcommand\cvec[1]{%
  \relax
  \ifinalign@
    \expandafter\@firstoftwo
  \else
    \ifingather@
      \expandafter\expandafter\expandafter\@firstoftwo
    \else
      \expandafter\expandafter\expandafter\@secondoftwo
    \fi
  \fi
  {\begin{pmatrix}#1\end{pmatrix}}%
  {\left(\begin{smallmatrix}#1\end{smallmatrix}\right)}%
}
\makeatother

但宏在或\cvec中不会按预期工作。请注意和不应替代(在所有情况下都使用或不使用 ),而只能用于多行显示。equationmultlinealigngatherequation*

\cvec在所有这些情况下确保正确工作的唯一正确方法是使用\mathchoice

\newcommand{\cvec}[1]{%
  \mathchoice{\begin{pmatrix}#1\end{pmatrix}}
    {\left(\begin{smallmatrix}#1\end{smallmatrix}\right)}
    {\text{$\left(\begin{smallmatrix}#1\end{smallmatrix}\right)$}}
    {\text{$\left(\begin{smallmatrix}#1\end{smallmatrix}\right)$}}
}

完整示例

\documentclass{article}
\usepackage{amsmath}
\newcommand{\cvec}[1]{%
  \mathchoice{\begin{pmatrix}#1\end{pmatrix}}
    {\left(\begin{smallmatrix}#1\end{smallmatrix}\right)}
    {\text{$\left(\begin{smallmatrix}#1\end{smallmatrix}\right)$}}
    {\text{$\left(\begin{smallmatrix}#1\end{smallmatrix}\right)$}}
}

\begin{document}
$\cvec{a\\b}$
\begin{align}
\cvec{a\\b}
\end{align}
\begin{gather}
\cvec{a\\b}
\end{gather}
\begin{equation}
\cvec{a\\b}
\end{equation}
\begin{multline}
x\\\cvec{a\\b}
\end{multline}
\end{document}

在此处输入图片描述

尝试使用上述定义,您会看到在等式 3 和 4 中输出将是smallmatrix

我的建议是定义一个带有*-variant 的宏,这样就可以轻松添加或删除星号。

\makeatletter
\newcommand{\cvec}{\@ifstar{\thomas@scvec}{\thomas@cvec}}
\newcommand{\thomas@scvec}[1]{%
  \text{$\left(\begin{smallmatrix}#1\end{smallmatrix}\right)$}}
\newcommand{\thomas@cvec}[1]{\begin{pmatrix}#1\end{pmatrix}}
\makeatother

或者,xparse使用

\usepackage{xparse}
\NewDocumentCommand{\cvec}{ s m }{%
 \IfBooleanTF{#1}
   {\text{$\left(\begin{smallmatrix}#1\end{smallmatrix}\right)$}}
   {\begin{pmatrix}#1\end{pmatrix}}%
}

\cvec*您将在内联模式和显示模式下使用。如果您不打算在下标/上标中使用,则\cvec可以省略。\text\cvec*

答案2

\documentclass{article}
\usepackage{amsmath}
\begin{document}
\makeatletter
\begin{align}
  \ifinalign@ true \else false \fi
\end{align}

\[
  \ifinalign@ true \else false \fi
\]
\end{document}

相关内容