
Этот вопрос - моя попытка решитьГлавная проблема(МВЭ там).
Я понял, что использование макроса
\newcommand{\veca}{|_{\vec{a}}}
next \bigg
рассматривается как один токен, поэтому эти два запроса имеют одинаковый вывод
\bigg\veca
\bigg{|_{\vec{a}}}
Я не знаю, как определить, \veca
как он сначала расширяется, поэтому я попытался переопределить \bigg
так, чтобы второй аргумент всегда расширялся один раз.
Я посмотрел amsmath.sty
и выяснил, что все \big
, \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
А вот моя попытка реализовать расширение с помощьюexpl3
\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}
Но, похоже, это вообще не работает.
Любые предложения высоко ценятся. Решения Pure LaTeX2 также приветствуются.
решение1
Вы почти у цели. Но расширение o-type по умолчанию заключает результат в скобки, поэтому вам нужен тот, который не заключает.
\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}
Обратите внимание, что расширение o #2
должно быть сбалансировано по фигурным скобкам.
Обратите внимание, что это нарушит некоторые другие использования, например, см. комментарий. Один из способов, который я вижу, чтобы исправить проблему, — это проверить, является ли внутренний макрос тем, который «хочет быть расширенным», например
\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}
}
}
(Смотрите, TeX — это не магия. Тогда, если вы хотите, чтобы какая-то система отмечала, что макрос «хочет быть расширенным или нет», вы можете определить какой-нибудь вспомогательный макрос и т. д. Это быстро становится сложным. functional
package делает что-то похожее, чтобы проверить, является ли внутренний макрос в аргументе «функцией»)