Erweitern Sie das Argument, bevor Sie es verwenden

Erweitern Sie das Argument, bevor Sie es verwenden

Diese Frage ist mein Versuch zur Lösung desHauptproblem(MWE dort).

Mir ist aufgefallen, dass die Verwendung von Makros

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

next to \biggwird als einzelnes Token behandelt, sodass diese beiden Abfragen die gleiche Ausgabe haben

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

Bildbeschreibung hier eingeben

Ich weiß nicht, wie ich \vecadie Art und Weise definieren soll, wie es zuerst erweitert wird, also habe ich versucht, es \biggso neu zu definieren, dass das zweite Argument immer einmal erweitert wird

Ich habe in nachgeschaut amsmath.styund herausgefunden, dass alle \big, \Big, \bigg, \Biggwie folgt definiert sind \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

Und hier ist mein Versuch, die Erweiterung zu implementieren mitexpl3

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

Aber es scheint überhaupt nicht zu funktionieren Bildbeschreibung hier eingeben


Alle Vorschläge sind herzlich willkommen. Auch reine LaTeX2-Lösungen sind herzlich willkommen.

Antwort1

Sie sind fast am Ziel. Aber die O-Typ-Erweiterung klammert das Ergebnis standardmäßig, Sie benötigen also eine Erweiterung, die keine Klammern verwendet.

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

Beachten Sie, dass die O-Erweiterung durch #2Klammern ausgeglichen werden muss.


Beachten Sie, dass dies einige andere Verwendungen unterbricht, siehe z. B. den Kommentar. Eine Möglichkeit, das Problem zu beheben, besteht meiner Meinung nach darin, zu testen, ob das innere Makro eines ist, das „erweitert werden möchte“, z. B.

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

(Sehen Sie, TeX ist keine Zauberei. Wenn Sie dann möchten, dass ein System kennzeichnet, ob ein Makro „erweitert werden soll oder nicht“, können Sie ein Hilfsmakro usw. definieren. Das wird schnell komplex. functionalDas Paket macht etwas Ähnliches, um zu sehen, ob ein inneres Makro im Argument „eine Funktion ist“)

verwandte Informationen