自 2003 年或 2004 年以来,我一直在编写一个 1600 多页的脚本。在其中,我引用了来自中文、阿拉伯语和古希腊语来源的原始引文,大部分都是通过复制和粘贴完成的(不,我既不懂希腊语,又不懂中文或阿拉伯语!)。我希望借助 LaTeX 的功能,它应该可以正常工作。
我的系统如下:Win7,安装 TeX Live 2019 完整版,今天安装并更新,确保我不会使用过时的版本。我的源代码是在 Winshell 下编写的,编码为 UTF-8,在 LaTeX 下编译。
首先,一切似乎都运行良好:在我的脚本开始时,我混合了古希腊文和中文引文,最后是阿拉伯文引文,一切似乎或多或少都运行正常(当然,有一个问题,两天前我开始在 StackExchange 上写帖子,在这里得到了很大的帮助,但那是另一个问题——这只是我的第二篇帖子,受到你对第一篇帖子的帮助的鼓舞,可以在 PdfLaTeX:为什么阿拉伯语输出与阿拉伯语输入略有不同?)
但是后来我在脚本末尾添加了一些希腊语引用,在阿拉伯语引用之后——突然间,这些引用就变得很不完整了(当时,直到今天早上,我还在 TeX Live 2018 下工作,只是今天早上我才更新了日期)。
该问题的最小工作示例如下所示:
\documentclass{report}
\usepackage[LGR,T1]{fontenc}
\usepackage[greek,ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{arabtex}
\usepackage{utf8}
\newcommand\ararab[2][]{
\setcode{utf8}
\RL{#2}}
\begin{document}
\foreignlanguage{greek}{Παίδων τοίνυν ἡμῶν ὅντων καθαιρεῖ μὲν τὸν}
\ararab{أبو علي الحسن بن الهيثم}
\foreignlanguage{greek}{Παίδων τοίνυν ἡμῶν ὅντων καθαιρεῖ μὲν τὸν}
\end{document}
因此,有一个古希腊语文本,后面跟着阿拉伯语,然后又是古希腊语。在 TeX Live 2018 下,编译时没有出现错误消息。之后,第一个希腊语文本和阿拉伯语文本都很好。但第二个希腊语文本在源中与第一个文本相同,但出现了许多不同的字母……
但是现在,今天早上我已经使用 PdfLaTeX 切换到 TeX Live 2019,我收到了很多错误消息 - 但仅限于第二个希腊文本,而不是第一个相同的文本。
尽管我已经努力了好几个星期,但我还是没能解决这个问题——今天早上安装 TeX Live 2019 是我解决这个问题的最后一次尝试。所以我开始寻找其他机会。切换到 XeTeX 或 LuaTeX 肯定可以解决这些问题。但接下来我必须对大量使用psfrag
——这是主要原因,我仍然在这个脚本中坚持使用老旧的 LaTeX。
所以我宁愿尝试使用babel
和它的选项arabic
。但是,只要我添加arabic
选项babel
(我无论如何都会使用希腊语和德语),编译就会崩溃。现在,今天我两次尝试将我的脚本精简为最小工作示例。两次的结果都大不相同,但请自己看看:
示例 1:
\documentclass{report}%
\usepackage[arabic,ngerman]{babel}
\usepackage{mparhack}
\usepackage{microtype}
\begin{document}
\thispagestyle{plain}
Hallo
\end{document}
错误消息
! Argument of \MT@res@a has an extra }.
<inserted text>
\par
l.11 \end{document}
I've run across a `}' that doesn't seem to match anything.
For example, `\def\a#1{...}' and `\a}' would produce
this error. If you simply proceed now, the `\par' that
I've just inserted will cause me to report a runaway
argument that might be the root of the problem. But if
your `}' was spurious, just type `2' and it will go away.
Runaway argument?
最小工作示例2:
\documentclass{report}%
\usepackage[arabic,english]{babel}
\usepackage{hyperref}
\begin{document}
\begin{figure}%
\caption{\url{http://foo.bar/baz} \label{fig_test}}%
\end{figure}%
Bild~\ref{fig_test}
\end{document}
此示例的 LaTeX 错误消息如下(我没有找到任何问号(?)):
! Extra \else.
\pdfmark@ ...space \pdf@type \space pdfmark}\else
\ltx@IfUndefined {@\pdf@li...
l.11 Bild~\ref{fig_test}
I'm ignoring this; it doesn't match any \if.
! Extra \fi.
\@setref ...@link #1\@empty \@empty \@nil {#2}\fi
l.11 Bild~\ref{fig_test}
I'm ignoring this; it doesn't match any \if.
您可能注意到,这两个 MWE 只有一个共同点:它们使用选项babel
。arabic
我比较确定,如果我第三次尝试获取 MWE,我最终会得到另一个。在我看来,选项arabic
似乎babel
与其他包发生冲突,您可以通过注释掉未使用的包来看到这一点。我很清楚,在这两个 MWE 中,我可以删除一些\usepackage
,然后它就可以编译了。但由于我在原始脚本中需要这些包,所以不幸的是它需要与它们一起运行……
在 PdfLaTeX (TeX Live 2019) 下,示例 1 给出错误消息,示例 2 编译正常。在 LaTeX 下(这对我来说是最重要的情况),两个示例都产生了错误消息。
所以与此同时我已经没有主意了,现在我要问你的是:我究竟怎样才能继续使用所涉及的软件包(我承认,还有更多),并且在古希腊语和阿拉伯语之间来回切换——仍然在古老的 LaTeX 下?
答案1
一般性评论
像阿拉伯语这样的语言选项文件通常不是核心 babel 的一部分,而是由其他人提供的。 arabic.ldf
(以及它加载的样式)非常老旧,从 2006 年开始提供,而且似乎无人维护。
对于 arabtex 来说也是如此:日期表明最后一次更改是在 2003 年。
这两个软件包都非常繁重,需要修补和更改很多命令。这使得它们非常脆弱。其他软件包或您的设置中的任何更改都可能破坏您的文档 - 并且如果文档损坏,将无人可以修复。
因此,如果您有一个大型且复杂的工作文档,请不要将手指放在更新按钮上。
细节
如果您在 \ararab 定义中添加括号组,则您的第一个示例将再次编译,因此该\setcode
命令不会影响以下代码。在当前的 texlive 中无需加载 inputenc。
\documentclass{report}
\usepackage[LGR,T1]{fontenc}
\usepackage[greek,ngerman]{babel}
\usepackage{arabtex}
\usepackage{utf8}
\newcommand\ararab[2][]{{\setcode{utf8}\RL{#2}}}
\begin{document}
\foreignlanguage{greek}{Παίδων τοίνυν ἡμῶν ὅντων καθαιρεῖ μὲν τὸν}
\ararab{أبو علي الحسن بن الهيثم}
\foreignlanguage{greek}{Παίδων τοίνυν ἡμῶν ὅντων καθαιρεῖ μὲν τὸν}
\end{document}
你的第二个例子失败了,因为\thispagestyle{plain}
重新定义了 \thepage 到
\gdef\thepage{\protect\if@rlmain\protect\I{\number\c@page}%
\protect\else\protect\textLR{\number\c@page}
mparhack
在输出例程中使用\thepage
来存储标签,并且根本不喜欢这种重新定义(如果没有微类型,您的示例也会失败)。
您的最后一个例子因类似的原因而失败: arabic 将 \thefigure 重新定义为
\def\thefigure{\protect\if@rl\protect\I{\number\c@figure.\number\c@chapter}%
\protect\else\protect\textLR{\number\c@chapter.\number\c@figure}%
\protect\fi}
这会导致出现如下标签
\newlabel{fig_test}{{\if@rl \I {1.0}\else \textLR {0.1}\fi }{1}{\url {http://foo.bar/baz}}{figure.0.1}{}}
在 dvi 模式下 hyperref 无法处理它(在 pdf 模式下它可以通过)。
我不确定是否有好的解决方法。