我在命令的帮助下创建了某种 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}