Ampliar el argumento antes de usarlo.

Ampliar el argumento antes de usarlo.

Esta pregunta es mi intento de resolver elproblema principal(MWE allí).

Me di cuenta de que usar macro

\newcommand{\veca}{|_{\vec{a}}}

next to \biggse trata como un token único, por lo que esas dos consultas tienen el mismo resultado

\bigg\veca
\bigg{|_{\vec{a}}}

ingrese la descripción de la imagen aquí

No sé cómo definir \vecala forma en que se expande primero, así que mi intento fue redefinirlo \biggpara que el segundo argumento siempre se expanda una vez.

Miré amsmath.styy descubrí que todos ,,, \bigse 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. ingrese la descripción de la imagen aquí


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 #2debe 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. functionalEl paquete hace algo similar para ver si un interno macro en el argumento "es una función")

información relacionada