我正在寻找一种方法来完成以下任务
我想要一个命令
\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 的唯一字符是右花括号}
。