背景
在实现现代化的同时新的排版系统(NTS)变成一个 100% 纯 Java 库来生成 TeX 的 SVG 版本,我陷入了僵局。
问题
问题是数学和连字符无法正确呈现。David Carlisle 告诉我:
有两个问题,字体格式和编码,classic tex 并不关心格式,只要它有 tfm 度量,真正的字体可以是 pk (bitmap) pfa 或 pfb (type1) ttf (truetype) 或者任何你需要的,但字体必须采用旧式编码,所有字符都低于 127。要使用 latinmodern-math.otf,主要问题不是它是 opentype 格式,而是它是 unicode 编码,因此你需要重新定义 \sqrt(以及几千个其他命令)来访问位置 8730,√ 的 unicode 插槽
跟踪。当代码点\pi
出现时,Java 代码接收 0x19(十进制 25)。很少有 TTF/OTF 字体将代码点 25 映射到 π 字形,因此存在障碍。
代码
我已经扩展了 Knuth 的未修改版本plain.tex
以使用贝尔利克通过创建ext/math.tex
,它基本上包含以下内容:
% Change fonts to use Latin Modern.
\input base/plain
\font\tensy=blsy
\font\tenex=blex
\font\teni=rblmi
\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
document.tex
这样就可以进行如下书写:
\input ext/math
$\sqrt{\pi}$
\bye
系统 .tfm
文件是通过借用txfonts/tfm,结果为:
值得一提的是,txfonts 被复制为 Belleek TFM,如下所示:
- txfonts/tfm/txex.tfm ➡ belleek/tfm/blex.tfm
- txfonts/tfm/txsy.tfm ➡ belleek/tfm/blsy.tfm
- txfonts/tfm/rtxmi.tfm ➡ belleek/tfm/rblmi.tfm
为了好玩,我还渲染了以下内容:
\input ext/math
$-\frac{{\hbar ^2 }}{{2m}}\frac{{\partial ^2 \psi (x,t)}}{{\partial x^2 }} + U(x)\psi (x,t) = i\hbar \frac{{\partial\psi (x,t)}}{{\partial t}}$
\par
$E=mc^2$
\par
$\sqrt{\pi}$
\par
$(a+b)^2=a^2 + 2ab + b^2$
\par
$S_x = sqrt((SS_x)/(N-1))$
\par
$e^{\pi i} + 1 = 0$
\par
$\sigma=\sqrt{\sum_{i=1}^{k} p_i(x_i-\mu)^2}$
\par
$\sqrt[n]{\pi}$
\par
$\sqrt[n]{|z| . e^{i \theta}} = \sqrt[n]{|z| . e^{i (\frac{\theta + 2 k \pi}{n})}}, k \in \lbrace 0, ..., n-1 \rbrace, n \in NN$
\par
$\vec{u}^2 \tilde{\nu}$
\par
$\sum_{i=1}^n i = (\sum_{i=1}^{n-1} i) + n =\frac{(n-1)(n)}{2} + n = \frac{n(n+1)}{2}$
\par
$\int_{a}^{b} x^2 dx$
\par
$G_{\mu \nu} = \frac{8 \pi G}{c^4} T_{{\mu \nu}}$
\par
$\prod_{i=a}^{b} f(i)$
\par
$u(n) \Leftrightarrow \frac{1}{1-e^{-jw}} + \sum_{k=-\infty}^{\infty} \pi \delta (\omega + 2\pi k)$
\par
$\rightleftharpoons\angle\hbar$
\bye
产生了:
使用原版计算机现代TFM文件产生类似的结果。即:
- cm/tfm/cmmi10.tfm ➡ belleek/tfm/rblmi.tfm
- cm/tfm/cmex10.tfm➡belleek/tfm/blex.tfm
- cm/tfm/cmsy10.tfm➡belleek/tfm/blsy.tfm
问题
我需要做什么才能在 Java 中正确排版数学?一些想法:
尝试为 Belleek 的 TTF 文件创建一个 TFM 文件。
添加Java 代码将 Knuth 的代码点从计算机现代数学映射到拉丁现代数学,例如通过读取以下形式的 CSV 文件:
cmr10,0x11,rm-lmr10,0xFB00 cmmi10,0x19,latinmodern-math,0x03C0
如果添加 Java 代码,我该如何创建地图?
尝试从 Knuth 的原始
.mf
文件重新创建 Computer Modern,类似于 Richard Kinch 创建 Belleek 的方式,并创建文件.tfm
。请求 Richard Kinch 提供 Belleek 的 TFM 文件。
我绝对愿意接受其他想法,除了整合 XeTeX/LuaTeX/MathJax/KaTeX,或者切换到数学。
答案1
BaKoMa 的 TTF 文件的代码点与 Belleek 的 TTF 文件中的代码点(以及 Knuth 的原始代码点)类似,但单独的字形组向上移动。以十进制表示,移位如下:
- 0 至 9 移至 161 至 170
- 20 移至 128
- 10 至 32 移至 173 至 195
代码移位在所有文件中一致应用cm*.ttf
。这样可以使用单个 Java 转换函数捕获代码移位,例如:
private static final Function<Integer, Integer> CM = codepoint -> {
if( codepoint <= 9 ) {
// 0 to 9 are shifted to 161 to 170
return codepoint + 161;
}
else if( codepoint == 20 ) {
// 20 is shifted to 128
return 128;
}
else if( codepoint <= 32 ) {
// 10 to 32 are shifted to 173 to 195
return codepoint + 163;
}
return codepoint;
};
NTS 现在可以生成以下可缩放矢量图形:
还有一些未解决的问题,但在使用 ConTeXt(或任何其他基于 TeX 的系统)排版之前进行快速预览,它看起来还不错。