
Esta pregunta es mi intento de resolver elproblema principal(MWE allí).
Me di cuenta de que usar macro
\newcommand{\veca}{|_{\vec{a}}}
next to \bigg
se trata como un token único, por lo que esas dos consultas tienen el mismo resultado
\bigg\veca
\bigg{|_{\vec{a}}}
No sé cómo definir \veca
la forma en que se expande primero, así que mi intento fue redefinirlo \bigg
para que el segundo argumento siempre se expanda una vez.
Miré amsmath.sty
y descubrí que todos ,,, \big
se definen usando :\Big
\bigg
\Bigg
\bBigg@
\renewcommand{\big}{\bBigg@\@ne}
\renewcommand{\Big}{\bBigg@{1.5}}
\renewcommand{\bigg}{\bBigg@\tw@}
\renewcommand{\Bigg}{\bBigg@{2.5}}
\ifx\leavevmode@ifvmode\@undefined
\def\bBigg@#1#2{%
{\@mathmeasure\z@{\nulldelimiterspace\z@}%
{\left#2\vcenter to#1\big@size{}\right.}%
\box\z@}}
\else
\def\bBigg@#1#2{\leavevmode@ifvmode
{\@mathmeasure\z@{\nulldelimiterspace\z@}%
{\left#2\vcenter to#1\big@size{}\right.}%
\box\z@}}
\fi
Y aquí está mi intento de implementar la expansión usandoexpl3
\documentclass{article}
\usepackage{amsmath}
\newcommand{\veca}{|_{\vec{a}}}
\makeatletter
\ExplSyntaxOn
\cs_set_eq:NN \better_big:nn \bBigg@
\cs_generate_variant:Nn \better_big:nn {no}
\cs_set:Npn \bBigg@ #1#2 {
\better_big:no #1 #2
}
\ExplSyntaxOff
\makeatother
\begin{document}
\[
\frac{f(\vec{x})}{g(\vec{x})}\bigg\veca \qquad
\frac{f(\vec{x})}{g(\vec{x})}\bigg|_{\vec{a}}
\]
\end{document}
Pero no parece funcionar en absoluto.
Cualquier sugerencia es altamente apreciada. Las soluciones Pure LaTeX2 también son bienvenidas.
Respuesta1
Ya casi estás ahí. Pero la expansión de tipo o refuerza el resultado de forma predeterminada, por lo que necesita una que no lo haga.
\documentclass{article}
\usepackage{amsmath}
\newcommand{\veca}{|_{\vec{a}}}
\makeatletter
\ExplSyntaxOn
\cs_set_eq:NN \better_big:nn \bBigg@
\cs_set:Npn \bBigg@ #1#2 {
\exp_last_unbraced:Nno \better_big:nn {#1} {#2}
}
\ExplSyntaxOff
\makeatother
\begin{document}
\[
\frac{f(\vec{x})}{g(\vec{x})}\bigg\veca \qquad
\frac{f(\vec{x})}{g(\vec{x})}\bigg|_{\vec{a}}
\]
\end{document}
Tenga en cuenta que la expansión o de #2
debe estar equilibrada entre llaves.
Tenga en cuenta que esto interrumpirá algunos otros usos, por ejemplo, ver el comentario. Una forma que veo para solucionar el problema es probar si la macro interna es una que "quiere expandirse", por ejemplo
\cs_set:Npn \bBigg@ #1#2 {
\tl_if_eq:nnTF {#2} {\veca} {
\exp_last_unbraced:Nno \better_big:nn {#1} {#2}
}
{
\better_big:nn {#1} {#2}
}
}
(Mire, TeX no es mágico. Luego, si desea que algún sistema marque si una macro "quiere expandirse o no", puede definir alguna macro auxiliar, etc., se vuelve complejo rápidamente. functional
El paquete hace algo similar para ver si un interno macro en el argumento "es una función")