\GetIdInfoAuxI 的使用与其定义不符及其他错误

\GetIdInfoAuxI 的使用与其定义不符及其他错误

我报告了这个最小示例(最新的 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}

相关内容