不久前,我问了一些关于 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}
如果仔细观察,您会发现\verbatim
环境中的波斯语文本没有以正确的方向显示(即使我在源中手动插入了从右到左和从左到右的标记)。
您可以像在第一个块中一样通过转义文本并使用 、 等来获得您可能想要的内容,alltt
而listing
不是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}
理论上,可以设置 XeTeX 在你更改脚本时自动切换语言,wirh ucharclasses
。手册声称这样的操作可以实现这一点:
\usepackage[Arabics]{ucharclasses}
\setTransitionsForArabics%
{\begingroup\selectlanguage{persian}}%
{\endgroup}
截至 2020 年,该软件包已损坏,并且似乎没有得到积极维护。 TeX Live 2020 中的许多交互babel
似乎fontspec
也出现了问题,但我能够解决这些问题。
我将省略支持 PDFTeX 的解决方案,因为它完全不同,并且完全由围绕经典 8 位 TeX 从未设计为支持波斯语这一事实的黑客攻击组成。
答案2
@艾伯特
你知道xepersian
XeLaTeX 中的软件包吗?它对波斯语(Farsi)和阿拉伯语以及英语非常有用。当你在 CTAN 中设置 TeX Live 时,它会自动安装。它是由 Dr.Vafa Khalighi(karen Pahlavi-Iranian)编写的(参见 CTAN)。
注意:您不需要babel
包裹或polyglossia
包裹。
如果您使用多个软件包(例如amsmath
),则\usepackage{xepersian}
前言中必须是最新的软件包。然后在前言中输入\settextfont{your ttf font}
。它适用于任何 TTF(操作系统中的真字体)。XB 字体(例如XB Yas.ttf
或XB 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 文件,则在序言或文档中添加上述命令,然后就可以正常工作(注意:不要使用babel
或polyglossia
命令或包)并使用 XeLaTeX 进行编译。
现在您可以轻松地使用上述描述编写所需的 TeX 文件xepersian
并获得所需的输出。
对于波斯语索引,Khalighi 博士写道quickindex
。他甚至用xepersian
软件包写了一首波斯语诗。或者为会议制作波斯语幻灯片或...
您搜索一下xepersian
,然后就会在 XeLaTeX 中发现新世界。