
Seit 2003 oder 2004 schreibe ich an einem über 1600 Seiten starken Skript. Darin verwende ich Originalzitate aus chinesischen, arabischen und altgriechischen Quellen, größtenteils einfach per Copy-and-paste (nein, ich kann weder Griechisch, Chinesisch noch Arabisch!). Dank der Fähigkeiten von LaTeX sollte das doch klappen, hoffte ich.
Mein System ist folgendes: Win7 mit TeX Live 2019 Vollinstallation, heute installiert und aktualisiert, um sicherzugehen, dass ich nicht mit veralteten Versionen arbeite. Meine Quellen sind unter Winshell geschrieben, UTF-8 kodiert, unter LaTeX kompiliert.
Zunächst schien alles wie am Schnürchen zu laufen: Zu Beginn meines Skripts hatte ich eine Mischung aus altgriechischen und chinesischen Zitaten, am Ende arabische Zitate, alles schien mehr oder weniger zu funktionieren (nun, es gab allerdings ein Problem, mit dem ich vor etwa zwei Tagen meine Karriere als Autor von Beiträgen auf StackExchange begann und hier großartige Hilfe bekam, aber das war ein anderes Problem -- dies ist erst mein zweiter Beitrag, ermutigt durch Ihre Hilfe beim ersten, zu finden unter PdfLaTeX: Warum unterscheidet sich die arabische Ausgabe leicht von der arabischen Eingabe?)
Aber dann habe ich gegen Ende meines Skripts, nach den arabischen, einige griechische Zitate hinzugefügt – und plötzlich waren diese ziemlich beschädigt (zu der Zeit, bis heute Morgen, habe ich unter TeX Live 2018 gearbeitet, erst heute Morgen habe ich es aktualisiert).
Ein minimal funktionierendes Beispiel für dieses Problem sah folgendermaßen aus:
\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}
Es gibt also einen altgriechischen Text, gefolgt von einem arabischen, gefolgt von einem weiteren altgriechischen. Unter TeX Live 2018 wurde dies ohne Fehlermeldung kompiliert. Anschließend kamen der erste griechische und der arabische Text ganz gut heraus. Aber der zweite griechische Text, der in der Quelle mit dem ersten identisch ist, kam mit vielen unterschiedlichen Buchstaben heraus...
Aber jetzt, wo ich heute Morgen mit PdfLaTeX auf TeX Live 2019 umgestiegen bin, bekomme ich jede Menge Fehlermeldungen – allerdings nur für den zweiten griechischen Text, nicht für den ersten, identischen.
Ich konnte das nicht lösen, obwohl ich es seit Wochen versucht habe – die Installation von TeX Live 2019 heute Morgen war mein letzter Versuch, dieses Problem zu lösen. Also begann ich, nach anderen Möglichkeiten zu suchen. Ein Wechsel zu XeTeX oder LuaTeX hätte diese Probleme sicherlich gelöst. Aber dann müsste ich etwas gegen die massive Verwendung von unternehmen psfrag
– was der Hauptgrund ist, warum ich in diesem Skript immer noch beim guten alten LaTeX bleibe.
babel
Also habe ich versucht, mit und seiner Option zufrieden zu sein arabic
. Sobald ich aber arabic
die Optionen von babel
(die ich ohnehin für Griechisch und Deutsch verwende) hinzufüge, stürzt die Kompilierung ab. Heute habe ich nun zweimal versucht, mein Skript auf ein minimales funktionierendes Beispiel zu reduzieren. Beide Male mit sehr unterschiedlichen Ergebnissen, aber sehen Sie selbst:
Beispiel 1:
\documentclass{report}%
\usepackage[arabic,ngerman]{babel}
\usepackage{mparhack}
\usepackage{microtype}
\begin{document}
\thispagestyle{plain}
Hallo
\end{document}
mit der Fehlermeldung
! 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?
Und das minimal funktionierende Beispiel 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}
Die Fehlermeldung bei LaTeX zu diesem Beispiel lautet (ich finde darin kein Fragezeichen (?)):
! 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.
Wie Sie vielleicht bemerken, haben beide MWEs nur eines gemeinsam: Sie verwenden die babel
Option arabic
. Ich bin mir ziemlich sicher, dass ich bei einem dritten Versuch, ein MWE zu erhalten, wieder bei einem anderen lande. In meinen Augen scheint die Option arabic
irgendwie babel
mit anderen Paketen in Konflikt zu geraten, wie Sie sehen können, wenn Sie nicht verwendete Pakete auskommentieren. Mir ist durchaus bewusst, dass ich in beiden MWEs einige 's löschen könnte \usepackage
und es dann kompiliert würde. Aber da ich diese Pakete in meinem Originalskript benötige, muss es leider mit ihnen laufen ...
Unter PdfLaTeX (TeX Live 2019) gibt Beispiel 1 Fehlermeldungen aus, Beispiel 2 lässt sich problemlos kompilieren. Unter LaTeX – was für mich nach dem Vorstehenden der wichtigste Fall ist – produzieren beide Beispiele Fehlermeldungen.
So, mittlerweile gehen mir die Ideen aus und nun lautet meine Frage an Sie: Wie um Himmels Willen kann ich die enthaltenen Pakete (und noch viel mehr, das gebe ich zu) weiterhin verwenden und trotzdem zwischen Altgriechisch und Arabisch hin- und herwechseln – immer noch unter dem guten alten LaTeX?
Antwort1
Allgemeine Bemerkung
Sprachoptionsdateien wie Arabisch sind normalerweise nicht Teil des Babel-Kerns, sondern werden von anderen Personen bereitgestellt. arabic.ldf
(und die von ihm geladenen Stile) ist sehr alt, aus dem Jahr 2006 und scheint nicht mehr gepflegt zu werden.
Gleiches gilt für Arabtex: Das Datum besagt, dass die letzte Änderung im Jahr 2003 erfolgte.
Beides sind sehr schwere Pakete, die viele Befehle patchen und ändern. Das macht sie sehr fragil. Jede Änderung in einem anderen Paket oder Ihrem Setup kann Ihr Dokument beschädigen – und wenn es beschädigt wird, gibt es niemanden, der es repariert.
Wenn Sie also ein großes, kompliziertes Dokument haben, das funktioniert, lassen Sie die Finger vom Aktualisierungsknopf.
Einzelheiten
Ihr erstes Beispiel wird erneut kompiliert, wenn Sie in der \ararab-Definition eine Klammergruppe hinzufügen, sodass der \setcode
Befehl den folgenden Code nicht beeinflusst. Das Laden von inputenc ist in einem aktuellen Texlive nicht erforderlich.
\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}
Ihr zweites Beispiel schlägt fehl, da \thispagestyle{plain}
\thepage neu definiert wird zu
\gdef\thepage{\protect\if@rlmain\protect\I{\number\c@page}%
\protect\else\protect\textLR{\number\c@page}
mparhack
verwendet \thepage
in der Ausgaberoutine zum Speichern von Beschriftungen und mag diese Neudefinition überhaupt nicht (Ihr Beispiel würde auch ohne Mikrotyp fehlschlagen).
Ihr letztes Beispiel schlägt aus einem ähnlichen Grund fehl: Arabisch definiert \thefigure neu als
\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}
Dies führt im Aux zu Labels wie diesem
\newlabel{fig_test}{{\if@rl \I {1.0}\else \textLR {0.1}\fi }{1}{\url {http://foo.bar/baz}}{figure.0.1}{}}
und im DVI-Modus kommt HyperRef damit nicht zurecht (im PDF-Modus funktioniert es).
Ich bin nicht sicher, ob es gute Workarounds gibt.