我已经设置了一些pgfkeys
键,并尝试从外部文件加载设置。我知道在 LaTeX 中加载文件的唯一方法是\input
,但这似乎不是正确的选择。
\begin{filecontents}{keys.def}
key = Hellò
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgfkeys}
\pgfkeys{
/mykeys/key/.initial = {}
}
\pgfqkeys{/mykeys}{
\input{keys.def}
}
\begin{document}
Values: \pgfkeysvalueof{/mykeys/key}
\end{document}
该代码无法编译,并出现有关未定义控制序列的可怕消息。
将文件内容提供给的正确方法是什么\pgfkeys
?
笔记:我在 MWE 中包含了inputenc
一个重音字母,因为在实际用例中,键将是本地化字符串,我需要确保没有编码问题。
答案1
使用 进行概念验证expl3
。这将一次读取输入文件的一个位,并将该位提供给密钥设置函数。据推测,没有 也可以实现类似的事情expl3
,但这种方法很简单。
\begin{filecontents}{keys.def}
key = Hellò
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\ior_new:N \l_gigabytes_stream
\ior_open:Nn \l_gigabytes_stream { keys.def }
\ior_get:NN \l_gigabytes_stream \l_tmpa_tl
\keys_define:nn { gigabytes / mykeys }
{
key .tl_set:N = \l_gigabytes_mykeys_key_tl,
key .initial:n = ,
}
\ior_map_inline:Nn \l_gigabytes_stream
{
\keys_set:nn { gigabytes / mykeys } { #1 }
}
\ior_close:N \l_gigabytes_stream
\l_gigabytes_mykeys_key_tl
\ExplSyntaxOff
\end{document}
结果并不令人兴奋,但却是正确的:
编辑
请注意,虽然这显然有点疯狂,但如果您愿意,可以使用它来设置 PGF 密钥。例如,下面的代码产生与上述代码相同的输出。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{expl3,pgfkeys}
\begin{document}
\pgfkeys{
gigabytes pgf/mykeys/.cd,
key/.initial={},
}
\ExplSyntaxOn
\ior_new:N \l_gigabytes_stream
\ior_open:Nn \l_gigabytes_stream { keys.def }
\ior_map_inline:Nn \l_gigabytes_stream
{
\pgfkeys { gigabytes~pgf / mykeys/.cd, #1}
}
\ior_close:N \l_gigabytes_stream
\pgfkeysvalueof{gigabytes~pgf /mykeys / key}
\ExplSyntaxOff
\end{document}