写了篇关于 LaTeX/Typst/React-pdf 排版引擎的长文:《排版引擎纵谈:程序员的视角》 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
xiaohanyu
V2EX    分享创造

写了篇关于 LaTeX/Typst/React-pdf 排版引擎的长文:《排版引擎纵谈:程序员的视角》

  •  5
     
  •   xiaohanyu
    xiaohanyu 2024-11-08 15:22:54 +08:00 3807 次点击
    这是一个创建于 366 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题:

    文章比较长,大概有 3 万多字,主要对比了以下五种排版引擎的优缺点和各自的使用场景:

    • HTML & CSS
    • LaTeX
    • LaTeX.js
    • Typst
    • React-pdf

    Knuth Plass Line Breaking Algorithm

    对以下话题感兴趣的,可以看看哈:

    • 排版引擎相关
    • CJK 排版
    • PDF 生成
    • LaTeX vs Typst
    • HTML/CSS 排版的一些技术等

    目录:

    • 序言
    • 评估标准
      • 神圣的换行算法
      • CJK 排版的复杂性
        • CJK 字符集庞大
        • 文化的细微差别
        • 字体搭配
    • HTML & CSS
      • 换行
      • CJK
      • 分页
      • 实时预览
      • 结论
    • LaTeX
      • 换行
      • CJK
      • 分页
      • 实时预览
      • 结论
    • LaTeX.js
      • 换行
      • CJK
      • 分页
      • 实时预览
      • 结论
    • Typst
      • 换行
      • CJK
      • 分页
      • 实时预览
      • 结论
    • React-pdf
      • 换行
      • CJK
      • 分页
      • 实时预览
      • 结论
    • 总结
    15 条回复    2024-11-10 18:32:14 +08:00
    BeijingBaby
        1
    BeijingBaby  
       2024-11-08 15:26:10 +08:00
    好文
    MillerD
        2
    MillerD  
       2024-11-08 15:47:41 +08:00
    牛!
    lneoi
        3
    lneoi  
       2024-11-08 16:27:01 +08:00
    繁简是靠工具的吗?还是都是手敲的
    xiaohanyu
        4
    xiaohanyu  
    OP
       2024-11-08 17:12:22 +08:00
    @lneoi https://github.com/BYVoid/OpenCC

    ```
    opencc -i apps/blog/src/pages/posts/zh-CN/on-typesetting-engines.mdx -o /tmp/tt.mdx -c /opt/homebrew/opt/opencc/share/opencc/s2twp.json
    ```
    z13zvxc
        5
    z13zvxc  
       2024-11-08 18:41:24 +08:00 via iPhone
    非常棒的文章 收获很大 发现我之前做 pdf 排版的时候居然自不量力自己实现换行算法。
    xiaohanyu
        6
    xiaohanyu  
    OP
       2024-11-08 19:13:27 +08:00
    @z13zvxc 问下,你是什么产品需要自己做 PDF 排版呢?
    googlehub
        7
    googlehub  
       2024-11-08 20:59:26 +08:00
    好文,很受用。
    baobao1270
        8
    baobao1270  
       2024-11-08 21:53:53 +08:00
    看了文章,似乎没有提到标点禁则和孤行孤字控制?

    总的来说,HTML/CSS 能力太弱,Typst 不够成熟。LaTeX 从效果上来看是最佳,但是个人感觉它的 CJK 依然比较复杂。比起专业的排版软件(方正书版之类的),LaTex 或许还不够好(不管是易用性还是功能性上),但可惜这类软件并没有开放的接口。
    xiaohanyu
        9
    xiaohanyu  
    OP
       2024-11-08 22:26:36 +08:00
    @baobao1270 标点禁则、悬挂、孤行孤字这些太过细节了,除了 LaTeX ,别的几个应该没有一个有完整支持的。为了控制篇幅(尽管已经很长了),所以我没有过多的写这些。

    另外,像 InDesign/方正书版之类的,我没有写是因为这些软件应该不太好通过 API 的形式生成 PDF 文档吧,不太符合我的产品的应用场景。
    coolfan
        10
    coolfan  
       2024-11-09 00:33:01 +08:00
    写得好诱人
    cyp0633
        11
    cyp0633  
       2024-11-09 00:39:01 +08:00
    我记得 arXiv 上的 HTML 功能用的是另一种实现,LaTeXML ,有好多宏包不支持,推出好久还在 beta
    typst 有许多令人感到舒适的地方,更符合一个循序渐进的语法,假以时日应该会变得真正好用
    xiaohanyu
        12
    xiaohanyu  
    OP
       2024-11-09 10:18:09 +08:00
    @cyp0633 看了眼 LaTeXML ,应该也就是一个 transpiler ,跟 LaTeX.js 有点像,但是我感觉这些项目都很难实现对 LaTeX 的 100% 兼容。我个人觉得,把 LaTeX 跑到浏览器里还是 wasm 这条路比较有前途。
    CasualYours
        13
    CasualYours  
       2024-11-09 11:16:44 +08:00
    好文章
    gogogo1203
        14
    gogogo1203  
       364 天前
    3 个月前开始做一个 trip planner to PDF 的时候研究过 react-pdf, 对 tailwind 和 css 的支持太差。纯文字的还好,react component 经常打不出来。 最后用 satori +pdfkit.


    pdfkit 不好的一点就是没有 fallback font. 你这个方案是怎么支持中文/日文的?需要打包多个字体么?怎么样自动识别用哪个语言的字体?
    xiaohanyu
        15
    xiaohanyu  
    OP
       364 天前
    @gogogo1203 我实际上用的是 react-pdf-viewer 来显示的 PDF ,是支持自己指定 character map 的: https://github.com/react-pdf-viewer/react-pdf-viewer/issues/107#issuecomment-643749966 ,然后就可以显示 CJK 了。

    但是 react-pdf-viewer 这个库也有一些问题,最近可能不怎么维护了,另外就是 bug 也有点多。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1222 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 23:54 PVG 07:54 LAX 15:54 JFK 18:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86