使用 \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]\etoolbox.sty-h@@k ->\etoolbox.sty-h@@k \etb@catcodes \undef \etb@catcodes l.72 \RequirePackage{etoolbox}[2011/01/03]

答案1

@DavidCarlisle 的答案詳細說明了此問題的原因,雖然該解決方案有效,但最好使用具有較少 catcode 魔力的解決方案。使用\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}

相關內容