LaTeX 與阿拉伯語會破壞希臘語並包 babel 和 Option 阿拉伯語崩潰——在非常特殊的情況下

LaTeX 與阿拉伯語會破壞希臘語並包 babel 和 Option 阿拉伯語崩潰——在非常特殊的情況下

從 2003 年或 2004 年開始,我正在寫一個 1600 多頁的劇本。在其中,我使用了來自中文、阿拉伯語和古希臘語的原始引用,大部分只是簡單地複製和貼上(不,我不懂希臘語、中文或阿拉伯語!)。我希望 LaTeX 能夠發揮作用。

我的系統如下:Win7 with 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 下——這是在上述對我來說重要的情況之後——兩個例子都會產生錯誤訊息。

因此,與此同時,我已經沒有想法了,現在我對你的問題是:我究竟如何仍然可以使用所涉及的軟體包(以及更多,我承認),並且仍然在古希臘語和阿拉伯語之間來回交換- 仍然在好舊的乳膠嗎?

答案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來儲存標籤,並且根本不喜歡這種重新定義(如果沒有微類型,您的範例也會失敗)。

您的最後一個範例因類似原因而失敗:阿拉伯語將 \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 模式下它可以通過)。

我不確定是否有好的解決方法。

相關內容