从小写字符串构建并使用大写 CS

从小写字符串构建并使用大写 CS

我正在寻找一种方法来完成以下任务

我想要一个命令

\setcitation[2]

定义如下

\def\setcitation#1#2{\lowercase{\expandafter\gdef\csname mycommoncitation#1\endcsname}{#2}}

本质上,它的作用是每次使用参数 xXx 和 yyy 调用它时,它都会创建一个新命令

\mycommoncitationxxx

定义为

\yyy

现在,给定一个输入 xxX,我想得到 yyy。那么必须做什么:将 xxX 转换为小写 xxx,调用 \mycommoncitationxxx

我尝试按如下方式进行操作:

\newcommand\getcitation[1]{%
\lowercase{\csuse{mycommoncitation#1}}
}

如下所示:

\newcommand\getcitation[1]{\lowercase{\expandafter\gdef\csname mycommoncitation#1\endcsname}}

但两者都不起作用。

对于第一部分(我的 setcitation 命令的定义),我的解决方案基于从小写字符串构建大写 CS 并赋予它定义

对于第二部分,我还没有找到任何帮助。

完整的示例,还展示了我如何使用这些命令:

\documentclass{article} 
\usepackage{etoolbox} 
\newcommand{\setcitation}[2]{\lowercase{\csdef{mycommoncitation#1}}{#2}} 
\newcommand{\getcitation}[1]{\lowercase{\csuse{mycommoncitation#1}}} 

\newcommand{\getcitationifexistsotherwiseinput}[1]{\lowercase{\ifcsdef{mycommoncitation#1}{\getcitation{#1}}{#1}}}


\begin{document} 
\setcitation{Foo}{Bar} 
\getcitation{Foo} 
\mycommoncitationfoo
\getcitationifexistsotherwiseinput{Foo} %My expectation: Bar
\getcitationifexistsotherwiseinput{foo} %my expectation: Bar
\getcitationifexistsotherwiseinput{boo} %my expectation: boo
%Now I want a command that returns 
% \getcitation{FOO} 

\cite{\getcitation{foo}} %my expectaiton: "undefined citation Bar"
\end{document}

这里,在 \cite{...} 行中事情开始出错。

答案1

您需要一个可扩展的版本\lowercase

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\setcitation}{mm}
 {
  \prop_gput:Nxn \g_bartbog_citations_prop { \str_lowercase:n { #1 } } { #2 }
 }
\DeclareExpandableDocumentCommand{\getcitation}{m}
 {
  \prop_item:Nf \g_bartbog_citations_prop { \str_lowercase:n { #1 } }
 }

\cs_generate_variant:Nn \prop_gput:Nnn { Nx }
\cs_generate_variant:Nn \prop_item:Nn { Nf }
\prop_new:N \g_bartbog_citations_prop
\ExplSyntaxOff

\setcitation{Foo}{Bar} 

\begin{document}
\getcitation{Foo} 
\getcitation{foo} 
\getcitation{FOO} 

\cite{\getcitation{Foo}},
\cite{\getcitation{foo}},
\cite{\getcitation{FOO}}

\begin{thebibliography}{1}

\bibitem{Bar} Whatever

\end{thebibliography}

\end{document}

我使用属性列表来确保紧凑性。

在此处输入图片描述

答案2

我刚刚发布了另一个答案可扩展地更改字母大小写并在 \csname 内使用,无需包

答案可以在以下网址找到https://tex.stackexchange.com/a/349895/118714

该答案包含一个例程\UD@ExpandableLowercase,该例程在两个扩展步骤内将与拉丁字母表的 26 个字母相对应的 26 个 catcode-11(字母)字符标记转换为小写。该例程不需要 eTeX 或类似的扩展。

(!!! 请注意,让 TeX 读取和标记由拉丁字母字符组成的输入通常会产生 catcode-11(字母)字符标记,而扩展\string\meaning\jobmane原语则会提供 catcode-12(其他)字符标记!)

作为(可能不喜欢的)副作用,该例程确实将匹配的 catcode-1-character-tokens 和 catcode-2-character-tokens 对替换为匹配的花括号 catcode-1-brace-tokens 和花括号 catcode-2-brace-tokens 对,即{}

我认为这对于纯 TeX 和 LaTeX2e 来说应该不是问题,因为在这些格式中,通常类别代码为 1 的唯一字符是左花括号{,而类别代码为 2 的唯一字符是右花括号}

相关内容