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

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

  •  4
     
  •   xiaohanyu ·
    xiaohanyu · 6 天前 · 1635 次点击

    如题:

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

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

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


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