Tags: katex
现在有一个半成品可用 https://github.com/congyu711/KaTeXFira Math 这字体很不错, 想要在 KaTeX 中使用它. 有用的链接:
- https://yingtongli.me/blog/2022/09/24/katex-custom-fonts.html – alphanumeric text only
- https://github.com/KaTeX/KaTeX/discussions/3716
- https://github.com/firamath/firamath.github.io/blob/master/bibliography.md
- https://learn.microsoft.com/en-us/typography/opentype/spec/math
1 KaTeX 字体部分如何工作?
关于 fonts 和 metrics 有关的东西首先要看dockers/fonts/.
看起来 fonts/里面的字体是从 docker 中安装的 texlive 的
computer modern fonts 提取的.
然后dockers/fonts/buildMetrics.sh 调用
src/metrics里面的代码,直接从有关的 tfm 文件里读一些 metric
信息.
(我猜)生成的 ttf,woff2 等字体是保存 unicode -> (字形 + 一些信息)
这个映射关系的文件.
src/metrics/mapping.pl 就是从 tex math 到 unicode 的映射.
做完这个输出这样的东西
{
...
"AMS-Regular": {
"65": {
"char": 65,
"yshift": 0,
"xshift": 0,
"font": "msbm10"
},
...src/metrics/extract_tfms.py 得到
{
"AMS-Regular": {
"65": {
"depth": 0.0,
"height": 0.68889,
"italic": 0.0,
"skew": 0.0,
"width": 0.72222
},
...src/fontMetricsData.js.
我猜如果成功的把 Fira Math 的 metric 弄到这个 js 文件里, 接下来改改 css
里的字体然后 rebuild 就行了.
采集 metric 和生成 fonts 的过程是独立的,
所以看起来大部分东西都是可以复用的.
2 Plan
- 由于 KaTeX 本身字体分成很多小文件, 首先我也把 Fira Math 分成小文件
- 然后想办法搞到正确的
src/metrics/mapping.plfor Fira Math - 最后改改css或者先rebuild再改css之类的.
- 在 1. 中把Fira Math 像computer modern一样分成小文件可能可以避免让我需要修改大量KaTeX代码. KaTeX这样做是因为cm在TeX中是Type 1 font, 单个文件只能容纳256字符.
- Fira Math是Open
Type font. glyph id 到对应字符的 unicode
码位的映射已经包含在了字体的cmap表中. KaTeX生成的html里是unicode字符,
所以我不需要为Fira Math修改
src/metrics/mapping.pl, 但是仍然需要对应的src/fontMetricsData.js.
3 Extract fonts
KaTeX 把\mathbb{A} \mathcal{B}
等等符号全部映射到普通拉丁字母 A,B 上,
这就导致需要在映射的时候做点工作. 而且另一个问题是 KaTeX_AMS-Regular
等字体在使用 unicode private use area 表示一些 unicode 中缺少的符号,
比如src/fonts/makeFF中有这样的代码
0x0A => 0xE010, # \nleqslant
0x0B => 0xE00F, # \ngeqslant3.1 Italic
事实上从 KaTeX 的 commit history 能看到字体主要是 ylemkimon 的工作. 我发邮件问了问他这些问题, 没有得到回复. 不过我看到这个知乎回答之后觉得映射问题可能是为了兼容 screen reader? 不过我不觉得这样做就能让 screen reader 正确读出公式. 另外要谢谢曾祥东老师, 他是 Fira Math 的主要作者, 读博客和介绍 FiraMath 的知乎回答都让我学到很多东西.如果只是更换字体的话, 很多东西看起来有点奇怪
4 接下来…
现在 Typst 看起来是个输出有点排版需求的 html 内容的好选择. 这里是个例子, 可以看到公式被 Typst 变成了 svg. 效果不错, 但是不知道如果有很多公式的话绘制一堆 svg 会不会很慢, 页面会不会变得很大. 如果要修改 KaTeX 的话, 我觉得会有很大的工作量. 一方面 KaTeX 本身有点古老, 很多功能的实现方式太局限了. 另一方面我不懂 js 也不懂排版, 估计需要了解 open type 字体、unicode-math 的工作方式等.4.1 Typst svg
用这个来让 Typst 在 html 导出中把所有公式都变成 svg.#show math.equation: html.frame
#show math.equation.where(block: false): box
typst compile input.typ -f html htmloutput.html --features html+-----------------+-------+
| outputs | size |
+-----------------+-------+
| PDF-XeTeX | 25KB |
| PDF-Typst | 39KB |
| html-Typst | 194KB |
| FiraMath font | 122KB |
+-----------------+-------+