我想定义一个新的宏,它获取一个可选参数 X 和一个引用键 Y。如果只有 Y 存在,它会打印
\cite{Y}
但是,如果还存在 X,则会打印
X,\cite{Y}
原则上,这应该使用简单的语法来实现,\newcommand
该语法允许一个可选参数具有默认值,默认值可以为空。但是我该如何去掉多余的逗号呢?或者也许有办法用引用命令来实现这一点?
对于如何定义一个在使用和不使用可选参数时行为不同的新命令,我已经看到了更多通用的答案,但这些答案似乎比我在这里需要的要复杂得多。
答案1
您可以测试可选参数是否为空。如何检查宏值是否为空或不会使用纯 TeX 条件创建文本?给出了几种可能的方法。我在这里选了一个:
\documentclass{article}
% traditional solution:
\newcommand*\mycommand[2][]{%
\if\relax\detokenize{#1}\relax
\else
#1,\nobreakspace
\fi
\cite{#2}%
}
% without if statement:
\newcommand*\gobbletwo[2]{}
\newcommand*\myothercommand[2][\gobbletwo]{%
#1,\nobreakspace\cite{#2}%
}
\begin{document}
+\mycommand{foo}+
+\mycommand[bla]{foo}+
+\myothercommand{foo}+
+\myothercommand[bla]{foo}+
\end{document}
答案2
这真的很容易xparse
:
\usepackage{xparse}
\NewDocumentCommand{\ocite}{om}{%
\IfNoValueTF{#1}
{% no optional argument in the input
\cite{#2}%
}
{% optional argument has been given
#1,~\cite{#2}% note the tie
}%
}
参数列表不是数字,而是
o
对于没有默认值的可选参数
m
对于强制参数
调用\ocite{abc}
将遵循的“真”分支\IfNoValueTF{#1}
;反之\ocite[X]{abc}
将遵循的“假”分支。