1

Motivation

I'm working on a custom \Colour command/environment. I'd like to have two mandatory arguments, one taking comma-separated parameters and the second taking the body. My approach for the comma-separated part uses xparse's \SplitArgument. Is it possible to get the parent function to pass an argument to its auxiliary/child function?

Current version

\documentclass{article}
\usepackage{
    xparse,
    amsmath,
    xcolor
}

\ExplSyntaxOn
\NewDocumentCommand{\ColourAux}{m m m m}{
    \newcommand{\Coloured}{\color{#1}#4}
    \tl_if_empty:nTF { #2 } { \newcommand{\Body}{\begin{aligned}\Coloured\end{aligned}} }{
        \str_case:nnF { #2 } {
            { t }{ \newcommand{\Body}{\text{\Coloured}} }
            { i }{ \newcommand{\Body}{\textit{\Coloured}} }
            { b }{ \newcommand{\Body}{\textbf{\Coloured}} }
            { ib }{ \newcommand{\Body}{\textit{\textbf{\Coloured}}} }
            { bi }{ \newcommand{\Body}{\textit{\textbf{\Coloured}}} }
        } {  }
    }
    \tl_if_empty:nTF { #3 } { \Body } { \parbox{#3}{\Body} }
}
\ExplSyntaxOff
\NewDocumentCommand{\Colour}{>{\SplitArgument{3}{,}}m}{\ColourAux#1}

\begin{document}
    \begin{align*}
        & \Colour{red,ib,4cm,the quick brown fox jumps over the lazy dog} \\ % works as desired
        % & \Colour{red,ib,4cm}{the quick brown fox jumps over the lazy dog} \\ % desired syntax
        & \Colour{red,,,\frac{1}{\sqrt{a^2+b^2}}} \\ % works as desired
        % & \Colour{red}{\frac{1}{\sqrt{a^2+b^2}}} % desired syntax
    \end{align*}
\end{document}

Edit 1: with thanks to Steven B. Segletes, is it possible to do this with expl3/xparse?

Edit 2: in response to egreg's comment, I've found and implemented a suggestion from an answer by Joseph Wright to use \newcommand to store variables.

2
  • 1
    Start with avoiding \def at all costs.
    – egreg
    Apr 28, 2021 at 21:47
  • @egreg I had no idea. Why, and what should I use instead?
    – mjc
    Apr 28, 2021 at 21:49

1 Answer 1

1

Since I don't speak Expl3, I will leave the revision of \ColourAux to others. But here, I show how \Colour can be revised to achieve the desired syntax.

\documentclass{article}
\usepackage{
    amsmath,
    xcolor
}

\ExplSyntaxOn
\NewDocumentCommand{\ColourAux}{m m m m}{
    \def\Coloured{\color{#1}#4}
    \tl_if_empty:nTF { #2 } { \def\Body{\begin{aligned}\Coloured\end{aligned}} }{
        \str_case:nnF{#2}{
            { t }{ \def\Body{\text{\Coloured}} }
            { i }{ \def\Body{\textit{\Coloured}} }
            { b }{ \def\Body{\textbf{\Coloured}} }
            { ib }{ \def\Body{\textit{\textbf{\Coloured}}} }
            { bi }{ \def\Body{\textit{\textbf{\Coloured}}} }
        }{}
    }
    \tl_if_empty:nTF { #3 } { \Body } { \parbox{#3}{\Body} }
}
\ExplSyntaxOff
\usepackage{listofitems}
\newcommand\Colour[2]{%
  \readlist*\z{#1,,}%
  \edef\zz{{\z[1]}{\z[2]}{\z[3]}}%
  \expandafter\ColourAux\zz{#2}}


\begin{document}
    \begin{align*}
         & \Colour{red,ib,4cm}{the quick brown fox jumps over the lazy dog} \\ % desired syntax
         & \Colour{red}{\frac{1}{\sqrt{a^2+b^2}}} % desired syntax
    \end{align*}
\end{document}

enter image description here

You must log in to answer this question.

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