我想知道如何将 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
一些评论。
添加
\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 运行中)。出于与上述相同的原因,使用
\iow_now:cx
(的变体\iow_now:Nx
)非常重要,这样它的参数在书写时就能够得到充分的扩展。^^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}