使用 expl3 中的属性列表

使用 expl3 中的属性列表

我正在尝试使用 expl3 中的属性列表,但是,我有一个非常简单的示例失败了。有人能帮我理解我的错误吗?

\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
% define a propery list
\prop_new:N \my_tooltip_prop
%
\NewDocumentCommand{\CSetA}{mm}{
    \prop_gput:Nnn \my_tooltip_prop {#1} {#2}
}
%
\NewDocumentCommand{\CGetA}{m}{
    \prop_get:NnN \my_tooltip_prop {#1}
}
%
%
% Altenative
%
\cs_new_protected:Npn \CSetB #1#2 {
    \prop_gput:Nnn \my_tooltip_prop {#1} {#2}
}
%
\cs_new:Npn \CGetB #1 {
    \prop_get:NnN \my_tooltip_prop {#1}
}
\ExplSyntaxOff

\begin{document}
\pagestyle{empty}

Hello

%\CSetA{key1}{value1}
%\CGetA{key1} % same error as with \CGetB{key2}

\CSetB{key2}{value2}
\CGetB{key2}

\end{document}

错误信息是

! TeX capacity exceeded, sorry [main memory size=5000000].
\par ->valu
           e2
l.40 \end{document}

我的系统正在运行 Kubuntu 16.10。

答案1

正确的方法是\prop_item:Nn

\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
% define a propery list
\prop_new:N \g_leal_tooltip_prop
%
\NewDocumentCommand{\CSet}{mm}
 {
  \prop_gput:Nnn \g_leal_tooltip_prop {#1} {#2}
 }
%
\NewDocumentCommand{\CGet}{m}
 {
  \prop_item:Nn \g_leal_tooltip_prop {#1}
 }
\ExplSyntaxOff

\begin{document}
\pagestyle{empty}

Hello

\CSet{key1}{value1}
\CGet{key1}

\CSet{key2}{value2}
\CGet{key2}

\end{document}

\prop_item:Nn功能已于 2014-07-17 推出;如果您得到它是未定义的,则您的 TeX 分布落后了。

几乎等效的版本将借助标记列表变量:

\tl_new:N \l_leal_tooltip_temp_tl
\NewDocumentCommand{\CGet}{m}
 {
  \prop_get:NnN \g_leal_tooltip_prop {#1} \l_leal_tooltip_temp_tl
  \tl_use:N \l_leal_tooltip_temp_tl
 }

答案2

在 ConTeXt 中,您可以获得具有高级接口的属性列表。

\starttext

\setvariables
  [tooltip]
  [
    key1=value1,
    key2=value2,
  ]

\getvariable{tooltip}{key1}
\getvariable{tooltip}{key2}

\stoptext

答案3

你可以实现类似我的 ConTeXt 答案使用 LuaLaTeX。为了解析键值列表,我仍然使用utilities.parsers.settings_to_hashConTeXt。为此,我必须导入必要的 ConTeXt 核心文件,即

dofile(kpse.find_file("l-lpeg.lua"))
dofile(kpse.find_file("util-sto.lua"))
dofile(kpse.find_file("util-prs.lua"))

以下代码非常通用,并且具有与 ConTeXt 版本类似的接口。应该很容易重新利用它。

\documentclass{article}

\directlua{
dofile(kpse.find_file("l-lpeg.lua"))
dofile(kpse.find_file("util-sto.lua"))
dofile(kpse.find_file("util-prs.lua"))

uservariables         = uservariables or {}
uservariables.content = uservariables.content or {}

function uservariables.put(namespace,keyvals)
    local input = utilities.parsers.settings_to_hash(keyvals)

    uservariables.content[namespace] = uservariables.content[namespace] or {}

    for k,v in pairs(input) do
        uservariables.content[namespace][k] = v
    end
end

function uservariables.get(namespace,k) 
    tex.sprint(uservariables.content[namespace][k] or "")
end
}

\newcommand\setvariables[2]{%
  \directlua{uservariables.put(\unexpanded{[==[#1]==], [==[#2]==]})}}

\newcommand\getvariable[2]{%
  \directlua{uservariables.get(\unexpanded{[==[#1]==], [==[#2]==]})}}

\begin{document}

\setvariables
  {tooltip}
  {
    key1=value1,
    key2=value2,
  }

\getvariable{tooltip}{key1}
\getvariable{tooltip}{key2}

\end{document}

相关内容