![用于字符串比较的可扩展不区分大小写的开关大小写](https://linux22.com/image/401672/%E7%94%A8%E4%BA%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%AF%94%E8%BE%83%E7%9A%84%E5%8F%AF%E6%89%A9%E5%B1%95%E4%B8%8D%E5%8C%BA%E5%88%86%E5%A4%A7%E5%B0%8F%E5%86%99%E7%9A%84%E5%BC%80%E5%85%B3%E5%A4%A7%E5%B0%8F%E5%86%99.png)
在过去的几个小时里,我一直在尝试为我的问题找到一个好的解决方案,但遗憾的是,所有的解决方案都不够好。我想为一个函数创建一个 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}