我创建了一个自定义命令,其中包含一个强制参数和四个可选参数
\DeclareDocumentCommand \quote { m o o o o} {%
\glqq\textit{#1}\grqq\
\IfValueT {#2 \OR #3 \OR #4 \OR #5} {(}%
\IfValueT {#2}{p. #2}%
\IfValueT {#3}{, ll. #3}%
\IfValueT {#4}{, \textsc{#4}}%
\IfValueT {#5}{, #5}%
\IfValueT {#2 \OR #3 \OR #4 \OR #5} {)}%
}
但使用
\quote{something}
返回
我做错了什么,是的,我知道代码还有一些其他缺陷,因为它应该是一个引用。
答案1
没有 的\OR
多重测试\IfValueTF
。您可以实现一个:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\QUOTE}{moooo}
{
\glqq\textit{#1}\grqq
\berserker_quote_if_novalue:nnnnF { #2 } { #3 } { #4 } { #5 } { ~( }
\IfValueT{#2}{p.~#2}%
\IfValueT{#3}{,~ll.~#3}%
\IfValueT{#4}{,~\textsc{#4}}%
\IfValueT{#5}{,~#5}%
\berserker_quote_if_novalue:nnnnF { #2 } { #3 } { #4 } { #5 } { ) }
}
\prg_new_conditional:Nnn \berserker_quote_if_novalue:nnnn { TF,T,F,p }
{
\bool_lazy_all:nTF
{
{\tl_if_novalue_p:n { #1 }}
{\tl_if_novalue_p:n { #2 }}
{\tl_if_novalue_p:n { #3 }}
{\tl_if_novalue_p:n { #4 }}
}
{ \prg_return_true: }
{ \prg_return_false: }
}
\ExplSyntaxOff
\begin{document}
\QUOTE{I said}
\QUOTE{I said}[a]
\QUOTE{I said}[a][b]
\QUOTE{I said}[a][b][c]
\QUOTE{I said}[a][b][c][d]
\end{document}
警告expl3
由于定义不幸漏掉,该功能不适用于 的当前版本。应该正在修复中。
更好的方法是使用键值语法。使用更有意义的名称,因为参数应该包含什么并不十分清楚。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\QUOTE}{mo}
{
\glqq\textit{#1}\grqq
\group_begin:
\IfValueT{#2}{ ~( \berserker_quote_options:n { #2 } ) }
\group_end:
}
\keys_define:nn { berserker/quote }
{
p .tl_set:N = \l__berserker_quote_page_tl,
l .tl_set:N = \l__berserker_quote_lines_tl,
n .tl_set:N = \l__berserker_quote_note_tl,
c .tl_set:N = \l__berserker_quote_comment_tl,
}
\cs_new_protected:Nn \berserker_quote_options:n
{
\keys_set:nn { berserker/quote } { #1 }
\tl_if_empty:NF \l__berserker_quote_page_tl {p.~\l__berserker_quote_page_tl}
\tl_if_empty:NF \l__berserker_quote_lines_tl {,~ll.~\l__berserker_quote_lines_tl}
\tl_if_empty:NF \l__berserker_quote_note_tl {,~\textsc{\l__berserker_quote_note_tl}}
\tl_if_empty:NF \l__berserker_quote_comment_tl {,~\l__berserker_quote_comment_tl}
}
\ExplSyntaxOff
\begin{document}
\QUOTE{I said}
\QUOTE{I said}[p=a]
\QUOTE{I said}[p=a,l=b]
\QUOTE{I said}[p=a,l=b,n=c]
\QUOTE{I said}[p=a,l=b,n=c,c=d]
\end{document}