从LaTeX到声明式

所见即所得

我们已经习惯了使用MS Word类似的操作逻辑来编写具有复杂排版的文档。假设我们要编写一张贺卡,祝你的朋友生日快乐,从一篇空文档开始,我们干的事情大概如下:

  1. 写下生日快乐四个字
  2. 想一想,发现宋体小字号不太好看,于是选中切换成华文彩圆把字号拉到72px。
  3. 发现要画一些背景上去,从网上下载一张图片换成背景
  4. 意识到自己要写下来一些文字,于是敲进去一些祝福语。
  5. …….

这种操作逻辑我们已经习以为常,从我们日常使用的MS Word,到Adobe InDesign之类的专业排版工具我们一直都在使用。这种操作逻辑有一个显而易见的优势:易于理解,我们把做的事情一步步写下来,然后按照顺序向软件发送命令,顺序很重要不能颠倒….等等。实际上这种操作逻辑有一个名字:命令式。我们把做一件事情的方法按照步骤写下来,按照顺序执行。这种编码方式深入人心,我们用它制作了相当多的卓越并且令人惊叹的排版作品:

这真的很好看

但是这种方法其实存在一些问题:而这个在InDesign中最为显著,而受限于它本身的设计模式,Adobe, Microsoft都无法解决这个问题,反而让这个问题变得愈发的严重了。

假设我们要排版一张页面,要像上图一样有精美的排版,我们需要完成一系列复杂的操作。这些复杂的操作可以被分解为更小的原子操作。问题在于:这些操作过多过繁杂还具有具有相对的顺序让事情变得更加糟糕了。每一个亮眼的特性可以被分解为几个毫不相干的操作之间的巧妙叠加——但是它巧妙过头了。记住这些操作能带来这样的结果本身就要消耗不少心力,再者你在做的事情是创意性工作,你还需要根据一个自己想出来的亮眼效果,反推如何从一大堆原子操作的工具箱里组合出来他们。你还需要思考这些原子操作在这个巨大InDesign工具箱的哪个下拉菜单里。这些能力被称为一个排版设计师的“经验”,这些经验从无数的实践中获得,当然要花费很多时间。更显然的结论是InDesign一个简单的年更新就有可能将经验化为乌有——那它还真的能被称作经验吗?

排版为内容服务,尤其是上图这种TTRPG规则的排版。如果你已经花了太多时间在“如何创造一个酷排版”上,你大概就没有那么多心力专注于内容本身了。所以你需要一种解决方案,它能根据你写下的文字内容自动生成酷的排版,当然怎么生成当然需要管,但是不要和内容耦合的那么深,以至于改一点内容排版就要大改的程度。

做什么而非怎么做

MS Office曾经试图解决这个问题:于是我们引入了从小学生演讲者到现代打工人都熟知于心的"模板"。从基本实现原理来看,PowerPoint模板本质上是一个带了一些元数据的一张已经被设计好的一些幻灯片。这些元数据指定了每张幻灯片是干什么用的,每张幻灯片上有几个内容可以去的文本框,当你想要一张酷酷的幻灯片的时候,只需要导入模板,创建你想要的一页幻灯片,然后把内容复制粘贴进去就行了。

这已经足够高效了,但是不妨我们再幻想一下接下来我们应该怎么进一步发扬这种思想。我们应该有一种方法,根据纯文字生成幻灯片。我们只需要在文字里插入“这是标题”,“这是数据”,这里切换下一页之类的标签,但是我们不会细致到这里多少个像素,这里用什么字体,然后我们通过一种神奇的机器把这串实际上没有耗费多少精力的纯文本直接转化为漂亮的幻灯片!完全不用思考内容该怎么排布,因为这个神奇的机器会自己替你干!

于是我们触及了 声明式范式 的核心精髓。而早在个人电脑普及之初,甚至在图形界面成为主流之前,一种强大的声明式排版系统就已经存在并深刻影响了计算机科学——它就是 LaTeX

当然我们在没有“怎么做”的情况下无法完成任务,但是如果我们把内容(声明)排版(基于规则的转换) 完全切分开,这本身就能给设计排版的过程减少大量负担。这种彻底的分离——不可变的内容声明与基于规则的样式转换——其思想内核与函数式编程追求纯函数(输出只取决于输入,无副作用)、不可变数据和高阶抽象的理念高度重合。 我们将在探讨LaTeX之后,特别谈谈这些关系。

具体如何?

使用 Hugo 构建
主题 StackJimmy 设计