我想将特定键(来自pgfkeys
)的值保存到aux
我的 LaTeX 文档的文件中。如果这很重要,我正在使用 LuaLaTeX,但 XeLaTeX、pdfLaTeX 和原始 LaTeX(生成dvi
-> ps
-> pdf
)都出现了同样的问题。
这是一个最小(非)工作示例:
\documentclass{standalone}
\usepackage{pgfkeys}
\pgfkeys{/test key/.initial=0}
\begin{document}
\pgfkeysvalueof{/test key}
\makeatletter\protected@write\@auxout{}{\protect\pgfkeys{/test key=2}}\makeatother
\pgfkeysvalueof{/test key}
\end{document}
生成的aux
文件显示写入成功:
\relax
\pgfkeys {/test key=2}
但是,无论我运行(Lua|Xe|pdf|)LaTeX 多少次,显示的值都是“0”和“0”;我试图让它们(至少运行两次后)显示“2”和“2”。
我怎样才能得到我想要的结果?如果可能的话,我真的很想坚持下去pgfkeys
;我是不是走错了路?
答案1
首先,让我们看看latex.ltx
以及它如何读取.aux
文件。为此,我们来看看\document
在 LaTeX 内核中是如何定义的:
\def\document{%
...
\begingroup\@floatplacement\@dblfloatplacement
\makeatletter\let\@writefile\@gobbletwo
\global \let \@multiplelabels \relax
\@input{\jobname.aux}% Reading of the .aux file
\endgroup
\if@filesw
\immediate\openout\@mainaux\jobname.aux
\immediate\write\@mainaux{\relax}%
\fi
...
请注意如何在...范围.aux
内读取文件。\begingroup
\endgroup
第二,由于\pgfkeys
默认情况下,通过本地键进行设置,你必须找到一种方法让它们变得全球化,或者至少在当前范围内生存下来。
.aux
一种可能的方法是使用钩子设置写入的键\@begindocumenthook
:
\makeatletter
\protected@write\@auxout{}{%
\protect\providecommand\protect\@begindocumenthook{}% Make sure \@begindocumenthook is defined
\protect\g@addto@macro\protect\@begindocumenthook{\protect\pgfkeys{/test key=2}}
}
\makeatother
或者也许\AfterGroup
(来自etextools
):
\makeatletter
\protected@write\@auxout{}{%
\protect\AfterGroup{\protect\pgfkeys{/test key=2}}
}
\makeatother
前一种方法类似于发行\AtBeginDocument{\pgfkeys{..}}
,可确保密钥设置在本地document
环境中。 后者确保了同样的效果。
答案2
我找到了相关问题有没有办法使用“pgfkeys”设置*全局*键值?;对于 MWE 和我的实际用例来说,以下方法都非常有效:
\documentclass{standalone}
\usepackage{pgfkeys}
\pgfkeys{/test key/.initial=0}
\begin{document}
\pgfkeysvalueof{/test key}
\makeatletter\protected@write\@auxout{}{{\globaldefs=1\relax\protect\pgfkeys{/test key=2}}}\makeatother
\pgfkeysvalueof{/test key}
\end{document}
然而,我仍然对更优雅的解决方案非常感兴趣。
答案3
你可以利用.aux
你可以利用文件被读入的前保存的令牌\AtBeginDocument
已被执行。
\documentclass[border=4]{standalone}
\usepackage{pgfkeys}
\pgfkeys{/test key/.initial=0}
\makeatletter
% at first reading, set the keys at begin document
\newcommand{\pgfkeysinaux}[1]{%
\AtBeginDocument{\pgfkeys{#1}}%
}
% at end document the command should do nothing
\AtEndDocument{\let\pgfkeysinaux\@gobble}
% a handier interface for writing to the aux file
\newcommand{\writepgfkeys}[1]{%
\write\@auxout{\unexpanded{\pgfkeysinaux{#1}}}%
}
\makeatother
\begin{document}
\pgfkeysvalueof{/test key}
\writepgfkeys{/test key=2}
\pgfkeysvalueof{/test key}
\end{document}