
Я хочу использовать разные стили матриц, если 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}