ltproperties 扩展存在问题

ltproperties 扩展存在问题

我正在努力控制使用 ltproperties 记录的代码中的扩展。在下面的示例中,我试图按所述方式记录环境的主体,而不进行扩展(就像使用 一样\exp_not:n)。当然,要使用 ltproperties,首先需要将其存储在变量中,因此我\exp_not:V在 的第四个参数中使用了 变量\property_new:nnnn

\documentclass{article}

\ExplSyntaxOn
\tl_new:N \l__recordenv_contents_tl

\property_new:nnnn { recordenv/contents } { now } { }
  { \exp_not:V \l__recordenv_contents_tl }

\NewDocumentEnvironment{recordenv}{ m +b }
  {
    \tl_set:Nn \l__recordenv_contents_tl { #2 }
    \tl_show:N \l__recordenv_contents_tl
    \property_record:nn { #1-recordenv } { recordenv/contents }
  }
  {}
\ExplSyntaxOff

\begin{document}

\section{First section}

\begin{recordenv}{foo}
some text and \thesection
\end{recordenv}

\section{Second section}

\end{document}

如果我检查日志,tl 变量包含我想要的内容:

> \l__recordenv_contents_tl=some text and \thesection

然而辅助文件包含

\relax 
\@writefile{toc}{\contentsline {section}{\numberline {1}First section}{1}{}\protected@file@percent }
\new@label@record{foo-recordenv}{{recordenv/contents}{some text and 2}}
\@writefile{toc}{\contentsline {section}{\numberline {2}Second section}{1}{}\protected@file@percent }
\gdef \@abspage@last{1}

因此,当写入辅助时,主体仍在扩展,因为\thesection变成了数字。此外,这种扩展发生在 shipout 处,因为数字\thesection扩展为 2,而不是您预期的 1,因为该属性是用 设置的now

现在,我想这可能和这个问题我问了 中的扩展\addtocontents。那里的问题是发生了两个单独的扩展,因此\exp_not:n需要添加一个额外的扩展。但是,这\exp_not:n { \exp_not:V \l__recordenv_contents_tl }只会导致辅助参数为空,所以我认为这不是这里发生的情况。我也试过了,\exp_not:o { \l__recordenv_contents_tl }但效果与 相同\exp_not:V

我的问题是

  1. 为什么 tl 变量在 V 扩展后会发生扩展,以及
  2. 为什么在 shipout 上会发生第二次扩张?

添加

我想我现在明白了为什么\exp_not:Valone 不能按我想要的方式工作,以及为什么\exp_not:n { \exp_not:V <tlvar> }会失败。内容在定义时展开一次,剥离\exp_not:n,然后在 shipout 期间写入文件时再次展开,此时<tlvar>为空。这是正确的吗?查看 ltproperties 代码,我仍然不明白为什么在所有属性\iow_shipout_x:Nx中使用,即使是那些带有 setpoint 的属性。\property_record:nnnow

答案1

LaTeX使用执行完全扩展(但保留声明为 robust)的命令在.aux文件上进行写入。\protected@write

您需要在不同的层面上保护内容不被扩展。

\documentclass{article}

\ExplSyntaxOn
\tl_new:N \l__recordenv_contents_tl

\property_new:nnnn { recordenv/contents } { now } { }
  { \exp_not:V \l__recordenv_contents_tl }

\NewDocumentEnvironment{recordenv}{ m +b }
  {
    \tl_set:Nn \l__recordenv_contents_tl { \exp_not:n { #2 } }
    %\tl_show:N \l__recordenv_contents_tl
    \property_record:nn { #1-recordenv } { recordenv/contents }
  }
  {}
\ExplSyntaxOff

\begin{document}

\section{First section}

\begin{recordenv}{foo}
some text and \thesection
\end{recordenv}

\section{Second section}

\end{document}

文件.aux

\relax 
\@writefile{toc}{\contentsline {section}{\numberline {1}First section}{1}{}\protected@file@percent }
\new@label@record{foo-recordenv}{{recordenv/contents}{some text and \thesection }}
\@writefile{toc}{\contentsline {section}{\numberline {2}Second section}{1}{}\protected@file@percent }
\gdef \@abspage@last{1}

相关内容