将 pageref 写入文件

将 pageref 写入文件

如何写入\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}

相关内容