Использование \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не соответствует его определению. л.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}

Связанный контент