我试图从仅包含该数字的外部文本文件中提取一个数字,并使用它来定义一个命令,然后我可以使用该命令来设置计数器,但它似乎不起作用。
以下是外部文件的内容page.tex
:
107
main.tex
以下是使用该外部文件的MWE :
\documentclass{article}
\newcommand{\foo}{\input{page.tex}}
\setcounter{page}{\foo}
\begin{document}
Some text.
\end{document}
当我尝试编译时,出现错误。但是,如果我将其更改\newcommand{\foo}{\input{page.tex}}
为\newcommand{\foo}{107}
,它就可以正常工作,因此我假设存在一些问题\input{page.tex}
。也许是行尾或其他原因?我不知所措。
答案1
答案2
您的问题是您使用的是 LaTeX,而不是纯 TeX。如果您使用纯 TeX,那么任务可以简单地解决:
\newcount\page
\page=\input page.tex
The page is \the\page.
\bye
答案3
在 LaTeX 中,TeX 原语\input
被重命名为\@@input
宏,并被\input
重新定义为宏,该宏在扩展上下文中不起作用,例如收集和扩展属于 TeX 的标记-⟨数字⟩-数量。
\@@input
但是,只要文件可以读取,它就是可扩展的,但在 TeX 中,文件的末尾就像一个\outer
标记,因此文件结尾不能出现在宏参数或⟨平衡文本⟩或类似的东西。
但你很幸运:
你可以安排好一切,这样\outer
当 TeX 抓取宏参数时就不会遇到文件结尾/⟨平衡文本⟩/类似:
\documentclass{article}
% Let's create a file page.tex:
\begin{filecontents*}{page.tex}
107
\end{filecontents*}
\makeatletter
\newcommand{\foo}{\@@input page.tex}
\makeatother
\setcounter{page}{\foo}
% More directly:
% \setcounter{page}{\csname @@input\endcsname page.tex}
\begin{document}
\message{%
^^J
!^^J
! When \string\begin{document}\space was reached, the page-counter had the value \number\value{page}.^^J
!^^J
}
Some text.
\end{document}
在 .log 文件和其他内容下面的控制台中,您会收到以下消息:
!
! When \begin{document} was reached, the page-counter had the value 107.
!
.pdf 输出如下所示:
如果你对正在发生的事情感兴趣:
\setcounter
定义为
\setcounter=macro:
#1#2->\@ifundefined{c@#1}{\@nocounterr{#1}}{\global\csname c@#1\endcsname#2\relax}
,因此
\setcounter{page}{\foo}
产生了,其—正如-counter底层的
\@ifundefined{c@page}{\@nocounterr{page}}{\global\csname c@page\endcsname\foo\relax}
控制字标记所定义的—在某个阶段产生了 ,它类似于:。\c@page
page
\global\csname c@page\endcsname\foo\relax
\global\c@page\foo\relax
现在 TeX 正在对计数寄存器 进行全局赋值\c@page
。因此\foo
会展开,所以你会得到类似 的东西
\global\c@page\@@input page.tex\relax
,这—由于\@@input
是可扩展的,因此也不会有问题:在收集和扩展属于 TeX 的可扩展标记时,⟨数字⟩-quantity\@@input
被扩展,这意味着文件名被收集起来,\@input
组成文件名的标记和标记都消失了,焦点转向了 的内容page.tex
。
因此,遇到了后面跟着空格标记的数字107
。空格标记的出现是由于 TeX 的\endlinechar
-mechanism 而产生的。空格标记触发 TeX 的结束收集标记-⟨数字⟩-quantity 并被移除,并执行分配。然后 TeX 遇到文件末尾,焦点从主 TeX 文件
转回。如果有一个负值, 事情也会顺利进行,因为事情正在page.tex
\endlinechar
\outer
因为在收集/扩展属于 TeX 的标记时,事情并不重要-⟨数字⟩-数量。\outer
在收集/扩展 TeX 标记时文件结束-⟨数字⟩-quantity 只会默默地触发结束聚集。