\newtoks 令牌似乎具有本地范围

\newtoks 令牌似乎具有本地范围

我想收集 a 的第一行quotation以供以后使用。我曾经\newtoks出于类似的目的使用过,因此在这里尝试了这种方法:

\documentclass[12pt] {article} 

\newtoks{\qfirstlineinternal}
\newcommand{\firstline}[1]{%
  \qfirstlineinternal=\expandafter{#1}
 #1
}

\begin{document}

\qfirstlineinternal=\expandafter{\the\qfirstlineinternal initial value}

debug: before quotation -\the\qfirstlineinternal-

\begin{quotation}
debug: in quotation before: -\the\qfirstlineinternal-

\firstline{This is the first line of a quotation,}

debug: in quotation after: -\the\qfirstlineinternal-

which continues on more lines.
\end{quotation}

debug: after quotation: -\the\qfirstlineinternal-
\end{document}

quotation这是输出文档,显示当环境结束时,环境内部设置的令牌的值将丢失:

在此处输入图片描述

环境quotation似乎已创建我的令牌的新本地实例。我该如何防止这种情况发生?

答案1

TeX 中的赋值默认为执行赋值的组所独有。设置寄存器的值是一种赋值,宏定义和其他各种操作也是一种赋值。

所有 LaTeX 环境(好吧,几乎所有,但这里无关紧要的例外)都形成一个组,因此如果希望在组结束时对寄存器的分配仍然存在,则必须将分配标记为\global

对令牌寄存器的赋值\qfirstlineinternal采用以下形式

\qfirstlineinternal={<something>}

为了使它全球化,只需说

\global\qfirstlineinternal={<something>}

\expandafter在这个上下文中经常看到的是添加令牌寄存器的内容:

\global\qfirstlineinternal=\expandafter{\the\qfirstlineinternal<something>}

将附加<something>到令牌寄存器的先前值,因为赋值是在 之后执行的,这\expandafter导致了 的扩展\the,进而传递了 的内容\qfirstlineinternal。因此\expandafter绝不是必需的:它的存在取决于寄存器应该包含什么。

\newcount对于使用、\newdimen或分配的寄存器,也应考虑同样的因素\newskip。请注意,分配本身是全局的,但这对寄存器的值分配没有影响。

相反,当使用 定义 LaTeX 计数器时,使用、或执行的值\newcounter{foo}分配总是foo\stepcounter{foo}\refstepcounter{foo}\setcounter{foo}{<number>}\addtocounter{foo}{<number>}全球的(否则,将数字分配给可能位于minipage嵌套figure环境中的标题将非常困难)。

答案2

对组内 token 的修改是特定于(或本地)该组的(您的组是环境quotation)。在前面加上此分配会\global打破障碍:

\documentclass[12pt]{article}
\newtoks{\qfirstlineinternal}
\newcommand{\firstline}[1]{%
  \global\qfirstlineinternal={#1}%
  #1%
}
\begin{document}
%...
\end{document}

在此处输入图片描述

请注意使用%以避免输出中出现虚假空格。

相关内容