expl3 序列名称在写入 .aux 文件时被替换为 \s__seq

expl3 序列名称在写入 .aux 文件时被替换为 \s__seq

我正在努力适应这个 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

相关内容