I want to define a new macro that gets an optional argument X and a citation key Y. If only Y is present it prints


If, however, also X is present it prints

X, \cite{Y}

This should in principle be done with the simple syntax of \newcommand which allows one optional argument with a default value which could be empty. But how do I get rid of the straying comma? Or maybe there is a way to do this with the citation command?

I've seen more general answers for the question of how to define a new command which behaves differently with and without an optional argument, but these answers seem to be quite more sophisticated than what I need here.

  • I should emphasize that I'm looking for a simpler solution than the general "if-branch" approach.
    – Ariel
    Commented Jul 13, 2015 at 11:05
  • 2
    I don't understand why you want a version without if statement but I added a possible solution to my answer
    – cgnieder
    Commented Jul 13, 2015 at 17:10
  • It is just that my macro is already quite complicated (I just gave a minimal example to explain my need), and I don't want to clutter it even further with an extra \if construction. Your second solution is exactly what I was looking for.
    – Ariel
    Commented Jul 14, 2015 at 7:47
  • Note that if you are really looking into this in the context of biblatex's citation commands, the pre-note does something quite similar: \cite[Cf.][]{sigfridsson}.
    – moewe
    Commented Apr 5, 2019 at 7:11

2 Answers 2


You can test if the optional argument is empty. How to check if a macro value is empty or will not create text with plain TeX conditionals? gives several possible ways how to do that. I picked one here:


% traditional solution:

% without if statement:







It's really easy with xparse:


    {% no optional argument in the input
    {% optional argument has been given
     #1,~\cite{#2}% note the tie

The list of arguments, instead of being a number, says

o for an optional argument without a default value
m for a mandatory argument

The call \ocite{abc} will follow the “true” branch of \IfNoValueTF{#1}; conversely \ocite[X]{abc} will follow the “false” branch.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .