是否有任何包可以实现提供键值映射的数据结构(类似于 Python 的dict
)?键将是用户输入,可能包含空格和非 ASCII 字符。我希望在全局级别有这样的东西,这样我就可以在宏中添加项目。
如果没有,我将非常感激任何提示或代码片段。
我查看了 的文档keyval
,但不知道该如何将其用于我的目的。另外,我知道 有etoolbox
列表处理功能,也许经过一些工作可以将其变成字典?
答案1
使用键存储值的“经典”方法是使用基于 csname 的方法
\def\addvalue#1#2{\expandafter\gdef\csname my@data@#1\endcsname{#2}}
\def\usevalue#1{\csname my@data@#1\endcsname}
为了允许键中包含任意材料,您可以使用 e-TeX 的\detokenize
,并且如果您愿意,还可以添加对未定义值的测试
\def\addvalue#1#2{\expandafter\gdef\csname my@data@\detokenize{#1}\endcsname{#2}}
\def\usevalue#1{%
\ifcsname my@data@\detokenize{#1}\endcsname
\csname my@data@\detokenize{#1}\expandafter\endcsname
\else
\expandafter\ERROR
\fi
}
这种方法需要每个键一个 csname,这对于非常大的数据集来说可能会很尴尬。这也意味着每次你想使用这种方法时,你最终都要自己做所有的工作。正如已经指出的那样,该etoolbox
包提供了一些数据存储支持。我还要指出 LaTeX3prop
数据结构
\usepackage{expl3}
\ExplSyntaxOn
\prop_new:N \g_my_data_prop
\cs_new_protected:Npn \addvalue #1#2 { \prop_gput:Nnn \g_my_data_prop {#1} {#2} }
\cs_new:Npn \usevalue #1 { \prop_item:Nn \g_my_data_prop {#1} }
\ExplSyntaxOff
这种方法提供了全方位的支持功能,例如测试密钥的存在、计算密钥的总数等等。
答案2
您还可以使用该pgfkeys
库采用略有不同的方法,即使用设计为树结构的键值系统。
首先你要定义一个家庭,
\pgfkeys{/combo/.is family}
然后是钥匙,
\pgfkeys{/combo
left/.store in=\left@c,
left/.default=0,
right/.store in=\right@c
...}
您可以设置默认值:
\def\setdefaults{
\pgfkeys{/combo
left=100,
right=25,
top=30,
bottom=60,
}
}
\setdefaults
并将这些键合并到新命令中:
\newcommand{\putgraphic}[5][\setdefaults]{%
\pgfkeys{/combo #1}
...
}
您可以在以下位置找到基于此方法的完整实现在 Beamer 中使用 overpic 网格裁剪调整大小的图像和https://tex.stackexchange.com/a/45023/963. 有关全局值,请参阅有没有办法使用“pgfkeys”设置*全局*键值?。