V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
xiaohanyu
V2EX  ›  分享创造

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

  •  4
     
  •   xiaohanyu ·
    xiaohanyu · 20 天前 · 2134 次点击

    如题:

    文章比较长,大概有 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  
       20 天前
    好文
    MillerD
        2
    MillerD  
       20 天前
    牛!
    lneoi
        3
    lneoi  
       20 天前
    繁简是靠工具的吗?还是都是手敲的
    xiaohanyu
        4
    xiaohanyu  
    OP
       20 天前
    @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  
       19 天前 via iPhone
    非常棒的文章 收获很大 发现我之前做 pdf 排版的时候居然自不量力自己实现换行算法。
    xiaohanyu
        6
    xiaohanyu  
    OP
       19 天前
    @z13zvxc 问下,你是什么产品需要自己做 PDF 排版呢?
    googlehub
        7
    googlehub  
       19 天前
    好文,很受用。
    baobao1270
        8
    baobao1270  
       19 天前
    看了文章,似乎没有提到标点禁则和孤行孤字控制?

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

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


    pdfkit 不好的一点就是没有 fallback font. 你这个方案是怎么支持中文/日文的?需要打包多个字体么?怎么样自动识别用哪个语言的字体?
    xiaohanyu
        15
    xiaohanyu  
    OP
       18 天前
    @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   ·   实用小工具   ·   3689 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:39 · PVG 18:39 · LAX 02:39 · JFK 05:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.