背景

背景

背景

在实现现代化的同时新的排版系统(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

产生了:

数学-2

使用原版计算机现代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 的系统)排版之前进行快速预览,它看起来还不错。

相关内容