我想用 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 类现在会加载书签。它是在命令中执行此操作\AfterAtEndOfPackage
。iodhbwm
类在 中加载 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
文件。\AddLineBeginMainAux
有auxhook
两种不同的工作模式:
- 如果
\@beginmainauxhook
是\relax
,它会立即写入aux
文件。 - 如果
\@beginmainauxhook
不是\relax
,\AddLineBeginMainAux
则将其参数添加到\@beginmainauxhook
。
如果包是通过 加载的,它将使用 进行\AtBeginDocument
初始化。如果不是,它将初始化自己以 make 自身,并尝试修补以在主文件打开后立即添加 的执行。\@beginmainauxhook
\relax
\relax
\document
\@beginmainauxhook
aux
现在,如果你hyperref
通过加载\AtEndPreamble
,hyperref
加载auxhook
后auxhook
无法识别,则修补 为时\document
已晚。因为这\@beginmainauxhook
永远不会被执行。
因此,错误在于,在没有加载之前,也没有明确执行的情况下hyperref
通过加载。如果你查看文件,你也会发现,在这种情况下,这一行\AtEndPreamble
auxhook
\begin{document}
\@beginmainauxhook
aux
\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}
但请不要滥用内部命令。