使用する前に引数を展開する

使用する前に引数を展開する

この質問は、主な問題(MWEはそこにいます)。

マクロを使うと

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

next toは\bigg単一のトークンとして扱われるため、これら2つのクエリの出力は同じになります。

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

ここに画像の説明を入力してください

\veca最初に展開される方法を定義する方法がわからないので、 \bigg2番目の引数が常に1回展開されるように再定義しようとしました。

を調べたところ、、、はすべて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}

しかし、全く効果がないようだ ここに画像の説明を入力してください


どのようなご提案でも大歓迎です。純粋な LaTeX2 ソリューションも大歓迎です。

答え1

もうすぐ完了です。ただし、o 型展開ではデフォルトで結果が括弧で囲まれるため、括弧を囲まないものが必要です。

\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中括弧でバランスをとる必要があることに注意してください。


これは他の使用法を壊すことに注意してください。たとえば、コメントを参照してください。この問題を解決する1つの方法は、内部マクロが「展開される必要がある」かどうかをテストすることです。たとえば、

\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パッケージは、引数の内部マクロが「関数」であるかどうかを確認するために同様のことを行います)

関連情報