编写宏

编写宏

我有一个用 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}

在此处输入图片描述

相关内容