是否可以使用软件包中的旧天城体字体sanskrit
和velthuis
现代直接天城体 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 字体的屏幕截图:
事实上,如果你读过这些 包,这些字体具有许多功能(自定义特定的连字或整个“样式”、相对于周围的罗马字符调整大小、更改字符内和字符间的间距,以及各种我不完全理解的吠陀重音的内容),我甚至不确定 Unicode+OpenType 的当前字体标准(以及 TeX 与它们的接口:fontspec)是否支持所有这些功能。
因此,除非有足够多的 Unicode+OpenType 字体与这些字体等效,否则如果您需要旧字体,最好的解决方案可能仍然是使用旧软件包进行排版。幸运的是,这在 XeTeX 中仍然是可能的:输入类似的{\dn Dm\0\322w\?/\? \7{k}z\322w\?/\?}
仍然可以产生相同的输出。为了使用 Unicode 输入实现这一点,人们可能能够对devnag
和skt
预处理器进行逆向工程,并编写一个 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
通常很危险;确保输入是可信的),您会得到:
您可以看到,尽管输入的是 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: