从外部文件加载 pgfkeys 键值?

从外部文件加载 pgfkeys 键值?

我已经设置了一些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}

结果并不令人兴奋,但却是正确的:

结果是“Hellò”

编辑

请注意,虽然这显然有点疯狂,但如果您愿意,可以使用它来设置 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}

相关内容