我正在尝试使用 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_hash
ConTeXt。为此,我必须导入必要的 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}