6

I am not understanding how to use the t type parameter with xparse's \NewDocumentCommand.

I am trying to define a macro that accepts one optional parameter, but the optional parameter is specified as a subscript using an underscore. That is I want to define something that behaves like

\def\MyMacro_#1{A_{\textcolor{red}{#1}}}

but with the subscript being optional. I need #1 to be parameter not simply a subscript added outside of the macro (i.e., \MyMacro must be the one that invokes the actual subscript)

The MWE below yields:

enter image description here

but the desired result is:

enter image description here

with the color and subscript applied by \MyMacro.

Notes:

  • The documentation states that t is

    An optional ⟨token⟩, which will result in a value \BooleanTrue if ⟨token⟩ is present and \BooleanFalse otherwise. Given as t⟨token⟩.

    but no examples are given.

Code:

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}

%\newcommand*{\MyMacro}[1][]{}% Ensure we are not overwriting anything
%\def\MyMacro_#1{A_{\testcolor{red}{#1}}}% <-- Want this behavior but with the _{#1} being optional

\NewDocumentCommand{\MyMacro}{t_}{%
    \IfBooleanTF{#1}{%
        A_{\textcolor{red}{#1}}
    }{%
        \mathbf{A}
    }%
}

\begin{document}

With a subscript: $\MyMacro_{\pi}$ 

Without any subscript: $\MyMacro$ 

\end{document}
2
  • Aren't you just trying to input #1 -- which is _ into \textcolor. Actually, your _ must be followed by a second argument, which is \pi here
    – user31729
    Commented Jul 13, 2016 at 21:21
  • Related Question: Extending xparse for new arguments. Commented Jul 14, 2016 at 6:18

3 Answers 3

3

The t argument specifier is a generalization of s that is the same as t*.

I don't think it's the right approach, but if you really want to go this way:

\NewDocumentCommand{\MyMacro}{t_}{A\IfBooleanT{#1}{\MyMacroAux}}
\NewDocumentCommand{\MyMacroAux}{m}{_{\textcolor{red}{#1}}}

Full example:

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}

\NewDocumentCommand{\MyMacro}{t_}{A\IfBooleanT{#1}{\MyMacroAux}}
\NewDocumentCommand{\MyMacroAux}{m}{_{\textcolor{red}{#1}}}

\begin{document}

With a subscript: $\MyMacro_{\pi}$

Without any subscript: $\MyMacro$

\end{document}

enter image description here

In case the first part also depends on the presence of _:

\NewDocumentCommand{\MyMacro}{t_}{%
  \IfBooleanTF{#1}
    {A\MyMacroAux}
    {\mathbf{A}}%
}
\NewDocumentCommand{\MyMacroAux}{m}{_{\textcolor{red}{#1}}}
3
  • What you would recommend as the right approach? Commented Jul 13, 2016 at 21:56
  • @PeterGrill A command for red subscripts, probably.
    – egreg
    Commented Jul 13, 2016 at 21:59
  • Oh, I see what you mean. The actual use case is a bit more complicated, but agree that if all was trying to was to color the subscripts a specific macro to do that would be the right way. Commented Jul 13, 2016 at 22:01
5

Looks like an e-type argument to me

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}

\NewDocumentCommand\MyMacro{e_}{%
    \IfNoValueTF{#1}{%
        \mathbf{A}
    }{%
        A_{\textcolor{red}{#1}}
    }%
}

\begin{document}

With a subscript: $\MyMacro_{\pi}$ 

Without any subscript: $\MyMacro$ 

\end{document}
12
  • If you are adding % to those lines even in math mode, you are missing two :) I like that k has been implemented.
    – Manuel
    Commented Jul 13, 2016 at 21:50
  • Works great, except that k is marked as experimental so hesitant to use it at this time. Commented Jul 13, 2016 at 21:52
  • @PeterGrill Joseph is allowed to experiment with his own code though:-) Commented Jul 13, 2016 at 22:32
  • @DavidCarlisle: :-). I just meant it as a reason that this was not the accepted answer. Commented Jul 13, 2016 at 23:52
  • 1
    @Manuel This type of discussion is the reason the interface is down as experimental
    – Joseph Wright
    Commented Jul 14, 2016 at 7:28
2

Is this what is meant?

The t_ check works, but \textcolor{red}{#1} will try to typeset _ then, so {\pi} never enters the subscript.

In my opinion, the {\pi} is an 2nd optional argument. Either use g or the G{} type to grab this.

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{xcolor}

%\newcommand*{\MyMacro}[1][]{}% Ensure we are not overwriting anything
%\def\MyMacro_#1{A_{\testcolor{red}{#1}}}% <-- Want this behavior but with the _{#1} being optional

\NewDocumentCommand{\MyMacro}{t_G{}}{%
  \IfBooleanTF{#1}{%
    A_{\textcolor{red}{#2}}
  }{%
    \mathbf{A}
  }%
}

\begin{document}

With a subscript: $\MyMacro_{\pi}$ 

Without any subscript: $\MyMacro$ 

\end{document}

enter image description here

3
  • Yep that worlds fork the given MW. However, I tend to avoid trailing optional parameters as they have issues if there are extra spaces. Example $\MyMacro _ {\pi}$ fails with the use G. Commented Jul 13, 2016 at 21:56
  • @PeterGrill: Well, the given MW was too minimal then, wasn't it? ;-)
    – user31729
    Commented Jul 14, 2016 at 13:21
  • :-) It was a TMWE. Commented Jul 14, 2016 at 19:41

You must log in to answer this question.

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