我有一个用 xparse 定义的宏\lip
,它接受几个参数。
我想定义一些在宏之后\slip
应用宏的宏。\eset
\lip
有没有办法在\slip
不定义新宏的情况下定义一个具有与多个参数相同的参数\lip
并将它们传递给后一个命令?
\documentclass{article}
\usepackage{xparse}
\newcommand{\eset}[1]{\mathchoice{\left \{#1\right \}}{\{#1\}}{\{#1\}}{\{#1\}}}
\ExplSyntaxOn
\NewDocumentCommand \lip { D||{A} m D||{B} m } {
#1^#2, #3^#4
}
\ExplSyntaxOff
% How can I define slip without the xparse boilerplate?
\ExplSyntaxOn
\NewDocumentCommand \slip {D||{A} m D||{B} m } {
\eset{\lip |#1| {#2} |#3| {#4}}
}
\ExplSyntaxOff
\begin{document}
\[\lip |a| {1} |b| {2}\]
\[\slip |a| {1} |b| {2}\]
\end{document}
答案1
除了对此的怀疑\eset
(在我看来,这从一开始就是错误的)之外,您可以将其合并到\lip
:
\documentclass{article}
\usepackage{xparse}
\newcommand{\eset}[1]{\mathchoice{\left \{#1\right \}}{\{#1\}}{\{#1\}}{\{#1\}}}
\ExplSyntaxOn
\NewDocumentCommand \lip {s D||{A} m D||{B} m }
{
\IfBooleanTF{#1}
{ \eset{#2^#3, #4^#5} }
{ #2^#3, #4^#5 }
}
\NewDocumentCommand \slip {} { \lip* }
\ExplSyntaxOff
\begin{document}
\[\lip |a| {1} |b| {2}\]
\[\slip |a| {1} |b| {2}\]
\end{document}
避免使用大量可选参数:您会在努力记住它们时迷失自己。
在这个特殊情况下,我看不出语法和输出之间有什么联系,因此更简单的
\NewDocumentCommand \lip {s O{A} m O{B} m }
{
\IfBooleanTF{#1}
{ \eset{#2^#3, #4^#5} }
{ #2^#3, #4^#5 }
}
调用\lip{x}{y}
、\lip[u]{x}{y}
或\lip{x}[v]{y}
会\lip[u]{x}[v]{y}
更好。
这个定义为什么是错误的呢?因为普遍地、不加区别地\eset
套用是错误的。\left
\right
如果您想要适应其他变体,则可以使用稍微不同的策略:
\documentclass{article}
\usepackage{xparse}
\newcommand{\eset}[1]{\mathchoice{\left \{#1\right \}}{\{#1\}}{\{#1\}}{\{#1\}}}
\newcommand{\bset}[1]{[#1]}
\ExplSyntaxOn
\NewDocumentCommand \lip {o D||{A} m D||{B} m }
{
\IfNoValueTF{#1}
{ #2^#3, #4^#5 }
{ #1{#2^#3, #4^#5} }
}
\NewDocumentCommand \slip {} { \lip[\eset] }
\NewDocumentCommand \blip {} { \lip[\bset] }
\ExplSyntaxOff
\begin{document}
\[\lip |a| {1} |b| {2}\]
\[\slip |a| {1} |b| {2}\]
\[\blip |a| {1} |b| {2}\]
\end{document}