如何实现 \ifxcase:\ifx 的大小写等效项

如何实现 \ifxcase:\ifx 的大小写等效项

我正在寻找 的等效案例\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在其他地方定义并用作\caseand\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}

相关内容