当 bidi 和 hyperref 包与自定义文档类 (XeLaTeX) 一起使用时出现问题

当 bidi 和 hyperref 包与自定义文档类 (XeLaTeX) 一起使用时出现问题

当 bidi 和 hyperref 包一起使用并且使用自定义文档样式时,会出现问题。例如:

\documentclass[unicode]{myreport}

\usepackage{xltxtra}

\author{Author}
\title{Title}

\usepackage[pagebackref=true, xetex, unicode]{hyperref}
\usepackage{bidi}

\begin{document}

\maketitle

Test

\end{document}

myreport类是标准类的精确副本report(没有任何改变)。问题出在\maketitle命令上。结果:

! TeX capacity exceeded, sorry [input stack size=5000].
\@ifnextchar #1#2#3->\let \reserved@d =#1
                                         \def \reserved@a {#2}\def \reserved...
l.14 

在以下情况下不会发生此错误:

  1. hyperref未使用包,或

  2. 标准report类被滥用,或

  3. \maketitle命令未被使用

无论是在 bidi 中,还是在 hyperref 文档中,还是在谷歌中,我都找不到有关此类行为的任何信息。

我看到bidi包使用命令\@ifclassloaded并插入类似 的文件report-xetex-bidi.def。也许应该为自定义 docclass 创建这样的文件。但我看到了这个文件,并没有在其中发现任何“特殊”的东西。

需要 Bidi 包,因为文档将是多语言的,具有多语种,并且包含一些阿拉伯语(也可能是其他语言)的文本。

在这种情况下该怎么办?

答案1

如果我按如下方式创建 myreport.cls,则无法重现该问题:

\LoadClass{report}

\endinput

但是如果您的myreport.cls是 的逐字副本report.cls,则会出现您描述的错误。最好的方法是使用,然后按照用户@egreg 的解释进行重新定义。中\LoadClass的更改很少。如果您研究代码,显然它会根据脚注规则(、、和)和一些脚注命令(、、、、、和)进行一些更改。为什么会发生此错误以及为什么与包有关?如果您查看包,您会发现有一些 的重新定义,并且文件重新定义了的那些更改,以便在 RTL 模式下为您提供正确的超链接。首先加载,因此显然有一个 的定义,然后当您加载 时,它会执行然后对命令进行一些更改;稍后您加载并且因为需要对 做一些修改,它也会这样做并且还对 进行一些修改,所以很明显,除非在加载 之前重新定义,否则您会收到“超出 TeX 容量”错误。\maketitlereport-xetex.def\right@footnote\left@footnote\textwidth@footnote\footnote\LTRfootnote\RTLfootnote\thanks\LTRthanks\RTLthankshyperrefhyperrefhyperref\maketitlehyperref-xetex-bidi.def\maketitlehyperrefmyreport.cls\maketitlehyperref\let\HyOrg@maketitle\maketitle\maketitlebidibidihyperref\let\HyOrg@maketitle\maketitle\maketitle\maketitlehyperref-xetex-bidi.def

结论:正如您所猜测的,事情变得越来越复杂,因此最好使用\LoadClass并让bidi包自动处理问题。

相关内容