将 LaTeX3 变量写入辅助文件并恢复它

将 LaTeX3 变量写入辅助文件并恢复它

我想知道如何将 LaTeX3 变量写入辅助文件并在文档的最开头读入它。这个问题的动机是我想摆脱我的 LaTeX2 计数器并通过 LaTeX3 变量来实现它们。我可以按如下方式写出 LaTeX2 计数器

\AtEndDocument{%
  \immediate\write\@auxout{%
    \string\setcounter{foo}{\number\value{bar}}}
}

但类似的事情

\AtEndDocument{%
  \immediate\write\@auxout{\string\int_set:Nn\l__foo{\l__bar}}
}

不起作用。

有没有针对 LaTeX3 的类似定义?或者现在问这个还为时过早?

答案1

假设您有两个整数变量\g_maxmaier_foo_int和,\l_maxmaier_bar_int并且在文档结束时,您想要保存设置

\int_gset:Nn \g_maxmaier_foo_int { \int_eval:n { \l_maxmaier_bar_int } }

在 aux 文件中,以便foo在下次运行开始时设置变量的值。

您必须将其括在\ExplSyntaxOn和中\ExplSyntaxOff,否则命令将无法正确解释。还请注意,变量的设置foo必须是全局的,因为辅助文件是在组内读取的。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\int_new:N \g_maxmaier_foo_int
\int_new:N \l_maxmaier_bar_int

\NewDocumentCommand{\setbar}{m}
 {
  \int_set:Nn \l_maxmaier_bar_int { #1 }
 }
\NewDocumentCommand{\showfoo}{}
 {
  \int_to_arabic:n { \g_maxmaier_foo_int }
 }

\AtEndDocument
 {
  \iow_now:cx { @auxout }
   {
    \token_to_str:N \ExplSyntaxOn
    ^^J
    \int_gset:Nn \g_maxmaier_foo_int { \int_eval:n { \l_maxmaier_bar_int } }
    ^^J
    \token_to_str:N \ExplSyntaxOff
   }
 }
\ExplSyntaxOff

\begin{document}

The value of \texttt{foo} is \showfoo

\setbar{42}

\end{document}

在此处输入图片描述

aux 文件的内容

\relax 
\ExplSyntaxOn
\int_gset:Nn \g_maxmaier_foo_int {42}
\ExplSyntaxOff

一些评论。

  1. 添加\int_eval:n(或其同义词\int_use:n)是必不可少的,否则 LaTeX 会写

    \int_gset:Nn \g_maxmaier_foo_int { \l_maxmaier_bar_int }
    

    \l_maxmaier_bar_int这将是完全无用的,因为它会在执行时(即读取文件时)分配 current 的值.aux;我们希望修复变量的值在写作时(在之前的 LaTeX 运行中)。

  2. 出于与上述相同的原因,使用\iow_now:cx(的变体\iow_now:Nx)非常重要,这样它的参数在书写时就能够得到充分的扩展。

  3. ^^J当将标记列表写入文件时,标记会生成一个新行.aux。它类似于\n其他编程语言中的。

答案2

我不建议用\int...变量替换 LaTeX2e 计数器(尽管它们\count无论如何都是寄存器),因为这需要文件\ExplSyntaxOn.aux已经有...。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\int_new:N \l_foo_int

\int_new:N \l_bar_int
\int_set:Nn \l_bar_int {100}


\begin{document}
The~value~of~foo~is~\int_use:N \l_foo_int
\makeatletter
\immediate\write\@auxout{\string\int_set:Nn \l_foo_int\expandafter{\int_use:N \l_bar_int}}
\makeatother




\end{document}

相关内容