使用 xelatex / pdflatex 渲染波斯语 / 波斯语文本

使用 xelatex / pdflatex 渲染波斯语 / 波斯语文本

不久前,我问了一些关于 LaTeX 中希腊语和韩语的问题,得到了一些很好的回答。在同样的背景下,我现在正在研究波斯语/波斯语。

妇女权利委员会:

\documentclass{book}

\usepackage[utf8]{inputenc}
\usepackage[LAE]{fontenc}
\usepackage[farsi]{babel}
\TOCLanguage{farsi}

\begin{document}
\chapter{فصل}
\section{بخش} % text missing

یک متن % text missing

$a^{2} = b^{2} + c^{2}$

a**2 = b**2 + c**2



\obeylines
00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement\(\backslash\)n"{}});
00028         printf({"large یک متن Doxygen 1.8.19\(\backslash\)n"{}});
\begin{verbatim}
00027         printf({"{}JUST A PRINT STATEMENT SOME MORE TEXT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement some more text\(\backslash\)n"{}});
00028         printf({"large یک متن Doxygen 1.8.19\(\backslash\)n"{}});
\end{verbatim}

\tableofcontents                                                                                                                    \end{document}

输出:

在此处输入图片描述

如您所见,波斯语/波斯语脚本的输出(几乎)完整,公式中的a,,是b一个例外c(但此处数字2仍被翻译)。

另外,使用 xelatex 渲染时,节标题和紧随其后的行的文本会丢失,而使用 pdflatex 时,该信息会再次出现。

我也尝试了 polyglossia,但是在这里我遇到了一个问题,即我陷入了加载包的循环(类似于:多语和超链接问题)。

由于代码文本通常使用语言切换生成,因此不是一个真正的选择(例如参见 printf 语句)。

答案1

您想要的 — 在环境中自动检测从左到右/从右到左的脚本verbatim— 目前还不容易实现。(可能可以使用 XeTeX 或 Lua 中的 interchar 标记来实现。)您尝试做的是给您带来乱码。

如果您要切换不同的字体以支持不同的语言,则应始终添加此行\tracinglostchars=2。如果当前字体不支持您要求的字形,则会发出警告,这通常意味着您选择了错误的语言。

以下 MWE几乎在 XeLaTeX 或 LuaLaTeX 中有效:

\tracinglostchars=2 % Warn if a glyph is missing from a font!
\documentclass{book}

\usepackage[bidi=default, layout=sectioning.counters, english]{babel}
\babelprovide[import, main, maparabic, alph=alphabetic, roman=abjad]{persian}

% The environment defined by \babeltags fails to set the text direction.
\DeclareRobustCommand\textpersian[1]{\foreignlanguage{persian}{#1}}
\newenvironment{english}%
  {\begin{otherlanguage}{english}}%
  {\end{otherlanguage}}

\usepackage{unicode-math}
\defaultfontfeatures{ Renderer=HarfBuzz, Scale=MatchLowercase, Ligatures=TeX }
\babelfont{rm}
          {Amiri}
\babelfont{tt}
          {almfixed.otf}

\begin{document}
\chapter{فصل}
\section{بخش} % text missing

یک متن % text missing

$a^{2} = b^{2} + c^{2}$

a**2 = b**2 + c**2

\begin{english}
\obeylines
00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement\(\backslash\)n"{}});
00028         printf({"large \textpersian{یک متن} Doxygen 1.8.19\(\backslash\)n"{}});
\begin{verbatim}
00027         printf({"{}JUST A PRINT STATEMENT SOME MORE TEXT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement some more text\(\backslash\)n"{}});
00028         printf({"large ‏یک متن ‎Doxygen 1.8.19\(\backslash\)n"{}});
\end{verbatim}
\end{english}

\tableofcontents
\end{document}

第 1 页 目录

如果仔细观察,您会发现\verbatim环境中的波斯语文本没有以正确的方向显示(即使我在源中手动插入了从右到左和从左到右的标记)。

您可以像在第一个块中一样通过转义文本并使用 、 等来获得您可能想要的内容,allttlisting不是verbatim

\tracinglostchars=2 % Warn if a glyph is missing from a font!
\documentclass{book}

\usepackage[bidi=default, layout=sectioning.counters, english]{babel}
\usepackage{alltt}
\babelprovide[import, main, maparabic, alph=alphabetic, roman=abjad]{persian}

% The environment defined by \babeltags fails to set the text direction.
\DeclareRobustCommand\textpersian[1]{\foreignlanguage{persian}{#1}}
\newenvironment{english}%
  {\begin{otherlanguage}{english}}%
  {\end{otherlanguage}}

\usepackage{unicode-math}
\defaultfontfeatures{ Renderer=HarfBuzz,Scale=MatchLowercase, Ligatures=TeX }
\babelfont{rm}
          {Amiri}
\babelfont{tt}
          {almfixed.otf}
\setmathfont{LibertinusMath-Regular.otf}

\begin{document}
\chapter{فصل}
\section{بخش} % text missing

یک متن % text missing

$a^{2} = b^{2} + c^{2}$

a**2 = b**2 + c**2

\begin{english}
\obeylines
00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement\(\backslash\)n"{}});
00028         printf({"large \textpersian{یک متن} Doxygen 1.8.19\(\backslash\)n"{}});

\begin{alltt}
00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement\(\backslash\)n"{}});
00028         printf({"large \textpersian{یک متن} Doxygen 1.8.19\(\backslash\)n"{}});
\end{alltt}

\begin{verbatim}
00027         printf({"{}JUST A PRINT STATEMENT SOME MORE TEXT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement some more text\(\backslash\)n"{}});
00028         printf({"large ‏یک متن ‎Doxygen 1.8.19\(\backslash\)n"{}});
\end{verbatim}
\end{english}

\tableofcontents
\end{document}

修订版第 1 页

理论上,可以设置 XeTeX 在你更改脚本时自动切换语言,wirh ucharclasses。手册声称这样的操作可以实现这一点:

\usepackage[Arabics]{ucharclasses}
\setTransitionsForArabics%
   {\begingroup\selectlanguage{persian}}%
   {\endgroup}

截至 2020 年,该软件包已损坏,并且似乎没有得到积极维护。 TeX Live 2020 中的许多交互babel似乎fontspec也出现了问题,但我能够解决这些问题。

我将省略支持 PDFTeX 的解决方案,因为它完全不同,并且完全由围绕经典 8 位 TeX 从未设计为支持波斯语这一事实的黑客攻击组成。

答案2

@艾伯特

你知道xepersianXeLaTeX 中的软件包吗?它对波斯语(Farsi)和阿拉伯语以及英语非常有用。当你在 CTAN 中设置 TeX Live 时,它​​会自动安装。它是由 Dr.Vafa Khalighi(karen Pahlavi-Iranian)编写的(参见 CTAN)。

注意:您不需要babel包裹或polyglossia包裹。

如果您使用多个软件包(例如amsmath),则\usepackage{xepersian}前言中必须是最新的软件包。然后在前言中输入\settextfont{your ttf font}。它适用于任何 TTF(操作系统中的真字体)。XB 字体(例如XB Yas.ttfXB Zar.ttf等是波斯语-英语字体-双语言)。

然后输入\setlatintextfont{your ttf latin font}(如果您想要波斯字体,就不要使用拉丁字体。注意:如果您想使用 XB 字体 - 双语言 - 用于波斯语和英语文本,那么您不需要此命令。因此您可以\setdigitfont{your ttf font}在文本中输入数字或在方程式中输入公式等。如果您选择波斯语(阿拉伯语-英语)字体,那么所有数字(即使在公式中)都将是波斯语(阿拉伯语-英语)数字。)

如果您想在文本中写英语或德语或...那么您可以输入\lr{your English text}或输入:

\begin{latin}
your latin text or index or ...
\end{latin}

xepersian自动从右到左输出 PDF 文件。

使用\leftline命令在输出中从左到右写入拉丁文本。

如果您使用 LaTeX 或 XeLaTeX 编写 TeX 文件,则在序言或文档中添加上述命令,然后就可以正常工作(注意:不要使用babelpolyglossia命令或包)并使用 XeLaTeX 进行编译。

现在您可以轻松地使用上述描述编写所需的 TeX 文件xepersian并获得所需的输出。

对于波斯语索引,Khalighi 博士写道quickindex。他甚至用xepersian软件包写了一首波斯语诗。或者为会议制作波斯语幻灯片或...

您搜索一下xepersian,然后就会在 XeLaTeX 中发现新世界。

相关内容