动机
我正在开发一个自定义\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}