Expanda o argumento antes de usá-lo

Expanda o argumento antes de usá-lo

Esta questão é minha tentativa de resolver oproblema principal(MWE lá).

Percebi que usando macro

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

ao lado \biggestá sendo tratado como um único token, então essas duas consultas têm a mesma saída

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

insira a descrição da imagem aqui

Não sei como definir \vecaa forma como ele está sendo expandido primeiro, então minha tentativa foi redefinir \biggpara que o segundo argumento sempre se expanda uma vez

Eu olhei amsmath.stye descobri que todos \big, \Big, \bigg, \Biggsão definidos usando \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

E aqui está minha tentativa de implementar a expansão 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}

Mas parece que não funciona de jeito nenhum insira a descrição da imagem aqui


Qualquer sugestão é muito apreciada. Soluções Pure LaTeX2 também são bem-vindas.

Responder1

Você está quase lá. Mas a expansão do tipo o ajusta o resultado por padrão, então você precisa de uma que não seja compatível.

\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}

Observe que a expansão o de #2deve ser balanceada.


Observe que isso interromperá alguns outros usos, por exemplo, veja o comentário. Uma maneira de corrigir o problema é testar se a macro interna é aquela que "deseja ser expandida", por exemplo

\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}
    }
}

(olha, TeX não é mágico. Então se você quiser que algum sistema marque se uma macro como "deseja ser expandida ou não", você pode definir alguma macro auxiliar etc. ela fica complexa rapidamente. functionalO pacote faz algo semelhante para ver se um interno macro no argumento "é uma função")

informação relacionada