全局键值字典

全局键值字典

是否有任何包可以实现提供键值映射的数据结构(类似于 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”设置*全局*键值?

相关内容