
這個問題是我試圖解決的主要問題(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
套件會執行類似的操作來查看內部是否參數“是一個函數”中的宏)