将 PGFKey 保存到 aux 文件

将 PGFKey 保存到 aux 文件

我想将特定键(来自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}

在此处输入图片描述

相关内容