如何写入\pageref
文件。
我也尝试过,有和没有,\unexpanded\expandafter
但都没有成功。有的也一样\immediate
。
我期望如此19
。但我得到的\pageref {mylabel}
却\__cmd_start:nNNnnn {s}\pageref \pageref code {\__cmd_grab_t:w *}{}{}{mylabel}
是
笔记:我在文档的开始和结束处打开和关闭文件,因为我需要收集文档的不同数据。
\documentclass{book}
\usepackage{lipsum}
\newwrite\mytextfile
\begin{document}
\pageref{mylabel}
\openout\mytextfile=mytextfile.txt
\write\mytextfile{\pageref{mylabel}}
% outputs "\pageref {mylabel}"
\write\mytextfile{\unexpanded\expandafter{\pageref{mylabel}}}
% outputs "\__cmd_start:nNNnnn {s}\pageref \pageref code {\__cmd_grab_t:w *}{}{}{mylabel}"
\lipsum[1-99]
\label{mylabel}
\closeout\mytextfile
\end{document}
答案1
您的问题是,\pageref
由 LaTeX 实现的 不可扩展,但使用 e-TeX\protected
机制定义。因此,它不会在\message
或\write
等内部扩展\edef
。
但是,该包refcount
定义了一个可扩展的命令来获取标签的页面。\getpagerefnumber
该命令可用于将页面写入文件。如果还想在日志中获取未定义标签的警告,您应该使用\refused
(必须\write
在可能发生不可扩展情况的上下文之外使用)。以下将两者放入一个宏中(如果您需要向文件写入比页码更多的内容,您应该将其放在您自己的\refused
宏之外\write
,或者将其包含在您的宏中)。
\documentclass{book}
\usepackage{refcount}
\usepackage{lipsum}
\newwrite\mytextfile
\NewDocumentCommand\writepagereftofile{mm}
{%
\refused{#2}%
\write#1{\getpagerefnumber{#2}}%
}
\begin{document}
\pageref{mylabel}% if this wasn't used you should use `\refused` (an additional `\refused` doesn't hurt though)
\openout\mytextfile=mytextfile.txt
\writepagereftofile\mytextfile{mylabel}
\lipsum[1-99]
\label{mylabel}
\closeout\mytextfile
\end{document}