使用前展開參數

使用前展開參數

這個問題是我試圖解決的主要問題(MWE 在那裡)。

我意識到使用宏

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

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

但似乎根本不起作用 在此輸入影像描述


任何建議都將受到高度讚賞。純 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必須是大括號平衡的。


請注意,這會破壞一些其他用法,例如請參閱評論。我看到解決問題的一種方法是測試內部宏是否是「想要擴展」的宏,例如

\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套件會執行類似的操作來查看內部是否參數“是一個函數”中的宏)

相關內容