Проверьте, находится ли среда align*

Проверьте, находится ли среда align*

Я хочу использовать разные стили матриц, если TeX находится в align*среде или в обычной математической среде. Я уже нашел решение для проверки, находится ли он в математическом режиме ( \ifmmode), но не нашел решения для проверки, находится ли он в align. Пока мой код будет выглядеть так:

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

Или есть другая простая команда, чтобы сделать это?

решение1

Я бы избегал такого подхода. Матрицы во встроенных формулах следует использовать очень экономно, потому что как только a 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макрос не будет работать так, как ожидается, в equationили multline. Обратите внимание, что alignи gatherне следует использовать в качестве заменителей equation(с или без *во всех случаях), а только для многострочных дисплеев.

Единственный правильный способ обеспечить корректную работу \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.

Я предлагаю определить макрос с *-вариантом, чтобы звездочку можно было легко добавлять или удалять.

\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}

Связанный контент