
Esta questão é minha tentativa de resolver oproblema principal(MWE lá).
Percebi que usando macro
\newcommand{\veca}{|_{\vec{a}}}
ao lado \bigg
está sendo tratado como um único token, então essas duas consultas têm a mesma saída
\bigg\veca
\bigg{|_{\vec{a}}}
Não sei como definir \veca
a forma como ele está sendo expandido primeiro, então minha tentativa foi redefinir \bigg
para que o segundo argumento sempre se expanda uma vez
Eu olhei amsmath.sty
e descobri que todos \big
, \Big
, \bigg
, \Bigg
sã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
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 #2
deve 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. functional
O pacote faz algo semelhante para ver se um interno macro no argumento "é uma função")