我正在寻找 的等效案例\ifx
。因此,当我嵌套使用 时,\ifx
以类似于以下语法的形式指定它会更清晰:
\newcommand*{\ColorSymbol}[1]{%
\ifxcase#1{%
{\exists}{\color{red}#1}%
{\ge}{\mathrel{\color{orange}#1}}%
{\le}{\mathrel{\color{blue}#1}}%
}[#1\footnote{Unknown symbol: \string#1}]%
}%
而不是\ifx
像在 MWE 中那样嵌套。
笔记:
- 不要求语法与之相同,只是比 MWE 更容易阅读。
梅威瑟:
\documentclass{article}
\usepackage{mathtools}
\usepackage{xstring}
\usepackage{xcolor}
\newcommand*{\ColorSymbol}[1]{%
\ifx#1\exists
{\color{red}#1}%
\else
\ifx#1\ge
\mathrel{\color{orange}#1}%
\else
\ifx#1\le
\mathrel{\color{blue}#1}%
\else
#1%
\footnote{Unknown symbol: \string#1}%
\fi
\fi
\fi
}%
%%% Would prefer some case like syntax:
%\newcommand*{\ColorSymbol}[1]{%
% \ifxcase#1{%
% {\exists}{\color{red}#1}%
% {\ge}{\mathrel{\color{orange}#1}}%
% {\le}{\mathrel{\color{blue}#1}}%
% }[#1\footnote{Unknown symbol: \string#1}]%
%}%
\begin{document}
$\ColorSymbol\exists x$
$A \ColorSymbol= B$
$a \ColorSymbol\ge n$,
$x \ColorSymbol\le z$
\end{document}
答案1
我将使用不同的语法(哈希表查找而不是嵌套开关),允许单独声明彩色符号,可能在代码的不同点。
\documentclass{article}
\usepackage{mathtools}
\usepackage{xcolor}
\newcommand*{\ColorSymbol}[1]{%
\expandafter\ifx\csname CS-\string#1\endcsname\relax
#1\footnote{Unknown symbol: \string#1}%
\else
\csname CS-\string#1\expandafter\endcsname
\fi}
\newcommand\defColorSymbol[3][]{%
\expandafter\def\csname CS-\string#2\endcsname{%
#1{\color{#3}#2}}}
\defColorSymbol\exists{red}
\defColorSymbol[\mathrel]\ge{orange}
\defColorSymbol[\mathrel]\le{blue}
\begin{document}
$\ColorSymbol\exists x$
$A \ColorSymbol= B$
$a \ColorSymbol\ge n$,
$x \ColorSymbol\le z$
\end{document}
答案2
您正在加载xstring
已提供该功能的内容:
\documentclass{article}
\usepackage{xcolor}
\usepackage{xstring}
\newcommand{\ColorSymbol}[1]{%
\IfStrEqCase*{#1}{%
{\exists}{\textcolor{red}{#1}}%
{\ge}{\mathrel{\textcolor{orange}{#1}}}%
{\le}{\mathrel{\textcolor{blue}{#1}}}%
}[#1\footnote{Unknown symbol: \string#1}]%
}
\begin{document}
$\ColorSymbol\exists x$
$A \ColorSymbol= B$
$a \ColorSymbol\ge n$,
$x \ColorSymbol\le z$
\end{document}
与之xparse
类似:
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ColorSymbol}{m}
{
\str_case:nnF { #1 }
{
{\exists}{\textcolor{red}{#1}}
{\ge}{\mathrel{\textcolor{orange}{#1}}}
{\le}{\mathrel{\textcolor{blue}{#1}}}
}
{#1\footnote{Unknown symbol: \string#1}}
}
\ExplSyntaxOff
\begin{document}
$\ColorSymbol\exists x$
$A \ColorSymbol= B$
$a \ColorSymbol\ge n$,
$x \ColorSymbol\le z$
\end{document}
答案3
还有另一种选择,这是一种方法松散地基于C
语法。
\documentclass{article}
\usepackage{mathtools}
\usepackage{xstring}
\usepackage{xcolor}
\makeatletter
\newcommand\switch[3][\ifx]{%provide switch-case structure with an if
\def\@parsed@ifs{}%contains the arguments recast to standard \if\else\fi
\def\@allfis{}%contains all of the \fis
\def\case@with@option[##1]##2##3{%process a case with optional relation ##1
\g@addto@macro\@allfis{\fi}%
\g@addto@macro\@parsed@ifs{#1#2##1##2##3\else}}%
\def\case{\@ifnextchar[{\case@with@option}{\case@with@option[]}}%
\def\default##1{\g@addto@macro\@parsed@ifs{##1}}%
#3\expandafter\@parsed@ifs\@allfis%
}
\makeatother
%%% Would prefer some case like syntax:
\newcommand*{\ColorSymbol}[1]{%
\switch{#1}{%
\case{\exists}{{\color{red}#1}}%
\case{\ge}{\mathrel{\color{orange}#1}}%
\case{\le}{\mathrel{\color{blue}#1}}%
\default{#1\footnote{Unknown symbol: \string#1}}}
}%
\begin{document}
$\ColorSymbol\exists x$
$A \ColorSymbol= B$
$a \ColorSymbol\ge n$,
$x \ColorSymbol\le z$
\end{document}
条件保留为选项(\if
、\ifx
、\ifnum
和\ifdim
均可)。为了支持使用关系的用户,\case
使用可选参数定义。例如,two
是来自以下结果:
\def\testnumber{2}%
\def\anothernumber{5}%
\switch[\ifnum]{\testnumber}{%
\case[=]{0}{zero}%
\case[=]{1}{one}%
\case[=]{2}{two}%
\case[=]{\anothernumber}{another number}%
\default{not 0, 1, or 2}}
\case
显然,如果或\default
在其他地方定义并用作\case
and\default
语句中的参数(例如),则此方法将失败。\case{\exists}{\default\case}
出于同样的原因,嵌套\switch
调用也会出现问题。因此,这种方法是有限的。
答案4
语法稍微不同(我觉得我已经在这个网站上找到了类似的答案, \ifxcase
但我现在找不到它......)
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\long\def\xintdothis #1#2\xintorthat #3{\fi #1}%
\makeatletter
\let\xintorthat \@firstofone
\makeatother
\newcommand*{\ColorSymbol}[1]{%
\ifx#1+\xintdothis{\mathbin{\color{red}+}}\fi
\ifx#1\ge\xintdothis{\mathrel{\color{orange}\ge}}\fi
\ifx#1\le\xintdothis{\mathrel{\color{blue}\le}}\fi
\xintorthat{#1\footnote{Unknown symbol: \string#1}}%
}%
\begin{document}
$a\ColorSymbol+ b$, $a\ColorSymbol\ge b$, $a\ColorSymbol\le b$, $a\ColorSymbol\infty b$
\end{document}