xparse 可选参数 IfValueT true 无需参数

xparse 可选参数 IfValueT true 无需参数

我创建了一个自定义命令,其中包含一个强制参数和四个可选参数

\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}

相关内容