用 Typst Mark Everything Down,而非 TeX Them

Typst 是一款卓越的排版工具自从我第一次遇见它就将其融入了生活的每个角落——从课堂笔记数学草稿到您正在阅读的这篇博客文章

Typst 在何处胜过 LaTeX

Typst 与传统的 LaTeX 有何不同传统的解释是更快的编译得益于增量编译更轻松的写作现代语法消除了无尽的 \\ 命令以及更简单的安装排版质量如何坦率地说Typst 在这方面尚未超越 LaTeX其主要价值在于提供更流畅更直观的写作体验——而非排版上的完美例如借助 Tinymist 语言服务器您可以获得实时预览绕过了 LaTeX 的编译 - 查看工作流程尽管像 TeXpresso 这样的项目旨在缩小这一差距

作为一种年轻的语言仍处于 v0.x.x0.x.x 版本Typst 存在局限性并且在 LaTeX 占主导地位的学术界尚未被广泛采用当我在 Typst 中复制 LaTeX 的布局时有时会遇到障碍——某些功能根本还没有实现

经过数周的挫折我意识到Typst 目前还不是 LaTeX 的替代品至少对我来说目前还不是吸引我的是它的易用性——非常适合博客笔记或家庭作业解答而不是研究论文

人们用 LaTeX 做笔记只是因为他们只有 LaTeX

使用 LaTeX 做笔记会迫使注意力集中在格式而非内容上尽管其旨在分离样式/内容的设计有所帮助但等待编译的过程很容易让人分心于对齐问题或包冲突简而言之LaTeX 对于笔记来说是大材小用人们使用它仅仅是因为 Markdown 缺乏必要功能导致没有中间地带

Typst 弥合鸿沟

Typst 提供了类似 Markdown 的写作体验具有实时预览和直观的语法同时通过内置的数学排版引用等功能超越了 Markdown 的能力关键的是它能原生生成 PDF——这与依赖外部转换工具的 Markdown 不同这使 Typst 成为理想的中间选择而 LaTeX 由于其过度复杂性从根本上就不适合简单的笔记记录

历史上至少在我的记忆中物理学家在采用 LaTeX 写论文之前使用的是打字文本加手写公式现在有些人也误用它来做笔记 LaTeX 擅长论文排版但作为笔记工具则很失败Markdown 轻量但对于学术用途来说功能不足

扩展 Markdown例如添加数学支持导致了语法碎片化——相同的标记在不同的工具中行为各异

在此背景下Typst 自然成为了平衡的中间道路一旦我们接受这一定位许多感知到的限制就不再是问题担心排版不稳定请记住Markdown 甚至无法在不同平台间保持一致的渲染担心生态系统想想做笔记的人真正需要什么是一支用于捕捉思想的数字笔而不是一个用于完美排版的工业印刷车间在撰写博客课堂笔记——甚至起草论文时我们并不需要复杂的出版工具

Typst = Markdown + CSS + Pandoc + …

MarkdownMarkdown 的世界中语法本身 (以及相应的扩展) 仅仅标注了基本元素的结构而对于最终展示在人眼中的样式没有任何约束因此内容与样式的分离在这里会导致失控正如我们之前提到的那样但是内容与样式分离的失控会在某一个方面成为这一模式的优势

思考你在光照缺失的环境中撰写笔记你的 IDE 或者文本编辑器以一种令人愉悦的方式将编辑器页面渲染为美观的深色主题但是回顾你用 LaTeX 的悲惨经历吧旁边生成的 pdf 文字几乎完全都是白底黑字 (或者粗暴的反色)这让你感到刺眼和不适1

image
在深色主题下使用 LaTeX 撰写笔记时PDF 预览的效果令人不适
image
在深色主题下使用 LaTeX 撰写笔记时PDF 预览的效果令人不适

如果此时你有一份聪明的 Markdowns 预览工具以及一份适配了深色主题的 CSS 样式表那么你就可以愉快地在深色主题下编写笔记而不被高亮的白色 PDF 所打扰

如果试图在 LaTeX 中实现这个功能你可能需要一些比较复杂的宏包以保证在编译期能够正确识别你究竟是预览还是打印——前者需要生成恰当的深色主题样式而后者则需要生成传统的黑白样式但在 Typst 中编译器自动支持--input--input 参数通过传递ket=valueket=value你可以轻松在编译期修改不同的主题实现 (例如#isDark=true#isDark=true 来指示深色主题与否)接下来在模板文件中利用sys.inputssys.inputs 读取传入的参数就可以确认是否需要渲染深色主题


            
#let inputs = sys.inputs

            
#let get_input(input_dict) = {

            
  let isDark = false

            
  for (key, value) in input_dict {

            
    if key == "isDark" {

            
      isDark = value

            
    }

            
  }

            
  return (isDark: isDark)

            
}

            
#let (isDark) = get_input(inputs)

            
#let inputs = sys.inputs

            
#let get_input(input_dict) = {

            
  let isDark = false

            
  for (key, value) in input_dict {

            
    if key == "isDark" {

            
      isDark = value

            
    }

            
  }

            
  return (isDark: isDark)

            
}

            
#let (isDark) = get_input(inputs)

            
#let inputs = sys.inputs

            
#let get_input(input_dict) = {

            
  let isDark = false

            
  for (key, value) in input_dict {

            
    if key == "isDark" {

            
      isDark = value

            
    }

            
  }

            
  return (isDark: isDark)

            
}

            
#let (isDark) = get_input(inputs)

            
#let inputs = sys.inputs

            
#let get_input(input_dict) = {

            
  let isDark = false

            
  for (key, value) in input_dict {

            
    if key == "isDark" {

            
      isDark = value

            
    }

            
  }

            
  return (isDark: isDark)

            
}

            
#let (isDark) = get_input(inputs)

然后你只需要定义相应的颜色方案即可实现对于不同主题的切换支持

目前typsttypst 社区的普遍做法是使用Tinymist 语言服务器来实现实时预览功能这个语言服务器会在本地开放一个随机端口通过在本地浏览器中访问该端口来实现实时预览功能由于tinymisttinymist 复刻了 Typst 的编译器逻辑因此你可以通过--input--input 参数来传递不同的主题参数从而实现深色主题的支持例如在上面的例子中你只需要添加额外的--input isDark=true--input isDark=true 参数即可

image
在撰写本文时使用 Typst 实现深色主题预览的效果
image
在撰写本文时使用 Typst 实现深色主题预览的效果

你可能注意到了我在上面的预览中字体与行距也有所不同这同样是巧用 --input--input 参数实现的这样的好处是当我使用支持 kittykitty 图形协议的终端浏览器awrit我不需要重复进行放大或者裁剪边缘的操作

因此我们利用 typsttypst 工具轻松实现了类似 Markdown + CSSMarkdown + CSS 的功能

此外typsttypst 作为一个面向排版的标记语言他原生支持输出 pdfpdf并且在 v0.10.0v0.10.0 版本后增加了对于 htmlhtml 输出的支持这使得 typsttypst 也可以作为一个类似 PandocPandoc 的工具来实现不同格式的输出需求

烦恼即菩提

在将 Typst 定位为 LaTeX 替代品时我们自然会被其宏伟愿景所吸引一种适用于所有科学文档的统一语法——简单易用易于编写易于阅读但这个承诺在 Typst 的早期开发阶段与现实发生了碰撞成长的烦恼表现为无数细微的挫折一种解决方案是耐心等待 Typst 像 LaTeX 那样经过多年发展成熟但我们能合理投入多少时间呢如果没有视角的转变我们就有可能陷入无尽的烦恼之中

突破来自于重新定义问题与其追求完美的工具不如审视实际需求在日常工作流程中我们很少需要出版级的精度真正重要的是用一个方便易用的工具来捕捉思想和笔记这一认识将 Typst 从不完整的 LaTeX转变为功能增强的 Markdown突然之间挫折消散了——或者至少大大减轻了您会欣赏 Typst 优雅的语法强大的功能和实时预览而不是执着于它的局限性

  1. 1当然我承认目前有类似SioyekZathura的 PDF 阅读器支持精细的反色但是他们在使用的便利性等方面都存在或多或少的问题例如前者的内存占用常常飙升并且时常崩溃后者则常常失去反向查找功能当然我承认这些很多可能都是我自己的问题但这确实是引导我改变的动机之一

Back to all articles

Loading comments...