我怎样才能推迟 bidi 包的加载?

我怎样才能推迟 bidi 包的加载?

我正在维护一个加载包的文档类bidibidi对加载顺序非常挑剔,必须在以下几个包之后加载: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};但我在上面的代码中没有做出这样的假设。

相关内容