用于字符串比较的可扩展不区分大小写的开关大小写

用于字符串比较的可扩展不区分大小写的开关大小写

在过去的几个小时里,我一直在尝试为我的问题找到一个好的解决方案,但遗憾的是,所有的解决方案都不够好。我想为一个函数创建一个 switchcase(实际上,我需要很多不同的类型,而不仅仅是一种语言,但我将它作为一个具体的例子添加进来。)

我理想的 switch case 函数具有以下功能

  • 它接受命令作为输入(完全可扩展)
  • 不区分大小写

下面的代码是一个 switch case,但它不符合上述两个要求。任何能找到正确方法的帮助都非常欢迎。

\documentclass{article}

\usepackage[norsk,nynorsk,british,samin]{babel}
\usepackage{pdftexcmds}

% This allows the user to switch languages using a myriad of synonyms
% The four provided languages are: English, Norsk, Nynorsk and Samin
\makeatletter
\newcommand*{\selectLang}[1]{%
  \stringcases%
  {#1}%
  {%
    % English synonyms
    {english}{\selectlanguage{british}}%
    %
    % Norsk (Bokmål) synonyms
    {norsk}{\selectlanguage{norsk}}%
    %
    % Nynorsk synonyms
    {nynorsk}{\selectlanguage{nynorsk}}%
    %
    % Samin synonyms
    {samisk}{\selectlanguage{samin}}%
    {samin}{\selectlanguage{samin}}%
  }%
  {}%
}

% Helper functions to create the switch case above
\newcommand{\stringcases}[3]{%
  \romannumeral
  \str@case{#1}#2{#1}{#3}\q@stop
}
\newcommand{\str@case}[3]{%
  \ifnum\pdf@strcmp{\unexpanded{#1}}{\unexpanded{#2}}=\z@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\str@case@end{#3}}
  {\str@case{#1}}%
}
\newcommand{\str@case@end}{}
\long\def\str@case@end#1#2\q@stop{\z@#1}
\makeatother

\newcommand{\temptwo}{nynorsk}

\begin{document}

\newcommand{\temp}{\temptwo}

\languagename

\selectLang{english}

\languagename % Displays english as it should

\selectLang{Norsk}

\languagename % This should display norsk

\selectLang{\temp}

\languagename % This should display nynorsk

\end{document}

答案1

在 的帮助下expl3,这是可扩展的(如果案例的代码是可扩展的,那么 的正常定义\selectlanguage就不是)。

编辑:正如指出的那样@JosephWright\str_foldcase:e用于此类任务。一般经验法则:处理时使用\str_foldcase:n,打印文本时使用\str_lowercase:n

\documentclass[]{article}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \selectLang { m }
  {
    \str_case_e:nn { \str_foldcase:e { #1 } }
      {
        { english } { \selectlanguage{british} }
        { norsk }   { \selectlanguage{norsk} }
        { nynorsk } { \selectlanguage{nynorsk} }
        { samisk }  { \selectlanguage{samisk} }
        { samin }   { \selectlanguage{samin} }
      }
  }
\cs_generate_variant:Nn \str_foldcase:n { e }
\ExplSyntaxOff

\renewcommand\selectlanguage{} % just to show that it works

\begin{document}
Chosen language: \selectLang{EnGlIsH}

\def\foo{NOrsK}
Chosen language: \selectLang{\foo}
\end{document}

相关内容