是否有命令/宏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}
也有效。