乳胶中类似 Python 的字典?

乳胶中类似 Python 的字典?

是否有命令/宏latex可以生成python类似词典,例如

var = {a:1, b:2, c:3}

然后返回\var{b} 2

答案1

您可以使用属性列表来模拟它:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\DefineDictionary}{mm}
 {
  \arclupus_dict_def:nn { #1 } { #2 }
 }

\seq_new:N \l__arclupus_dict_temp_seq

\cs_new_protected:Nn \arclupus_dict_def:nn
 {
  \prop_gclear_new:c { g_arclupus_#1_dict_prop }
  \clist_map_inline:nn { #2 }
   {
    \__arclupus_dict_add:nn { #1 } { ##1 }
   }
  \cs_new:cpn { #1 } ##1 { \prop_item:cn { g_arclupus_#1_dict_prop } { ##1 } }
 }

\cs_new_protected:Nn \__arclupus_dict_add:nn
 {
  \seq_set_split:Nnn \l__arclupus_dict_temp_seq { / } { #2 }
  \prop_gput:cxx { g_arclupus_#1_dict_prop }
   {
    \seq_item:Nn \l__arclupus_dict_temp_seq { 1 }
   }
   {
    \seq_item:Nn \l__arclupus_dict_temp_seq { 2 }
   }
 }
\cs_generate_variant:Nn \prop_gput:Nnn { cxx }
\ExplSyntaxOff

\DefineDictionary{var}{a/1, b/2, c/3}

\begin{document}

\var{a}

\var{c}

\var{b}

\end{document}

\DefineDictionary字典名称和数据作为参数。创建一个新的属性列表(或清除现有的属性列表);然后将第二个参数中的每个项目拆分为/属性列表中的项目。最后,创建一个具有字典名称的宏来检索数据。

带有冒号的版本稍微棘手一些,因为我们不能使用文字:进行拆分操作。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\DefineDictionary}{mm}
 {
  \arclupus_dict_def:nn { #1 } { #2 }
 }

\seq_new:N \l__arclupus_dict_temp_seq

\cs_new_protected:Nn \arclupus_dict_def:nn
 {
  \prop_gclear_new:c { g_arclupus_#1_dict_prop }
  \clist_map_inline:nn { #2 }
   {
    \__arclupus_dict_add:nn { #1 } { ##1 }
   }
  \cs_new:cpn { #1 } ##1 { \prop_item:cn { g_arclupus_#1_dict_prop } { ##1 } }
 }

\cs_new_protected:Nn \__arclupus_dict_add:nn
 {
  \seq_set_split:NVn \l__arclupus_dict_temp_seq \c_colon_str { #2 }
  \prop_gput:cxx { g_arclupus_#1_dict_prop }
   {
    \seq_item:Nn \l__arclupus_dict_temp_seq { 1 }
   }
   {
    \seq_item:Nn \l__arclupus_dict_temp_seq { 2 }
   }
 }
\cs_generate_variant:Nn \seq_set_split:Nnn { NV }
\cs_generate_variant:Nn \prop_gput:Nnn { cxx }
\ExplSyntaxOff

\DefineDictionary{var}{a:1, b:2, c:3}

\begin{document}

\var{a}

\var{c}

\var{b}

\end{document}

如果您还需要将宏传递给\var,则将行更改为

  \cs_new:cpn { #1 } ##1 { \prop_item:cn { g_arclupus_#1_dict_prop } { ##1 } }

进入

  \cs_new:cpn { #1 } ##1 { \prop_item:cf { g_arclupus_#1_dict_prop } { ##1 } }

\ExplSyntaxOff并在魔法线之前添加

\cs_generate_variant:Nn \prop_item:Nn { cf }

定义所需的变体。

然后,扩展为字符串的宏将出现在新创建的宏的参数中(\var在示例中)。请注意,它\var仍然是完全可扩展的。

答案2

值得一提的是,ConTeXt 具有内置数据结构,相当于一本字典。具体来说,

\setvariables
    [var]
    [
      a=1,
      b=2,
      c=3,
    ]

\getvariable{var}{a}然后您可以使用等访问变量。

使用\def\abc{a} \getvariable{var}{\abc}也有效。

相关内容