这段代码有什么问题(它无法编译):
\documentclass{article}
\usepackage{tokcycle}
\newcommand\flush{\endtokencyclexpress\par\tokencyclexpress}
\begin{document}
\tokencyclexpress
First
\flush
Second
\endtokencyclexpress
\end{document}
如果我将正文放入\flush
文档中,则一切都正常。
答案1
正如我所评论的,错误在于必须在输入流中找到实际的\endtokencyclexpress
(或合适的等价物\endtokcycraw
)才能终止它。\def
它的 'ed 版本是不够的。
也许这就是你要找的。虽然令牌循环通常会累积令牌,但宏\flush
是在输入流中遇到时唯一真正执行的宏。
每次\flush
遇到 时,它都会输出\the\cytoks
和\par
,它会全局累积\cytoks
到\cumtoks
,并重置\cytoks
。这有点像结束循环并开始新的循环,但并不完全相同。
我还没有调查过如果你\flush
从一个组内部调用会发生什么,但不用说,你不应该这样做。
\documentclass{article}
\usepackage{tokcycle}
\newtoks\cumtoks
\xtokcycleenvironment\accumstart
{\whennotprocessingparameter##1{\addcytoks{##1}}}
{\processtoks{##1}}
{\tctestifx{\flush##1}{\flush}{\addcytoks{##1}}}
{\addcytoks{##1}}
{\let\stop\endaccumstart}
{\tcafterenv{\cumtoks\expandafter\expandafter\expandafter{%
\expandafter\the\expandafter\cumtoks\the\cytoks}%
\def\print{\the\cumtoks}}}
\newcommand\flush{\the\cytoks\par
\global\cumtoks\expandafter\expandafter\expandafter{%
\expandafter\the\expandafter\cumtoks\the\cytoks}%
\cytoks{}%
}
%\newcommand\flush{\endtokencyclexpress\par\tokencyclexpress}
\begin{document}
\accumstart
First
\flush
Second
\flush
Third
\stop
\print
\end{document}