我想收集 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}
请注意使用%
以避免输出中出现虚假空格。