ArabTex を使用した LaTeX はギリシャ語を破壊し、パッケージ babel とオプション arabic はクラッシュします (非常に特殊な状況下で)

ArabTex を使用した LaTeX はギリシャ語を破壊し、パッケージ babel とオプション arabic はクラッシュします (非常に特殊な状況下で)

2003 年か 2004 年から、私は 1600 ページを超えるスクリプトを書いています。その中で、私は中国語、アラビア語、古代ギリシャ語のソースからのオリジナルの引用を使用していますが、そのほとんどは単純にコピー アンド ペーストで行っています (いいえ、私はギリシャ語も中国語もアラビア語もできません!)。LaTeX の機能のおかげで、うまくいくはずだと私は期待していました。

私のシステムは次のとおりです: Win7 に TeX Live 2019 をフルインストールし、本日インストールして更新しました。念のため、古いバージョンでは作業していません。ソースは Winshell で作成され、UTF-8 でコーディングされ、LaTeX でコンパイルされています。

最初はすべてがうまくいったように見えました。スクリプトの初めには古代ギリシャ語と中国語の引用が混在していましたが、最終的にはアラビア語の引用になりました。すべてが多かれ少なかれうまくいったように見えました(ただし、1つ問題がありました。2日ほど前にStackExchangeで投稿を書き始めて、ここで大きな助けを得ましたが、それは別の問題でした。これは私の2番目の投稿であり、最初の投稿で皆さんの助けに勇気づけられました。以下をご覧ください。 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 では、これはエラー メッセージなしでコンパイルされました。その後、最初のギリシャ語とアラビア語のテキストはまったく問題なく出力されました。しかし、ソースでは最初のものと同一である 2 番目のギリシャ語のテキストには、多くの異なる文字が出力されました...

しかし今朝、PdfLaTeX で TeX Live 2019 に切り替えたところ、たくさんのエラー メッセージが表示されます。ただし、これは 2 番目のギリシャ語テキストに対してのみで、最初の同一のテキストに対しては表示されません。

数週間前から懸命に努力しましたが、解決できませんでした。今朝の TeX Live 2019 のインストールが、この問題を解決するための最後の試みでした。そこで、他の方法を探し始めました。XeTeX または LuaTeX に切り替えれば、これらの問題は確実に解決したでしょう。しかし、その場合、大量の使用に対処する必要がありますpsfrag。これが、このスクリプトで古き良き LaTeX を使い続けている主な原因です。

babelそこで、私はむしろとそのオプションに満足しようとしました。しかし、のオプション (ギリシャ語とドイツ語にとにかく使用します) をarabic追加するとすぐに、コンパイルがクラッシュします。今日、私はスクリプトを最小限の動作例に縮小しようと 2 回試みました。どちらの場合も結果は大きく異なりますが、自分で確認してください。arabicbabel

例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。MWEarabicを取得するために 3 回目に試みても、結局は別の MWE になることはほぼ確実です。使用されていないパッケージをコメント アウトするとわかるように、オプションarabicbabel他のパッケージと競合しているように見えます。両方の 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}

2番目の例\thispagestyle{plain}では、\thepageを次のように再定義しているため失敗します。

\gdef\thepage{\protect\if@rlmain\protect\I{\number\c@page}%
              \protect\else\protect\textLR{\number\c@page}

mparhack出力ルーチンでラベルを保存するために使用されており\thepage、この再定義はまったく好ましくありません (あなたの例は microtype なしでも失敗します)。

最後の例も同様の理由で失敗します。アラビア語は\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}

これにより、次のようなラベルがauxに表示され

 \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 モードでは対応します)。

良い回避策があるかどうかはわかりません。

関連情報