我想在调用新宏时传递例如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}