将“s”(星号)参数传递给宏

将“s”(星号)参数传递给宏

我想在调用新宏时传递例如s或参数。我知道这可以通过使用等几次来完成,但我想知道是否可以在不评估它们的情况下完成。t\IfBooleanTF#1

我的MWE

\documentclass{article}
\usepackage{expl3,xparse}

\newsavebox\mysavebox

\NewDocumentCommand\onehand{st+m}{%
  \sbox{\mysavebox}{\hand {#1} {#2} {#3}}%
}

\NewDocumentCommand\hand{st+m}{%
   \IfBooleanTF#1{1}{}%
   \IfBooleanTF#2{2}{}%
   #3%
}
\begin{document}
\hand{X}\\\hand*{X}\\\hand+{X}\\\hand*+{X}\\[2em]
\onehand{X}\usebox{\mysavebox}\\
\onehand*{X}\usebox{\mysavebox}\\
\onehand+{X}\usebox{\mysavebox}\\
\onehand*+{X}\usebox{\mysavebox}
\end{document}

我也尝试过不使用括号,\hand#1#2{#3} 但是这会产生

X
1 X
2X
12X
X
*X
+X
*+X

答案1

通常,使用这种方式不是一个好主意xparse。无论如何,您必须将*或传递+\hand,而不是#1#2

\documentclass{article}
\usepackage{expl3,xparse}

\NewDocumentCommand\onehand{st+m}{%
  \IfBooleanTF#1%
   {%
    \IfBooleanTF#2{\hand*+{#3}}{\hand*{#3}}%
   }%
   {%
    \IfBooleanTF#2{\hand+{#3}}{\hand{#3}}%
   }%
}

\NewDocumentCommand\hand{st+m}{%
   \IfBooleanTF#1{1}{}%
   \IfBooleanTF#2{2}{}%
   #3%
}
\begin{document}

\noindent
\hand{X}\\\hand*{X}\\\hand+{X}\\\hand*+{X}

\bigskip

\noindent
\onehand{X}\\\onehand*{X}\\\onehand+{X}\\\onehand*+{X}

\end{document}

在此处输入图片描述

答案2

的解析器将和评估为或#1#2并且不再被识别为或,因此看到等,它们被转移到布尔常量中,即稍后以希腊字符显示。xparse\BooleanFalse\BooleanTrue*+\hand{\BooleanTrue}{\BooleanFalse}{X}expl3

最简单的方法是使用moving arguments,即\onehand不指定参数并让其\hand进行评估。

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand\onehand{}{%
  \hand%
}

\NewDocumentCommand\hand{st+m}{%
  \IfBooleanTF{#1}{1}{}%
  \IfBooleanTF{#2}{2}{}%
  #3
}
\begin{document}
\hand{X}

\hand*{X}

\hand+{X}

\hand*+{X}\\[2em]

\onehand{X}

\onehand*{X}

\onehand+{X}

\onehand*+{X}
\end{document}

在此处输入图片描述

相关内容