分析

分析

如果我尝试构建以下文档:

\documentclass{memoir}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{fancyvrb}
\usepackage{siunitx}
\usepackage{bigfoot}

\begin{document}

    Test.

\end{document}

Latex只会引发错误:

LaTeX Font Info:    External font `cmex10' loaded for size
(Font)              <7> on input line 15.
LaTeX Font Info:    External font `cmex10' loaded for size
(Font)              <5> on input line 15.
\c__siunitx_mathtt_int=\count327

input stack size=5000]
TeX STOPPED: fatal errors occurred. Check the TeX log file for details

相关问题:

  1. TeX 容量超出,输入堆栈大小=5000
  2. 错误 Latex TeX 容量超出,抱歉 [输入堆栈大小=5000]
  3. TeX 容量超出,抱歉 [输入堆栈大小=5000] 在 LyX Classicthesis 中的父文档和子文档中加载“挂起模块”后
  4. 超出 Tex 容量,抱歉 [输入堆栈大小 = 5000]

答案1

分析

当中的标记\AtBeginDocument被评估时,编译停止。由于历史原因bigfoot

\def\FN@allmarks#1{\@elt{#1}%
  \ifnum#1<\count266
    \expandafter\FN@allmarks\expandafter{\number\numexpr#1+\@ne}%
  \fi}

因为etex.sty

\count266=1 % globally allocates \marks classes 1, 2, ...

在 LaTeX 合并了大部分内容(包括扩展寄存器(超过 255)的分配)之后,该bigfoot包尚未更新,etex.sty但保存最后分配的marks寄存器的计数器不再存在\count266

在您的情况下发生的情况是,作为加载的一部分\count266进行分配并接收值,这当然会在执行时产生太长的循环。siunitxexpl316777216\FN@allmarks0

fancyvrb之后加载siunitx不会触发错误,但也不能解决问题,因为\count266将保存一个很可能与分配的寄存器数量无关的值marks。LaTeX 内核\count256为此保留。

解决方案

修补\FN@allmarks以使用正确的寄存器。

\documentclass{memoir}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{fancyvrb}
\usepackage{siunitx}
\usepackage{bigfoot}
\usepackage{xpatch}

\makeatletter
\xpatchcmd{\FN@allmarks}{266}{256}{}{}
\makeatother

\begin{document}

    Test.

\end{document}

答案2

如果我将包加载顺序更改为:

\usepackage{siunitx}
\usepackage{fancyvrb}
\usepackage{bigfoot}

它被修复了。

相关内容