
Quero usar diferentes estilos de matrizes se o TeX estiver em um align*
ambiente ou em um ambiente matemático normal. Já encontrei uma solução para verificar se está em modo matemático( \ifmmode
) mas não algo para verificar se está em modo align
. Até agora meu código ficaria assim:
\newcommand\cvec[1]{
\relax\ifmmode\begin{smallmatrix}#1\end{smallmatrix}\else\begin{pmatrix}#1\end{pmatrix}\fi}
Ou existe outro comando simples para fazer isso?
Responder1
Eu evitaria tal abordagem. Matrizes em fórmulas inline devem ser usadas com moderação, pois assim que a smallmatrix
tiver mais de duas linhas, prejudicará a equidistância entre as linhas de base.
O amsmath
pacote fornece \ifinalign@
e \ifingather@
, portanto, seu objetivo pode ser alcançado por
\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
mas a \cvec
macro não funcionará conforme esperado em equation
ou multline
. Observe que align
e gather
não deve ser usado como substituto de equation
(com ou sem *
em todos os casos), mas apenas para exibições multilinhas.
A única maneira correta de garantir o funcionamento correto \cvec
em todos esses casos é usar \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)$}}
}
Exemplo completo
\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}
Experimente a definição acima e você verá que nas equações 3 e 4 a saída seria com a smallmatrix
.
Minha sugestão é definir uma macro com uma *
variante, para que o asterisco possa ser facilmente adicionado ou eliminado.
\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
Alternativamente, com xparse
,
\usepackage{xparse}
\NewDocumentCommand{\cvec}{ s m }{%
\IfBooleanTF{#1}
{\text{$\left(\begin{smallmatrix}#1\end{smallmatrix}\right)$}}
{\begin{pmatrix}#1\end{pmatrix}}%
}
Você usará \cvec*
para o modo inline e \cvec
para o modo de exibição. Você pode omitir \text
se não planeja usar \cvec*
sub/sobrescritos.
Responder2
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\makeatletter
\begin{align}
\ifinalign@ true \else false \fi
\end{align}
\[
\ifinalign@ true \else false \fi
\]
\end{document}