如果命令没有可选参数,则吞噬标点符号

如果命令没有可选参数,则吞噬标点符号

我想定义一个新的宏,它获取一个可选参数 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}将遵循的“假”分支。

相关内容