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 ... \rangle
mas 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@display
o 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}
Responder2
\ifinner
testa 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 \la
testaVerdadeiroem matemática inline eFalsomas \[
seria testado como verdadeiro em amsmath
ambientes de exibição, como gather
ou align
quando eles entram no estilo de exibição via
$\displaystyle display math$
not
$$ display math$$
No entanto, o teste é sempreVerdadeiroin \ra
porque a expressão já era interna ou se \ifinner
era falsa no início \la
será executada, \left<
o que define \ifinner
como 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..\right
deve ser evitado nos casos em que o alongamento não é necessário, pois afeta o espaçamento horizontal.
É fornecido um mecanismo mais robusto mathtools
que também corrige o espaçamento horizontal da esquerda para a direita.
\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 \ifinner
no momento certo.
Você pode usar \expanded
para \ifinner
avaliar 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 \la
e \ra
e, portanto, \langle
/ \left\langle
e \rangle
/ \right\rangle
seja completamente expandida pode ser um problema.
\unexpanded
Você 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}
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
.