将命令输出作为参数传递给其他命令

将命令输出作为参数传递给其他命令

我在命令的帮助下创建了某种 switch 语句\ifthenelse。现在,我想将其输出传递给另一个命令。在我的示例中,我想用数字指定的颜色为每个句子着色。我的代码是:

\documentclass{article}

\usepackage{ifthen}
\usepackage{color}

\newcommand{\num}{1}

 \newcommand{\mySwitch}[1]{
 \ifthenelse{#1=1}{red}{        % color no 1 is red
 \ifthenelse{#1=2}{blue}{}}}    % color no 2 is blue ... and so on 

\begin{document}

\color{\mySwitch{\num}}
\mySwitch{\num} is the color no \num.

\renewcommand{\num}{2}
\color{\mySwitch{\num}}
\mySwitch{\num} is the color no \num.

\end{document}

我想获得这样的东西:

在此处输入图片描述

但编译的结果是:

在此处输入图片描述

更重要的是,我不断收到许多错误,其中第一个是

缺少 \endcsname,插入 \color{\NoToColor{\num}}。

我认为正确的解决方案应该与命令有关\expandafter,但简单地说

 \expandafter\color\expandafter{\mySwitch{\num}} 

没有结果。我肯定遗漏了什么,但我无法让它工作,也找不到任何类似的例子。请给一些提示。

答案1

我们需要可扩展的 switch 语句。当 egreg 使用时\ExplSyntaxOn ... \ExplSyntaxOff,我可以NormalTeXSyntaxOn ... NormalTeXSynatxOff在我的示例中使用它,因为NormalTeXSyntax它比任何其他语法都更自然。它是 TeX 程序本身的语法。如果你熟悉这个语法,那么你就不需要知道任何其他语法。

我希望有人能够理解我……

\documentclass{article}
\usepackage{color}

% NormalTeXSyntaxON
\def\setcase#1 {\expandafter\def\csname col:#1\endcsname}
\def\mySwitch#1{\expandafter\ifx\csname col:#1\endcsname\relax \coldefault 
                \else \csname col:#1\endcsname\fi}

\def\coldefault {black}    
\setcase 1      {red} 
\setcase 2      {blue}  
\setcase word   {green}

% NormalTeXSyntaxOff

\begin{document}

\newcommand\num{1}
\color{\mySwitch{\num}}
\mySwitch{\num} is the color no \num.

\renewcommand\num{2}
\color{\mySwitch{\num}}
\mySwitch{\num} is the color no \num.

\renewcommand\num{word}
\color{\mySwitch{\num}}
\mySwitch{\num} is the color no \num.

\end{document}

我的意思是,这里接受的解决方案有点过了。\usepackage{xparse}此解决方案中使用的内容为24 个文件,共 16648 行但我的解决方案只需要三条线无需任何附加包。两种解决方案的效果相同。但人们倾向于在这里选择更复杂的解决方案。不幸的是。

答案2

参数\color(当调用时不带可选的颜色空间参数)必须直接扩展为一个字符串,该字符串应该是颜色名称(或xcolor使用时色调规范)。

有几种可用的可扩展 switch 语句。我建议使用expl3

\documentclass{article}
\usepackage{xparse}
\usepackage{color}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\mySwitch}{m}
 {
  \martino_switch:n { #1 }
 }

\cs_new:Npn \martino_switch:n #1
 {
  \str_case:onF { #1 } % expand once the argument
   {
    {1}{red}
    {2}{blue}
   }
   {black} % none of the above
 }
\ExplSyntaxOff

\begin{document}

\newcommand{\test}{1}

\textcolor{\mySwitch{\test}}{Some text}

\renewcommand{\test}{2}
\textcolor{\mySwitch{\test}}{Some text}

\end{document}

在此处输入图片描述

如您所见,添加新案例非常容易。

字符串不仅限于数字:

\documentclass{article}
\usepackage{xparse}
\usepackage{color}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\mySwitch}{m}
 {
  \martino_switch:n { #1 }
 }

\cs_new:Npn \martino_switch:n #1
 {
  \str_case:onF { #1 } % expand once the argument
   {
    {1}{red}
    {2}{blue}
    {zot}{yellow}
   }
   {black} % none of the above
 }
\ExplSyntaxOff

\begin{document}

\newcommand{\test}{1}

\textcolor{\mySwitch{\test}}{Some text}

\renewcommand{\test}{2}
\textcolor{\mySwitch{\test}}{Some text}

\renewcommand{\test}{zot}
\textcolor{\mySwitch{\test}}{Some text}

\renewcommand{\test}{blurb}
\textcolor{\mySwitch{\test}}{Some text}

\end{document}

在此处输入图片描述

相关内容