LaTeX с ArabTex уничтожает греческий язык, а пакет babel и Option arabic аварийно завершают работу — при весьма особых обстоятельствах

LaTeX с ArabTex уничтожает греческий язык, а пакет babel и Option arabic аварийно завершают работу — при весьма особых обстоятельствах

С 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 это скомпилировалось без сообщения об ошибке. После этого первый греческий и арабский тексты вышли вполне нормально. Но второй греческий текст, который в исходнике идентичен первому, вышел со множеством разных букв...

Но теперь, когда сегодня утром я перешел на TeX Live 2019 с PdfLaTeX, я получаю множество сообщений об ошибках — но только для второго греческого текста, а не для первого, идентичного.

Я не смог решить эту проблему, хотя я и старался изо всех сил в течение нескольких недель — установка 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команда не повлияет на следующий код. Загрузка inputenc не является обязательной в текущем texlive.

\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в выходной процедуре для хранения меток и ему вообще не нравится это переопределение (ваш пример тоже не сработает без 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}

Это приводит к появлению таких меток как эта

 \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 проходит).

Я не уверен, есть ли какие-то хорошие обходные пути.

Связанный контент