如何使用 \input 将 \newcommand 定义为文件中的数字

如何使用 \input 将 \newcommand 定义为文件中的数字

我试图从仅包含该数字的外部文本文件中提取一个数字,并使用它来定义一个命令,然后我可以使用该命令来设置计数器,但它似乎不起作用。

以下是外部文件的内容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

它无法工作,因为\input不可扩展。

\documentclass{article}
\usepackage{catchfile}

\newcommand{\foo}{}% for safety
\CatchFileDef{\foo}{page.tex}{}

\setcounter{page}{\foo}

\begin{document}

Test \thepage

\end{document}

在此处输入图片描述

答案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@pagepage
\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 只会默默地触发结束聚集。

相关内容