Verifique se está em um ambiente align*

Verifique se está em um ambiente align*

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 smallmatrixtiver mais de duas linhas, prejudicará a equidistância entre as linhas de base.

O amsmathpacote 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 \cvecmacro não funcionará conforme esperado em equationou multline. Observe que aligne gathernã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 \cvecem 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}

insira a descrição da imagem aqui

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 \cvecpara o modo de exibição. Você pode omitir \textse 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}

informação relacionada