![通过宏写入文件引用的绝对页码](https://linux22.com/image/306373/%E9%80%9A%E8%BF%87%E5%AE%8F%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%E5%BC%95%E7%94%A8%E7%9A%84%E7%BB%9D%E5%AF%B9%E9%A1%B5%E7%A0%81.png)
我想写入文件引用的绝对页码。因此我不能使用\immediate\write
。现在的问题是,我认为\write
当页面完成时会扩展其参数,但当然我会为该页面上的所有调用获得相同的计数器编号。我的问题是:如何将命令扩展时的计数器值传递给\write
?
\documentclass{article}
\usepackage{zref-savepos}
\usepackage{zref-abspage}
\usepackage{zref-user}
\newcounter{acnt}
\newwrite\tempfile
\immediate\openout\tempfile=tmp.txt
\makeatletter
\newcommand\test{
\stepcounter{acnt}
A \zsavepos{pos\arabic{acnt}}
\write\tempfile{Nr \arabic{acnt} is on page \zref@extract{pos\arabic{acnt}}{abspage}}
}
\makeatother
\begin{document}
\test
\test
\newpage
\test
\test
\test
\end{document}
输出为:
Nr 2 is on page 0
Nr 2 is on page 0
Nr 5 is on page 0
Nr 5 is on page 0
Nr 5 is on page 0
但它应该是:
Nr 1 is on page 1
Nr 2 is on page 1
Nr 3 is on page 2
Nr 4 is on page 2
Nr 5 is on page 2
答案1
写入的标签\zsavepos
仅存储属性posx
和posy
。因此,的值abspos
未定义,并0
使用默认值。这样做的原因是为了提高效率。如果标签存储每种属性(大量计数器值、部分标题等),则文件大小.aux
和内存印记将非常大。因此,zref
允许并希望鼓励仅使用所需属性进行标签设置。
模块zref-savepos
维护一个savepos
包含属性posx
和 的属性列表posy
。此列表可以扩展:
\zref@addprops{savepos}{abspage}% global
\zref@localaddprops{savepos}{abspage}% local
以下示例在本地扩展了列表,以避免\zsavepos
在不需要的地方添加标签的属性:
\documentclass{article}
\usepackage{zref-savepos}
\usepackage{zref-abspage}
\usepackage{zref-user}
\newcounter{acnt}
\newwrite\tempfile
\immediate\openout\tempfile=tmp.txt
\makeatletter
\newcommand\test{
\stepcounter{acnt}
A %
\begingroup
\zref@localaddprops{savepos}{abspage}%
\zsavepos{pos\arabic{acnt}}%
\endgroup
\immediate\write\tempfile{%
Nr \arabic{acnt} is on page
\zref@extract{pos\arabic{acnt}}{abspage}%
}%
}
\makeatother
\begin{document}
\test
\test
\newpage
\test
\test
\test
\end{document}
结果tmp.txt
:
Nr 1 is on page 1
Nr 2 is on page 1
Nr 3 is on page 2
Nr 4 is on page 2
Nr 5 is on page 2
示例使用\immediate\write
,因为测试文件没有显示延迟写入的原因。如果存在页码等属性,在发货时这些属性是正确的,则通常需要延迟写入。但写入命令仅写入当前计数器值和引用。