我报告了这个最小示例(最新的 TeX Live 2012)的几个错误。这些错误是由最近的 TeX Live 更新引入的。
\RequirePackage[l2tabu, orthodox]{nag}
\documentclass{scrbook}
\usepackage{morewrites}
\RequirePackage{listings}
\AtBeginDocument{%
\RequirePackage{mdframed}
}
\begin{document}
\end{document}
在xparse.sty
:
!的用法
\GetIdInfoAuxI
与其定义不符。l.66\GetIdInfo$ Id: xparse.dtx 4467 2013-03-12 08:29:05Z joseph $
在etoolbox.sty
:
(
c:/texlive/2012/texmf-dist/tex/latex/etoolbox/etoolbox.sty
!缺失$
插入。
在mdframed.sty
:
!TeX 容量超出,抱歉
[input stack size=5000]
。l.72 [2011/01/03\etoolbox.sty-h@@k ->\etoolbox.sty-h@@k \etb@catcodes \undef \etb@catcodes
]\RequirePackage{etoolbox}
答案1
@DavidCarlisle 的回答详细说明了此问题的原因,虽然该解决方案有效,但最好使用具有较少 catcode magic 的解决方案。使用\AtEndPreamble
提供的宏etoolbox
,可以重写 MWE,这样就不会发生错误:
\RequirePackage[l2tabu, orthodox]{nag}
\documentclass{scrbook}
\usepackage{morewrites}
\RequirePackage{listings}
\usepackage{etoolbox}
\AtEndPreamble{%
\RequirePackage{mdframed}
}
\begin{document}
\end{document}
尽管我看不出有任何理由推迟装载mdframed
。
答案2
nag 包$
从其通常的定义变为“活跃的”
\AtBeginDocument{\catcode`$\active}%$
\AtEndDocument{\catcode`$=3\relax}
它试图通过延迟开始文档来最大限度地减少由此引起的冲突。
mdframed(通过 xparse)用于$
解析包文件中的源代码控制头,但由于RequirePackage
一直延迟到 BeginDocument,因此失败。
最明显的解决办法就是使用
\usepackage{mdframed}
而不是
\AtBeginDocument{%
\RequirePackage{mdframed}
}
但这取决于包裹加载最初为何延迟......
正如评论中指出的那样,延迟包加载\AtBeginDocument
总是有风险的,因为它会在 LaTeX 设置全局字体和页面大小结构之后比预期更晚地加载包,但是这是可行的:
\RequirePackage[l2tabu, orthodox]{nag}
\documentclass{scrbook}
\usepackage{morewrites}
\RequirePackage{listings}
\AtBeginDocument{%
\edef\saveddcatcode{\the\catcode\expandafter`\string$}%
\catcode`\$3 %
\RequirePackage{mdframed}%
\catcode`\$ \saveddcatcode\relax
}
\begin{document}
\end{document}