我正在维护一个加载包的文档类bidi
。bidi
对加载顺序非常挑剔,必须在以下几个包之后加载:float
、、以及graphics
其他ntheorem
一些包。问题是,我的文档类本身并不需要所有这些包,而使用该类的文档可能需要它们。
这让我陷入两难境地:我是否应该在创建各种虚假依赖\RequirePackage
项之前添加需要执行的命令?或者,我是否应该保持现状并破坏我的类与几乎所有事物的兼容性?bidi
我尝试使用类似的方法\AtBeginDocument
,但似乎不起作用——我仍然得到与提前加载时相同的错误bidi
,例如:
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
For additional information on amsmath, use the `?' option.
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty))
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty)
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty)
! LaTeX Error: Unable to properly define \@@leqno; primitive \leqno no longer p
rimitive.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.2564 \@saveprimitive\leqno\@@leqno
答案1
通常这样做是可以的
\AtBeginDocument{\usepackage{bidi}}
但如果出于某种原因,这种方法对你不起作用,另一种选择就是向你的用户提供文档,说明他们应该按照正确的顺序加载该包和其他包,并添加测试
\AtBeginDocument{\@ifpackageloaded{bidi}{}{\ClassError{zzz}{I told you to load bidi}{}}
检查它是否已加载到序言中。
答案2
坐下来,在回答完这个问题之后,所有的问题都会得到解决,包裹也会按照他们喜欢的顺序被加载。
第一阶段:从bidi
延期到polyglossia
延期
您可能无法推迟加载,bidi
因为bidi
自动加载polyglossia
当您表明您将使用从右到左的语言(具体来说,希伯来语)时 - 在表明这一点时,可能;并且在早期,肯定。
因此让我们放弃显式加载bidi
,并推迟polyglossia
:
\AtBeginDocument{\usepackage{polyglossia}}
...但这也会导致错误,例如
! Undefined control sequence.
<recently read> \setmainlanguage
l.125 \setmainlanguage
{english}
第 2 阶段:推迟polyglossia
相关命令
虽然您想要推迟加载多语种,但您的序言可能包含任何与多语种相关的命令,例如\setmainlanguage
、\setotherlanguage
等等\newfontfamily
。
好的,那么 - 让我们一起推迟所有这些!毕竟,我们实际上并没有在序言中用任何语言排版任何文本。示例代码:
\AtBeginDocument{
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage[numerals=arabic,calendar=gregorian]{hebrew}
\newfontfamily\hebrewfont[Script=Hebrew]{David CLM}
}
...但我们又一次失败了。这次出现了错误:
! LaTeX Error: Can be used only in preamble.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.21 \AtEndPreamble
{\let\bbl@set@language\xpg@set@language} %for biblatex
第三阶段:调整延期目的地即可奏效
现在这很有趣……看起来其中一个与多语相关的命令发出了一个\AtEndPreamble
,当文档开始并且序言结束时显然不能发出它。但如果那是它真正想要运行的时候,为什么不强迫它呢?让我们将polyglossia
(因此也是bidi
)推迟到\AtEndPreamble
而不是\AtBeginDocument
:
\RequirePackage{etoolbox} % provides \AtEndPreamble
\AtEndPreamble{
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage[numerals=arabic,calendar=gregorian]{hebrew}
\newfontfamily\hebrewfont[Script=Hebrew]{David CLM}
}
...并且有效。
阶段 4:调整延迟
@UlrikeFischer 建议我们可以只阻止多语种bidi
尽早加载。因此,以下内容:
\RequirePackage{etoolbox} % provides \AtEndPreamble
\RequirePackage{polyglossia}
\setmainlanguage{english}
\AtEndPreamble{
\setotherlanguage[numerals=arabic,calendar=gregorian]{hebrew}
\newfontfamily\hebrewfont[Script=Hebrew]{David CLM}
}
也可以使用。现在其他需要 polyglossia 的软件包不会受到不利影响。
注意:polyglossia
-related 命令可以使用,\AtEndPremable
因为polyglossia
它本身使得它可用\RequirePackage{etoolbox}
;但我在上面的代码中没有做出这样的假设。