Macros condicionais

Macros condicionais

Meta:Eu gostaria de ter uma macro que substituísse comandos diferentes dependendo de estar no modo matemático exibido ou não. Em particular, ele deve gerar colchetes angulares de tamanho fixo em linhas de texto, \langle ... \ranglemas de tamanho variável na matemática exibida \left<...\right>,.

Motivação:A macro deve ser universal porque as expressões matemáticas podem frequentemente ser movidas entre expressões exibidas e não exibidas (eu escrevo um livro, edito-o, reedito, etc.). Seria uma fonte de erros de digitação se eu precisasse alterar o código da expressão sempre que movê-lo de ou para a matemática exibida. O exemplo acima com colchetes angulares é a notação padrão para cálculo de média na literatura de física.

A primeira tentativaestá no MWE abaixo. Funciona para matemática embutida, mas não substitui corretamente quando está no modo de exibição. O LaTeX reage com "Falta \right. inserido" ou "Delimitador de ambiente matemático incorreto" dependendo do uso de $$ou \[e \], respectivamente. A compilação no modo batch gera uma saída com o tamanho correto do colchete esquerdo, mas errado com o direito. Este resultado não depende do uso de \def ou \newcommand. É testado para ser o mesmo para colchetes [...].

O sistema:Mac OS 12.7.2., LaTeX: <Este é pdfTeX, versão 3.141592653-2.6-1.40.24 (TeX Live 2022) (formato pré-carregado = latex) restrito \write18 habilitado. entrando no modo estendido (./mwe.tex LaTeX2e <2021-11-15> patch nível 1 camada de programação L3 <2022-02-24>>

Agora um MWE:

\documentclass{article}
\def \la{\ifinner \langle \else \left< \fi }
\def \ra{\ifinner \rangle \else \right> \fi }
\begin{document}
The macros work in the text line: $\la \int \Omega_n^2 dt \ra$, 
but do not in the displayed math. Obviously, the 
false text is not expanded properly, but why?  
\[
\la \int \Omega_n^2 dt \ra 
\]
\end{document}

Responder1

Aconselho não usar essa abordagem. Geralmente não fará “a coisa certa”.

De qualquer forma, como o cliente tem sempre razão, você pode explorar amsmath \if@displayo condicional.

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand{\la}{\if@display\left\fi\langle}
\newcommand{\ra}{\if@display\right\fi\rangle}
\makeatother

\begin{document}

The macros work in the text line: $\la \int \Omega_n^2 \, dt \ra$,
and also in displayed math
\[
\la \int \Omega_n^2 \, dt \ra
\]
\begin{align}
I=\la \int \Omega_n^2 \, dt \ra
\end{align}
\begin{gather}
I=\la \int \Omega_n^2 \, dt \ra
\end{gather}

\end{document}

insira a descrição da imagem aqui

Responder2

\ifinnertesta um aspecto de baixo nível do estado do TeX, mas basicamente nunca faz nada de útil no tex em relação a quaisquer elementos no nível do documento.

Aqui, nele \latestaVerdadeiroem matemática inline eFalsomas \[seria testado como verdadeiro em amsmathambientes de exibição, como gatherou alignquando eles entram no estilo de exibição via
$\displaystyle display math$not
$$ display math$$

No entanto, o teste é sempreVerdadeiroin \raporque a expressão já era interna ou se \ifinnerera falsa no início \laserá executada, \left< o que define \ifinnercomo verdadeiro, pois toda a matemática dentro do par esquerda-direita está no modo interno. Então você nunca executa a correspondência \right.

Também \left..\rightdeve ser evitado nos casos em que o alongamento não é necessário, pois afeta o espaçamento horizontal.

É fornecido um mecanismo mais robusto mathtoolsque também corrige o espaçamento horizontal da esquerda para a direita.

insira a descrição da imagem aqui

\documentclass{article}
\def\test{\relax\ifinner T\else F\fi}

\usepackage{mathtools}

\DeclarePairedDelimiter\ang\langle\rangle

\begin{document}

a $\test  \ang{\int \Omega_n^2 dt}  \ang[\big]{\int \Omega_n^2 dt}$

\[
\test \ang{\int \Omega_n^2 dt}  \ang*{\int \Omega_n^2 dt}  \ang[\Big]{\int \Omega_n^2 dt}
\]

\begin{equation}
  \test \ang{\int \Omega_n^2 dt}  \ang*{\int \Omega_n^2 dt} \ang[\Big]{\int \Omega_n^2 dt}
\end{equation}

\begin{gather}
  \test \ang{\int \Omega_n^2 dt}  \ang*{\int \Omega_n^2 dt} \ang[\Big]{\int \Omega_n^2 dt}
\end{gather}
\end{document}

Responder3

TeX muda o modo de composição para "inner" ao encontrar um \left-delimiter no modo matemático.

Portanto, parece que a questão é expandir \ifinnerno momento certo.

Você pode usar \expandedpara \ifinneravaliar os -tests antes de mais qualquer composição tipográfica e, assim, alterar o modo de composição tipográfica:

\documentclass{article}
\newcommand*\la{\ifinner\else\expandafter\left\fi\langle}%
\newcommand*\ra{\ifinner\else\expandafter\right\fi\rangle}%
\begin{document}
The macros work in the text line: $\la \int \Omega_n^2 dt \ra$, 
and also do work in the displayed math.
\[%
\expanded{\la \unexpanded{\int \Omega_n^2 dt} \ra}
\]%
\end{document}

Em algumas situações, a circunstância de que esta forma \lae \rae, portanto, \langle/ \left\langlee \rangle/ \right\rangleseja completamente expandida pode ser um problema.

\unexpandedVocê também pode incluir uma macro em :

\documentclass{article}
\newcommand\inangle[1]{%
  \expanded{%
    \ifinner\else\unexpanded{\left}\fi\unexpanded{\langle}%
    \unexpanded{#1}%
    \ifinner\else\unexpanded{\right}\fi\unexpanded{\rangle}%
  }%
}%
\begin{document}
The macros work in the text line: $\inangle{\int \Omega_n^2 dt}$, 
and also do work in the displayed math.
\[\inangle{\int \Omega_n^2 dt}\]
\end{document}

insira a descrição da imagem aqui

Embargo:

Como já notado porDavid Carlisle em sua resposta, essas abordagens, em qualquer caso, falham em ambientes LaTeX, onde as coisas na verdade não são compostas no modo de exibição, mas são compostas no modo inline com o estilo de exibição selecionado por meio de \displaystyle.

informação relacionada