我正在努力控制使用 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
。
我的问题是
- 为什么 tl 变量在 V 扩展后会发生扩展,以及
- 为什么在 shipout 上会发生第二次扩张?
添加
我想我现在明白了为什么\exp_not:V
alone 不能按我想要的方式工作,以及为什么\exp_not:n { \exp_not:V <tlvar> }
会失败。内容在定义时展开一次,剥离\exp_not:n
,然后在 shipout 期间写入文件时再次展开,此时<tlvar>
为空。这是正确的吗?查看 ltproperties 代码,我仍然不明白为什么在所有属性\iow_shipout_x:Nx
中使用,即使是那些带有 setpoint 的属性。\property_record:nn
now
答案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}