
С 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 проходит).
Я не уверен, есть ли какие-то хорошие обходные пути.