我在序言中使用了这段代码,取自统计单词的环境:
\usepackage{xesearch}
\newcounter{words}
\newenvironment{assignment}{%
\setcounter{words}{0}
\SearchList!{wordcount}{\stepcounter{words}}
{a?,b?,c?,d?,e?,f?,g?,h?,i?,j?,k?,l?,m?,
n?,o?,p?,q?,r?,s?,t?,u?,v?,w?,x?,y?,z?}
\UndoBoundary{'}
\SearchOrder{p;}}{%
\StopSearching
\marginpar{\arabic{words} words}}
我在包含多个章节的主文件中使用了它。如果我包含到第 4 章末尾(33599 个单词),那么计数环境就可以正常工作。如果我包含下一章(约 6K 个单词),我就会收到错误TeX capacity exceeded
。经过测试并排除了所有其他选项后,肯定是由于assignment
环境在某个时候达到了超过 33.599K 个单词的缓冲区(?)限制。我不确定如何在不分享我的实际工作的情况下为这个特定案例创建 MWE,出于显而易见的原因,我无法做到这一点。
答案1
如果我按照下面发布的说明运行文档,我会收到保存堆栈错误:
[30] [31] [32] [33] [34] [35] [36] [37]
! TeX capacity exceeded, sorry [save size=50000].
如果我取消注释标记的两行%%%%
,那么它会运行到最后
Output written on xew33.pdf (84 pages).
并报道51720字
\documentclass{article}
\usepackage{xesearch}
\newcounter{words}
\makeatletter
\newenvironment{assignment}{%
%%%% \endgroup
\setcounter{words}{0}%
\expandafter\ifx\csname wordcount@xs@searchlist\endcsname\relax
\let\wordcount@xs@searchlist\undefined
\SearchList!{wordcount}{\stepcounter{words}}
{a?,b?,c?,d?,e?,f?,g?,h?,i?,j?,k?,l?,m?,
n?,o?,p?,q?,r?,s?,t?,u?,v?,w?,x?,y?,z?}
\UndoBoundary{'}%
\SearchOrder{p;}%
\else
\expandafter\StartSearching
\fi}{%
\StopSearching
\marginpar{\arabic{words} words}%
%%%% \begingroup\expandafter\def\csname @currenvir\endcsname{assignment}%
}
\begin{document}
\def\a{one two three four five six seven eight nine ten. }
\def\b{red yellow green blue. }
\def\c{apple orange pear banana.}
\def\d{\a\a\b\b\c\a\b\c\c\b\b}
\def\e{\d\d\par\a\a\b\d\d\b\b\c\c\a\a\a\a\par}
\def\f{\e\e\a\a\b\b\e\c\d\d\a\c\b\a\e\e}
\begin{assignment}
\f\f\f\f\f\f\f\f\f\f
\f\f\f\f\f\f\f\f\f\f
\f\f\f\f\f\f\f\f\f\f
\end{assignment}
\begin{assignment}
one one two three
\end{assignment}
\begin{assignment}
one two three four five six
\end{assignment}
\end{document}
LaTeX 中的环境document
采用了类似的技巧来使用环境语法,但避免围绕整个文档进行分组。