5

I am trying to stress xparse and find something I tried which is not documented anywhere. This code snippet is not compiling and I do not get why.

\documentclass{article}

\usepackage{xparse}

\DeclareDocumentCommand\mycom{gm}{%
  Optional: \IfNoValueTF{#1}{Empty}{#1}\par
  Mandatory: #2}

\begin{document}

\mycom{MAN}

\mycom{OPT}{MAN}

\end{document}

For what I read in the documentation this should produce something like

Optional: Empty
Mandatory: MAN

Optional: OPT
Mandatory: MAN

Did I read the documentation wrongly?

  • I know that using braces for both optional and mandatory argument is not a good practice, but since it is not explicitly forbidden by the documentation I would like to understand why it does not work. – Bruno BEAUFILS Sep 11 '15 at 22:22
3

In the first case the optional argument is found, because there is a brace; then TeX looks for the mandatory argument and the next token is a \par (generated by the blank line), which throws an error, because the mandatory argument is not “long”.

The optional argument should be the second one; it's just a matter of reversing the tests:

\documentclass{article}

\usepackage{xparse}

\DeclareDocumentCommand\mycom{mg}{%
  \IfNoValueTF{#2}
    {Mandatory: #1}
    {Optional: #1; Mandatory: #2}}

\begin{document}

\mycom{MAN}

\mycom{OPT}{MAN}

\end{document}

Don't use g, it's much easier.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.