
2003년이나 2004년부터 나는 1600페이지가 넘는 스크립트를 작성하고 있습니다. 이 책에서 나는 중국어, 아랍어, 고대 그리스어 출처의 원본 인용을 대부분 복사하여 붙여넣는 방식으로 사용했습니다(아니요, 저는 그리스어, 중국어, 아랍어를 할 줄 모릅니다!). LaTeX의 기능이 작동할 수 있기를 바랐습니다.
내 시스템은 다음과 같습니다. TeX Live 2019 전체 설치가 포함된 Win7이 오늘 설치 및 업데이트되었습니다. 확실히 오래된 버전에서는 작동하지 않습니다. 내 소스는 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를 얻기 위해 세 번째 시도를 하면 또 다른 MWE로 끝날 것이라고 비교적 확신합니다. 내 눈에는 사용되지 않는 패키지를 주석 처리하여 볼 수 있듯이 옵션이 arabic
다른 babel
패키지와 충돌하는 것 같습니다. 나는 두 MWE 모두에서 일부 \usepackage
를 삭제한 다음 컴파일할 수 있다는 것을 잘 알고 있습니다. 하지만 원본 스크립트에 해당 패키지가 필요하기 때문에 안타깝게도 함께 실행해야 합니다...
PdfLaTeX(TeX Live 2019)에서 예제 1은 오류 메시지를 표시하지만 예제 2는 꽤 괜찮게 컴파일됩니다. 앞서 말한 중요한 사례 이후의 LaTeX에서는 두 예제 모두 오류 메시지를 생성합니다.
그래서 그동안 아이디어가 고갈되어 이제 여러분에게 드리는 질문은 다음과 같습니다. 도대체 어떻게 관련 패키지를 계속 사용할 수 있습니까? (그리고 제가 인정하는 것보다 훨씬 더 많습니다) 그럼에도 불구하고 고대 그리스어와 아랍어 사이를 왔다 갔다 합니다. 좋은 오래된 LaTeX?
답변1
일반사항
아랍어와 같은 언어 옵션 파일은 일반적으로 핵심 바벨의 일부가 아니지만 다른 사람들이 제공합니다. 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}
이는 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 모드에서는 통과합니다).
좋은 해결 방법이 있는지 잘 모르겠습니다.