当 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
在以下情况下不会发生此错误:
hyperref
未使用包,或标准
report
类被滥用,或\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 容量”错误。\maketitle
report-xetex.def
\right@footnote
\left@footnote
\textwidth@footnote
\footnote
\LTRfootnote
\RTLfootnote
\thanks
\LTRthanks
\RTLthanks
hyperref
hyperref
hyperref
\maketitle
hyperref-xetex-bidi.def
\maketitle
hyperref
myreport.cls
\maketitle
hyperref
\let\HyOrg@maketitle\maketitle
\maketitle
bidi
bidi
hyperref
\let\HyOrg@maketitle\maketitle
\maketitle
\maketitle
hyperref-xetex-bidi.def
结论:正如您所猜测的,事情变得越来越复杂,因此最好使用\LoadClass
并让bidi
包自动处理问题。