古梵字体和 Unicode 输入

古梵字体和 Unicode 输入

是否可以使用软件包中的旧天城体字体sanskritvelthuis现代直接天城体 Unicode 输入法?它们需要输入 velthuis 音译,并且需要运行它们的预处理器来分别生成.tex文件.skt.dn文件。我了解到 velthuis 字体已用于生成 FreeSerif 字体的天城体范围,但会丢失连字。

例子:

一份dn文件:

\documentclass{article}
\usepackage{devanagari}
\begin{document}
\begin{verse}
{\dn dharmak.setre kuruk.setre samavetaa yuyutsavaa.h | \\
maamakaa.h paa.n.dava"scaiva kimakurvata sa~njaya || }
\end{verse}
\end{document}

运行devnag预处理器后我们生成以下tex文件:

\def\DevnagVersion{2.15}\documentclass{article}
\usepackage{devanagari}
\begin{document}
\begin{verse}
{\dn Dm\0\322w\?/\? \7{k}z\322w\?/\? smv\?tA \7{y}\7{y}(svA, . \\
mAmkA, pA\317wXv\396w\4v Ekm\7{k}v\0t s\3D2wy .. }
\end{verse}
\end{document}

具有以下 pdf 输出:

在此处输入图片描述

相比之下:

\documentclass{article}
\usepackage{fontspec}
\setmainfont[Script=Devanagari]{FreeSerif}
\begin{document}
\begin{verse}
धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः ।\\
मामकाः पाण्डवाश्चैव किमकुर्वत सञ्जय ॥\\
\end{verse}
\end{document}

生成以下 pdf:

在此处输入图片描述

对于 1990 年代使用 velthuis 包启动的版本项目来说,这尤其有趣,他们希望新卷与旧卷完全相同。

我认为理论上可以为这些字体创建映射文件,但那将是一项巨大的可行,所以还没有人敢这么做?或者可以将字体从 metafont 转换为 truetype?

答案1

(这篇长文的结尾处有一些答案!)


生成梵文输出的现代方法是使用 XeTeX/LuaTeX 和现代 (OpenType) 字体,如这个问题下面是一些示例。(XeTeX 和 LuaTeX 的输出可能不同,因为 XeTeX 使用如下系统库哈夫巴兹用于字形定位,而 LuaTeX 则试图避免外部依赖并自行实现所有功能:这就是为什么 LuaTeX 不支持大多数印度文字,尽管它对天城文的支持最近有所改进。)

这个问题是关于 20 世纪 90 年代早期的两种特定旧字体,它们使用旧式编码,并且不适用于 OpenType 格式。提出这个问题的原因可能是您想精确匹配这些字体,或者使用这些字体中存在但现代梵文字体中不存在的某些功能。

这两种字体是:

  • Frans J. Velthuis 的字体,其 Metafont 源可在texmf-dist/fonts/source/public/velthuis(或这里)。此字体属于devanagari包裹,这需要将您的输入写入文件中,而不是以 Unicode(如धर्मक्षेत्रे कुरुक्षेत्रे)的形式,而是以特定于该包的 ASCII 兼容格式(如{\dn dharmak.setre kuruk.setre}.dn,然后使用devnag二进制文件将其预处理为.tex文件(其中包含类似 的行{\dn Dm\0\322w\?/\? \7{k}z\322w\?/\?})。排版此.tex文件会产生梵文输出。

  • Charles Wikner 的字体,其 Metafont 源可在texmf-dist/fonts/source/public/sanskrit(或这里)。此字体属于sanskrit包裹,这(再次)涉及使用 Unicode 而不是 Unicode 编写输入其他将该软件包特有的 ASCII 兼容格式(如{\skt ...}.skt预处理为一个文件,然后使用skt二进制文件(从源代码编译skt.c)将其预处理为一个.tex文件(其中包含 等行{\skt ;Da;mRa;[ea:t3ea k\ZH{-12}{u}+.r8+:[ea:t3ea})。排版此.tex文件会产生梵文输出。

您可以在此网站上搜索devnag以及skt查看有关这两种字体/包的问题。

问题是如何以 Unicode 输入(如धर्मक्षेत्रे कुरुक्षेत्रे)但仍以其中一种字体输出。


理想的解决方案是,如果存在与这些字体相同的现代 OpenType 字体。在这方面已经采取了一些措施:

  • GNU FreeFont 项目的 FreeSerif 字体显然使用了 Velthuis 字体作为其 Unicode 梵文范围字形的基础。但是,它不包含梵文所需的所有辅音群(连字符),正如您在问题和其他答案(也在下面)中看到的那样。它的最后一次正式发布是在 2012 年。开发版本有更多的连字符;这个存储库是最近才建成的。(见这里OP 的这个错误报告。)虽然已经很接近完美了,但看起来仍然不够完美。而且它不包含旧字体中的斜体和其他样式特征。
  • Karel Píška 在 TUGboat 上撰写了一些文章2002-2005 年期间,印度字体被转换为轮廓格式。因此,字体已经转换为 PostScript Type 1 格式。然而,这些字体使用(巧妙的)自定义编码,其字形未映射到 Unicode 代码点及其连字符——它们甚至包括部分真实字符的字形。请参阅 Wikner 文档中的这些屏幕截图以及在 FontForge 中打开 Velthuis 字体的屏幕截图:

    skt(Wikner)字体表

    FontForge 中的 dvng10 (Velthuis)

事实上,如果你读过这些 ,这些字体具有许多功能(自定义特定的连字或整个“样式”、相对于周围的罗马字符调整大小、更改字符内和字符间的间距,以及各种我不完全理解的吠陀重音的内容),我甚至不确定 Unicode+OpenType 的当前字体标准(以及 TeX 与它们的接口:fontspec)是否支持所有这些功能。


因此,除非有足够多的 Unicode+OpenType 字体与这些字体等效,否则如果您需要旧字体,最好的解决方案可能仍然是使用旧软件包进行排版。幸运的是,这在 XeTeX 中仍然是可能的:输入类似的{\dn Dm\0\322w\?/\? \7{k}z\322w\?/\?}仍然可以产生相同的输出。为了使用 Unicode 输入实现这一点,人们可能能够对devnagskt预处理器进行逆向工程,并编写一个 TECkit 映射或执行这项工作的预处理器。或者,我们可以使用一种 hack:我们可以采用 Unicode Devanagari 输入,音译为软件包附带的预处理器采用的自定义输入编码,对这个分别用或包围的音译文本运行预处理器{\dn ...}{\skt ...}最后读回该结果并将其用作输入。

这里是该 hack 的一个实现 :-) TeX 宏获取 Unicode Devanagari 输入并将其写入文件,然后调用Python 脚本将 Unicode Devanagari 音译为预处理器所需的编码,调用预处理器,提取输出并将其写回到文件,该文件再次由 TeX 读取。(在下面的例子中,TeX 宏获取,धर्मक्षेत्रे कार्त्स्न्यम् विद्भिःPython 脚本(使用预处理器)将其转换为{\dn Dm\0\322w\?/\? kA(-\306wy\0\qq{m} EvE\389w, }。)

(这只是一个概念验证,除了这个示例文件之外还没有经过很好的测试;而且它不能访问该包特别擅长的任何定制(或吠陀口音):您可以编辑这些的 Python 脚本。)

\documentclass{article}
\usepackage{fontspec}  % For modern OpenType fonts
\usepackage{devanagari}  % For the old Velthuis fonts
\usepackage{skt} % For the old Wikner fonts

\newfontfamily\noto[Script=Devanagari]{Noto Sans Devanagari}
\newfontfamily\chandas[Script=Devanagari]{Chandas}
\newfontfamily\sktwo[Script=Devanagari]{Sanskrit 2003}
\newfontfamily\nakula[Script=Devanagari]{Nakula}
\newfontfamily\freeserif[Script=Devanagari]{FreeSerif}
\newfontfamily\freeserifdev[Path=freefont-svn/,Script=Devanagari]{FreeSerif.otf}

\newwrite\myfile
\newcommand\devpreprocess[2]{%
\immediate\openout\myfile=\jobname.#1.devnagtmp%
\immediate\write\myfile{#2}%
\immediate\closeout\myfile% Seems necessary
\immediate\write18{python get-dn.py #1 \jobname.#1.devnagtmp}%
\input\jobname.#1.devnagtmp.devnagout%
}
\newcommand\prepdn[1]{\devpreprocess{dn}{#1}}
\newcommand\prepskt[1]{\devpreprocess{skt}{#1}}

\begin{document}

In different fonts:

\begin{tabular}{l l}
Noto Sans Devanagari & {\noto धर्मक्षेत्रे कार्त्स्न्यम् विद्भिः} \\
Chandas & {\chandas धर्मक्षेत्रे कार्त्स्न्यम् विद्भिः} \\
Sanskrit 2003 & {\sktwo धर्मक्षेत्रे कार्त्स्न्यम् विद्भिः} \\[1em]
Wikner (preprocessed input) & {\skt ;Da;mRa;[ea:t3ea k+:a;t=+:\ZM{rMolHneHegMi}yRa;m,a ;Y2a;va;Y5a;;d2\ZM{x0Bi0ed0E}\ZS{1}H\ZS{4}} \\
Wikner (Unicode + hack) & \prepskt{धर्मक्षेत्रे कार्त्स्न्यम् विद्भिः} \\[1em]
Free Serif & {\freeserif धर्मक्षेत्रे कार्त्स्न्यम् विद्भिः} \\
Free Serif Dev & {\freeserifdev धर्मक्षेत्रे कार्त्स्न्यम् विद्भिः} \\
Velthuis (preprocessed input) & {\dn Dm\0\322w\?/\? kA(-\306wy\0\qq{m} EvE\389w,} \\
Velthuis (Unicode + hack) & \prepdn{धर्मक्षेत्रे कार्त्स्न्यम् विद्भिः}
\end{tabular}

\end{document}

如果您安装了所有这些字体,那么当您使用以下命令运行上述操作时xelatex -shell-escape(注意:使用-shell-escape通常很危险;确保输入是可信的),您会得到:

hack 的 PDF 输出

您可以看到,尽管输入的是 Unicode,但您获得的还是旧的 Sankrit 包的输出。

答案2

我看不懂剧本,所以很难比较,但是

\documentclass{article}
\usepackage{fontspec}
\setmainfont[Script=Devanagari]{FreeSerif.ttf}
\begin{document}
\begin{verse}
धर्मक्षेत्रे कुरुक्षेत्रे समवेता युयुत्सवः ।\\
मामकाः पाण्डवाश्चैव किमकुर्वत सञ्जय ॥\\
\end{verse}
\end{document}

在 texlive 2016 中使用 xelatex 和 lualatex 会产生明显不同的结果。如果我能理解这些形式的话,xelatex 使用的连字符比 luatex 多。

顶部是 xelatex,下面是 lualatex:

在此处输入图片描述

相关内容