几周前我问是否可以将希伯来语指定为babel
包的一个选项,而不是使用命令指定\babelprovide
。Javier Bezos 的评论指出,实际上可以将希伯来语指定为包选项,如这个答案。
但是,虽然此解决方案适用于article
文档类,但对于beamer
(或者更准确地说,对于beamer-rl
,它失败了,据我了解,它是一个包装类,beamer
应该在演示文稿的语言具有从右到左的文本流(如希伯来语)时使用)。
例如,考虑以下保存在文件中的 LaTeX 代码~/Test.tex
。
\documentclass{beamer-rl}
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{hebrew}
\babelfont{rm}{FreeSerif}
\babelfont{sf}{FreeSans}
\babelfont{tt}{FreeMono}
\begin{document}
\begin{frame}
Hello, world!
\end{frame}
\end{document}
当在终端中执行以下命令时:
> cd ~
> lualatex Test
生成一个文件~/Test.pdf
,在 PDF 查看器中打开时显示如下。
请记住,希伯来语是一种从右到左的语言,因此文本的右对齐和从右到左的文本流动是预期的、正确的,并且不表示问题。
如果现在有两条线
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{hebrew}
被替换为
\usepackage[bidi=basic,hebrew,provide=*]{babel}
并重新编译代码,编译失败,出现以下错误信息~/Test.log
。
! LaTeX Error: Option clash for package babel.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.6 \babelfont
{rm}{FreeSerif}
?
! Emergency stop.
...
l.6 \babelfont
{rm}{FreeSerif}
The package babel has already been loaded with options:
[nil,bidi=basic]
There has now been an attempt to load it with options
[bidi=basic,hebrew,provide=*]
Adding the global options:
nil,bidi=basic,bidi=basic,hebrew,provide=*
to your \documentclass declaration may fix this.
问题
babel
为什么当文档类为 时,无法将希伯来语作为选项传递给包beamer
,而当文档类为 时,可以这样做article
? 这个问题有简单的解决办法吗?
动机
修复上述行为至少有两个动机。其中一个动机由 Salim Bou 在下面的评论. 其他动机需要不同的解决方案。
动机 1
修复的一个动机是,这样就可以在希伯来语中使用与其他语言相同的 Latex 编程习惯用法,不仅适用于 wrt beamer
,还适用于其他包。
举例来说,translator
由自动加载的包通常会选取作为类选项beamer
传递的语言。beamer
使用德语可以添加如下自定义翻译。
\begin{filecontents*}[overwrite]{Sayings-German.dict}
\deftranslation{saying}{What doesn't kill me, makes me stronger.}
\end{filecontents*}
\documentclass[german]{beamer}
\usepackage[german]{babel}
\babelfont{rm}{FreeSerif}
\babelfont{sf}{FreeSans}
\babelfont{tt}{FreeMono}
\usedictionary{Sayings}
\begin{document}
\begin{frame}
\translate{saying}
\end{frame}
\end{document}
请注意,german
对于要进行的翻译,类选项是必需的。
但是,对于希伯来语,相同的功能需要在序言中添加命令\uselanguage{hebrew}
,并且,如果希望使用大写版本Hebrew
(如习惯的那样) ,其命令通常接受大写的语言名称),则需要添加translator
额外的命令,就像这样。\languagealias{hebrew}{Hebrew}
\begin{filecontents*}[overwrite]{Sayings-Hebrew.dict}
\deftranslation{saying}{If I won't fend for myself, who will fend for me?}
\end{filecontents*}
\documentclass{beamer-rl}
\usepackage[bidi=basic]{babel}
\babelprovide[import,main]{hebrew}
\babelfont{rm}{FreeSerif}
\babelfont{sf}{FreeSans}
\babelfont{tt}{FreeMono}
\usedictionary{Sayings}
% The following two commands are not necessary with German,
% because German can be passed to beamer as a class option.
\languagealias{hebrew}{Hebrew}
\uselanguage{Hebrew}
\begin{document}
\begin{frame}
\translate{saying}
\end{frame}
\end{document}
这个问题可以通过以下方法解决Salim Bou 的建议,即将选项列表传递[babel={hebrew,provide=*},hebrew]
给beaber-rl
文档类。使用此技巧,最后一部分代码可以按照与上面给出的德语演示代码类似的方式重写。
\begin{filecontents*}[overwrite]{Sayings-Hebrew.dict}
\deftranslation{saying}{If I won't fend for myself, who will fend for me?}
\end{filecontents*}
\documentclass[babel={hebrew,provide=*},hebrew]{beamer-rl}
\babelfont{rm}{FreeSerif}
\babelfont{sf}{FreeSans}
\babelfont{tt}{FreeMono}
\usedictionary{Sayings}
\begin{document}
\begin{frame}
\translate{saying}
\end{frame}
\end{document}
此代码编译成功,并且生成的 PDF 文件符合要求:
动机 2
修复的另一个动机是,为文章和演示文稿设置一个共同的序言文件,而 Salim Bou 的建议也无法阻止这一点。
我目前有一个名为的文件Preamble.tex
,其中收集了适用于article
我编写的所有类文档的所有自定义内容。每个此类文档的序言都只需输入此通用文件即可,因此:
\documentclass{article}
\input{Preamble.tex}
\begin{document}
...
\end{document}
其中一个自定义方法是Preamble.tex
通过以下方式将希伯来语设置为主要语言babel
:
\usepackage[bidi=basic,hebrew,provide=*]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSerif}
\babelfont{sf}[Renderer=HarfBuzz]{FreeSans}
\babelfont{tt}[Renderer=HarfBuzz]{FreeMono}
我也希望能够输入Preamble.tex
我的所有beamer
演示文稿。不幸的是,Salim Bou 的解决方案不适用于这种情况,而且我不知道如何修改他的解决方案以适应这种情况。
article
为s 和s设置一个前导文件是不行的beamer
,因为这会引入大量重复代码,这些代码的维护会很繁琐而且容易出错,并且在一定程度上破坏了拥有集中前导文件的整个意义。
答案1
以下解决方案基于 Salim Dou 的建议这里和这里,以及samcarter_is_at_topanswers.xyz 的建议。 注意据萨姆·卡特报道article
对s 和s使用单个公共前导文件并不是一个好主意beamer
。
% Sayings-Hebrew.dict
\deftranslation{saying}{If I won't fend for myself, who will fend for me?}
% Preamble.tex
\IfClassLoadedTF{beamer-rl}
{
% If the current class is 'beamer-rl',
% babel's language options should be specified
% as class options as follows:
% \documentclass[babel={provide=*},hebrew]{beamer-rl}
% Furthermore, beamer-rl loads the
% 'translator' class automatically,
% and will pass it the 'hebrew' class
% option if it is specified as shown above.
}
{
% Actions to take if the current class is not 'beamer'.
\usepackage[bidi=basic,hebrew,provide=*]{babel}
\usepackage[hebrew]{translator}
}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSerif}
\babelfont{sf}[Renderer=HarfBuzz]{FreeSans}
\babelfont{tt}[Renderer=HarfBuzz]{FreeMono}
\usedictionary{Sayings}
\uselanguage{Hebrew}
% Article.tex
\documentclass{article}
\input{Preamble}
\begin{document}
\translate{saying}
\end{document}
% Presentation.tex
\documentclass[babel={provide=*},hebrew]{beamer-rl}
\input{Preamble}
\begin{document}
\begin{frame}
\translate{saying}
\end{frame}
\end{document}