我正在努力适应这个 egreg 的回答但我面临一个非常奇怪的现象。
如下面的 MCE 所示,应该将类似的行写入文件.aux
:
\int_gset:Nn \g_integer_int {#1}
\seq_put_right:Nn \g_integers_seq {#1}
第一个的结果符合预期,但是第二个却\g_integers_seq
发生了变化\s__seq
!
以下是.aux
文件的内容:
\relax
\ExplSyntaxOn
\int_gset:Nn \g_integer_int {1}
\seq_put_right:Nn \s__seq {1}
\ExplSyntaxOff
\ExplSyntaxOn
\int_gset:Nn \g_integer_int {2}
\seq_put_right:Nn \s__seq {2}
\ExplSyntaxOff
你知道发生了什么吗?
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_integers_seq
\int_new:N \g_integer_int
\NewDocumentCommand{\NewInteger}{m}
{
\iow_now:cx { @auxout }
{
\token_to_str:N \ExplSyntaxOn
^^J
\int_gset:Nn \g_integer_int {#1}
^^J
\seq_put_right:Nn \g_integers_seq {#1}
^^J
\token_to_str:N \ExplSyntaxOff
}
}
\ExplSyntaxOff
\begin{document}
\NewInteger{1}
\NewInteger{2}
\end{document}
答案1
\g_integers_seq
不是受保护的命令并且无法在x
扩展中存活。
您只需执行以下操作\iow_now:cn
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \g_integers_seq
\int_new:N \g_integer_int
\NewDocumentCommand{\NewInteger}{m}
{
\iow_now:cn { @auxout }
{
\ExplSyntaxOn
^^J
\int_gset:Nn \g_integer_int {#1}
^^J
\seq_put_right:Nn \g_integers_seq {#1}
^^J
\ExplSyntaxOff
}
}
\ExplSyntaxOff
\begin{document}
\NewInteger{1}
\NewInteger{2}
\end{document}
该.aux
文件将
\relax
\ExplSyntaxOn
\int_gset:Nn \g_integer_int {1}
\seq_put_right:Nn \g_integers_seq {1}
\ExplSyntaxOff
\ExplSyntaxOn
\int_gset:Nn \g_integer_int {2}
\seq_put_right:Nn \g_integers_seq {2}
\ExplSyntaxOff
在您引用的代码中,\iow_now:cx
是通过进行计算所必需的\int_eval:n
。
如果您需要进行计算,则需要使用或\g_integers_seq
来防止扩展。\exp_not:N
\token_to_str:N