在xparse中将参数从父函数传递给辅助/子函数

在xparse中将参数从父函数传递给辅助/子函数

动机

我正在开发一个自定义\Colour命令/环境。我想要两个强制参数,一个采用逗号分隔的参数,另一个采用主体。我对逗号分隔部分的方法是使用xparse's \SplitArgument。是否可以让父函数将参数传递给其辅助/子函数?

当前版本

\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}

编辑1:感谢 Steven B. Segletes,可以使用expl3/来做到这一点吗xparse

编辑2:为了回应 egreg 的评论,我找到并实施了回答由 Joseph Wright 使用来\newcommand存储变量。

答案1

由于我不会说 Expl3,所以我将修改的工作留给\ColourAux其他人。但在这里,我将展示如何\Colour修改以实现所需的语法。

\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}

在此处输入图片描述

相关内容