文档前面的奇怪线条

文档前面的奇怪线条

我想用 iodhbwm 类创建一个文档。如果我第一次编译它,它工作正常。但如果我第二次编译它,文档开头会出现以下几行:

id=1,目标=636861707465722E31,源码=235C3333346265727363687269667420617566204562656E6 id=2,目标=73656374696F6E2E312E31,源码=235C3333346265727363687269667420617566204562 id=3,目标=73756273656374696F6E2E312E312E31,源码=235C333334626572736368726966742061 id=4,目标=73656374696F6E2E312E32,源码=234C697374656E id=5,目标=73756273656374696F6 id=6,目标=73756273656374696F6E2E312E322E32,源码=23426569737069656C2065696E6572204 id=7,目标=73756273656374696F6E2E312E322E33,源码=23426569737069656C2065696E6572204

日志文件显示以下错误:

! 未定义控制序列。l.22 \BKM@entry {id=1,dest={636861707465722E31},srcline={23}}{5C3333346265727...

!LaTeX 错误:缺少 \begin{document}。

请参阅 LaTeX 手册或 LaTeX Companion 了解解释。输入 H 可立即获得帮助。...

                                               l.22 \BKM@entry{i
             d=1,dest={636861707465722E31},srcline={23}}{5C3333346265727...

?! 未定义控制序列。l.23 \BKM@entry {id=2,dest={73656374696F6E2E312E31},srcline={23}}{5C333334626...

我已经联系了 iodhbwm 类的作者。但他无法重现这个错误。因此他无法帮助我。

现在我认为一定是别的什么。我编译了这段代码。这是来自 iodhbwm 文档的一个例子。

\documentclass[
    load-dhbw-templates,
    auto-intro-pages = default,
    add-tocs-to-toc,
    debug,
    language = ngerman
]{iodhbwm}
\usepackage[T1]{fontenc}

\dhbwsetup{%
    author                  = my name,
    thesis type             = SA,
    thesis title            = Verwendung von iodhbwm,
    student id              = 12345,
    institute               = Masterfind Factory faltfe,
    course/id               = Txxxx,
    supervisor              = Pikachu und Enton,
    processing period       = {01.01.17 -- 31.01.17},
    location                = Dreamtown
}

\begin{document}
    \Blinddocument
\end{document}

我在 Windows 7 上使用 MikTex 2.9.6941,并且重新安装了 MikTex 两次。

真正有趣的是,如果我包含 hyperref,这些行就会消失。但通常类会自行执行此操作。

有人知道为什么会有这些行吗?其他人能重现这个错误吗?

答案1

问题是,如果检测到 hyperref,KOMA 类现在会加载书签。它是在命令中执行此操作\AfterAtEndOfPackageiodhbwm类在 中加载 hyperref \AtEndPreamble,因此书签也会加载,这对它来说太晚了:书签无法将所需的行写入辅助文件

\providecommand\BKM@entry[2]{}

重现该问题的简单文档:

\documentclass{scrreprt}
\usepackage{etoolbox}
\AtEndPreamble{
 \usepackage{hyperref}
 }

\begin{document}
\chapter{abc}
\end{document}

可能唯一的解决方法是阻止加载书签:

\documentclass[bookmarkpackage=false]{scrreprt}
\usepackage{etoolbox}
\AtEndPreamble{
 \usepackage{hyperref}
 }

\begin{document}
\chapter{abc}
\end{document}

编辑

一个简单的解决方法是尽早加载 auxhook:

\documentclass{scrreprt}
\usepackage{etoolbox,auxhook}
\AtEndPreamble{
 \usepackage{hyperref}
 }

\begin{document}
\chapter{abc}
\end{document}

答案2

主要问题不是 KOMA-Script。bookmark使用包auxhook将命令的定义写入aux文件。\AddLineBeginMainAuxauxhook两种不同的工作模式:

  • 如果\@beginmainauxhook\relax,它会立即写入aux文件。
  • 如果\@beginmainauxhook不是\relax\AddLineBeginMainAux则将其参数添加到\@beginmainauxhook

如果包是通过 加载的,它将使用 进行\AtBeginDocument初始化。如果不是,它将初始化自己以 make 自身,并尝试修补以在主文件打开后立即添加 的执行。\@beginmainauxhook\relax\relax\document\@beginmainauxhookaux

现在,如果你hyperref通过加载\AtEndPreamblehyperref加载auxhookauxhook无法识别,则修补 为时\document已晚。因为这\@beginmainauxhook永远不会被执行。

因此,错误在于,在没有加载之前,也没有明确执行的情况下hyperref通过加载。如果你查看文件,你也会发现,在这种情况下,这一行\AtEndPreambleauxhook\begin{document}\@beginmainauxhookaux

\providecommand\hyper@newdestlabel[2]{}

通常hyperref写入aux-file (紧接着初始\relax)的 丢失。这是因为没有执行\@beginmainauxhook

所以我想说,这是一个错误iodhbwm,应该改为auxhook更早加载。作为一种解决方法,您可以auxhook在文档序言中加载。两者都会带回以下行

\providecommand\hyper@newdestlabel[2]{}

进入aux文件。

答案3

感谢 Ulrike 的回答,该问题是由于 KOMAScript 内部的变化而产生的。

目前不支持传递不属于iodhbwm类本身的键值选项。

目前有两种方法可以修复此问题。第一种方法是加载bookmark序言本身。

\documentclass[...]{iodhbwm}
\usepackage{bookmark}

第二种选择是使用内部命令,用于将选项传递给基类。

\makeatletter
    \newcommand{\iodhbwm@cls@baseclass@options}{bookmarkpackage=false}
\makeatother

完整的例子如下

\makeatletter
    \newcommand{\iodhbwm@cls@baseclass@options}{bookmarkpackage=false}
\makeatother
\documentclass[
    load-dhbw-templates,
    auto-intro-pages = default,
    add-tocs-to-toc,
    debug,
    language = ngerman
]{iodhbwm}
\usepackage[T1]{fontenc}

\dhbwsetup{%
    author                  = my name,
    thesis type             = SA,
    thesis title            = Verwendung von iodhbwm,
    student id              = 12345,
    institute               = Masterfind Factory faltfe,
    course/id               = Txxxx,
    supervisor              = Pikachu und Enton,
    processing period       = {01.01.17 -- 31.01.17},
    location                = Dreamtown
}

\begin{document}
    \Blinddocument
\end{document}

但请不要滥用内部命令。

相关内容