
この質問は、主な問題(MWEはそこにいます)。
マクロを使うと
\newcommand{\veca}{|_{\vec{a}}}
next toは\bigg
単一のトークンとして扱われるため、これら2つのクエリの出力は同じになります。
\bigg\veca
\bigg{|_{\vec{a}}}
\veca
最初に展開される方法を定義する方法がわからないので、 \bigg
2番目の引数が常に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
パッケージは、引数の内部マクロが「関数」であるかどうかを確認するために同様のことを行います)