PPT 神器 Pandoc

背景

嗯,标题并没有写错,当然副标题应该是「使用 Pandoc 将 Markdown 转换为 PPTX」,之所以说 PPTX,是强调不是其他的幻灯片,而是 Mircosoft 家的 PowerPoint(下文中 PPT 仅指代这一文件类型,以区分指代所有幻灯片类应用的「幻灯片」……)。

众所周知,幻灯片早已成为业界公害、文案毒瘤类的存在,但在会议演示等场景又确实有其独特优势,因此出现了不少诸如 Reveal.js 、Marp 之类的小品级工具,这些工具要说省事也还算省事,但成果简陋,功能有限。

而幻灯片之所以为人诟病,制作效率低是一大主因(图文不相关是另一大主因,因为这一点以及后续提到的另一点,本文将坚持抵制各种花里胡哨,详见后文),而说到制作效率,内容样式分离的 Markdown 当然是独占鳌头,所以通过 Markdown 转换自然是制作幻灯片的首选,但这种转换虽然实现方案众多,且各有亮点,但实际定制性、扩展性都非常糟糕。像上面提到的 Reveal.js 是转成网页,Marp 看上去能转 PPT 文件,实际上却是转图片再套个 PPT 壳(完全没法修改),如果只是做到这个程度,直接用 Word 写幻灯片(改改页面尺寸和字体大小……)不是更方便强大吗?(说起来 Word 也可以直接转 PPT ,不过使用麻烦效果也不佳)

用法

唠叨这么多,接下来终于轮到主角登场——Pandoc,可以基于特定语法将 Markdown 直接转换为 PPT,更赞的是可以指定 PPT 模板(实际上除了 pptx, Pandoc 还支持多种幻灯片的转换,包括 S5、 DZSlides、 Slidy、 Slideous、Reveal.js 、 LaTeX beamer 等等) 。而有了 PPT 文件还可以在 PowerPoint 中继续随意修改和深度编辑。保守估计,PPT 制作效率起码提升 5 倍,说神器是名副其实。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
---
title: 幻灯片标题
author: 作者
date: 日期
---

# 节标题(单页标题)

## 页面标题

### 页面内容标题1

页面内容1

### 页面内容标题2

页面内容2

## 页面标题2

页面内容3

:::notes
幻灯片备注
:::

执行相关命令后,以上代码将生成文字描述的 PPT 内容,语法简单,实现便利,特别是还支持幻灯片备注(演讲者视图的福音)。

注意:因为 Pandoc 要兼顾其他幻灯片应用等原因,上述文档如果没有 页面内容3 这一行代码,## 页面标题 等2级标题同样会转换成一页节标题(单页标题)。

模板

Pandoc 方案的一大亮点是支持 PPT 模板,但一些 PPT 的布局名称(特别是中文布局名称)与默认的英文布局名称不一致会导致转换报错,因此最好是先使用 Pandoc 命令生成基础转换模板 pandoc -o custom-reference.pptx --print-default-data-file reference.pptx ,在此基础模板上调整样式,注意这里的调整样式包括调整模板的主题(设计-变体中的颜色、字体、效果)和模板的「幻灯片母版」(而非幻灯片页面的版式)。修改模板之前最好了解一些 PowerPoint 的基本设定,能够大幅提升效率。

虽然 Pandoc 支持两栏内容等页面布局,也支持在 Markdown 中嵌入图片,但具体实现似乎还有些问题,例如图文混排,会只能显示文字或图片的一种或者会错误的分成两页;而所谓的 Comparison (比较)布局一直调不出来。可以考虑在 Markdown 中统一采用 Title and Content(标题和内容)布局,生成 PPT 后再手动调整页面版式(此处应有掌声 AHK )、插入图片和列表。当然也可以酌情使用 Two Content(两栏内容)布局。

如此操作就可以基于已有文案根据基础模板迅速生成包含大量单栏页面内容的 PPT 了,考虑到并不是每张幻灯片都有配图,可以简单粗暴的将内容页分为两类,无图内容页单栏布局、有图内容页双栏布局(左字右图,具体宽度可在模板中定好)。

麻烦的双栏代码

1
2
3
4
5
6
7
8
9
10
11
## 页面标题
:::::::::::::: {.columns}
::: {.column}
### 左栏标题
左栏内容
:::
::: {.column}
### 右栏标题
右栏内容
:::
::::::::::::::

Pandoc还有 {.column width="40%"} 这种设定宽度的语法,但对转 PPT 无效。PPT 的栏目宽度仅取决于模板母版的版式。如果有不同的双栏宽度需求也可以多设定几个双栏版式,在后期手工调整相关页面的版式。

另外实在有需求(时间)还可以手动实现单文本框伪多栏( 开始-段落-添加或删除栏分栏,设定栏间距,再通过换行来控制分栏内容顶端对齐)。如果单文本框放不下内容,还可以考虑将一个单栏页面拆成数个单栏页面(用多页代替多栏),操作上可以直接复制页面,然后删除每页的其他内容段落直接在 Markdown 上多复制一遍页面标题。如果只是一个段落放不下……请重新撰写文案……

那么,如何能简单粗暴的制作一份 简约/单/陋 的 PPT 呢?个人参考/山寨 了经典的罗兰贝格早期风格,设计/摆放 了一种由页面标题(左上)、水平线(区分标题和内容)、页面内容、LOGO(右下,平衡页面)的极简/极少排版工作量 排版,样式如下:


PPT 神器 Pandoc

—————————————————————————————————————————————

背景 嗯,标题没写没错,当然副标题应该是“使用 Pandoc 将 Markdown 转换为 PPTX ”,之所以说 PPTX

……

@Cloudlet


嗯,大概就是这个样子,还有非常精致的节标题页,长这个样子:


节标题页

—————————————————————————————————————————————

@Cloudlet


这里还要特别强调,作为(曾经)熟读 《写给大家看的PPT设计书》(似乎)精通设计四原则的我设计出来的版式都是做到了左右对齐的,只是限于条件限制无法在页面上精确展示,另外基于视觉平衡单栏页面的文本框宽度可以设定为页面宽度的61.8%(没错,黄金分割的忠实践行)……

总之,通过上述种种设置/偷懒,基本能够做到 「Markdown 写好,PPT 完成」。当然,需要图片的地方还要加图片,不过依然可以不考虑布局或者说直接使用固定布局(提示,此处是重复原则的重复应用)。

脚本

最后,例行附上脚本。

Pandoc 转换脚本

MD2PPT.bat (也可以直接在 CMD 中直接运行代码)

1
pandoc --reference-doc=c:\cloudlet.info\reference.pptx  input.md -o output.pptx

AHK 调试脚本

SetTitleMatchMode Regex

    ; 在 Typora 修改后
    #IfWinActive, Typora
     {
        $f1::

        ; 保存修改
        send ^s

         ; 关闭当前 PPT
        WinActivate, PowerPoint
        send ^w

        ; 执行转换脚本
        run, c:\cloudlet.info\MD2PPT.bat,  c:\cloudlet.info

        ; 打开新生成的 PPT
        run c:\cloudlet.info\output.pptx

        return
    }