写在前面
本篇包含大量碎碎念,想直接看操作步骤的朋友可以跳至 #基本用法。
代码越少,越依赖其他工具。越依赖其他工具,兼容性越差。兼容性越差,越需要更多兼容代码。所以代码越少,代码越多。(来源)
敲这篇文章第一个字的时候是 2024 年 10 月 12 日 23 点 57 分,一周即将结束。这周没有翻书,没有对此感到内疚,也没有特别想要改变,与案前放着的几本书的就保持着这样一种关系,像夫妻:表面热情,实则冷漠,装不下去了就干脆撂挑子。读书变成伪流行文化,重映的哈利波特也是,我打起十二分热情想要靠近,但最终还是因为懒得打扮而没出门。
一周七天以一种疯狂的速度飞快的离开我,因此我开始写。这原因与我上一篇所谈到的没有区别:只有写下来的事情才是真实发生过的。正如那句名言所说:生活不是我们活过的日子,而是我们记住的日子。可是每次提笔就是纷乱的情绪,我真的很佩服那些能把文章结构和思路梳理得井井有条的博主,我完全做不到这一点。即使是写一些技术性的教程文章,我也无法做到条理分明……看来这种文字表达能力也是需要经常练习的。我和我写的东西一样,都是一团混沌。
为了避免再次陷入情绪的量子纠缠,这次我想讲一件真实存在的事情。一个事实。没有情绪的、经得住多方检验的事实:
由 Harry 赞助播出的,将 Markdown 转换为 Beamer 的终极解决方案。(是的,可以丢掉 PowerPoint 了)
一个多月过去,我终于找到机会写这篇博文,想要写一些自己不太理解的东西,总要一些时间准备。但在这件事上我尽量不给自己太大压力,我不能把一件用来释压的事情也变成一种负担。我毕竟太擅长这个了。对我这个代码基础为零的人来讲,每修改一处都是大成就。为了方便健忘人士复习,我会写下脑海里那些笨拙的修改。
我知道 LaTeX 是难用的。我一直知道。从我第一次看到用他做出来的文档时我就知道他是难用的,数学公式排版是我最喜欢的部分,每次敲一遍公式时我都会感叹一遍它的伟大,渲染出来的结果美观又专业,我用 LaTeX 写了非常多的作业和没那么多的论文——但是 LaTeX 是难用的。
他是复杂的。老实说,我根本不理解 LaTeX 的用法,也时常需要花更多的时间呈现我想要的效果,不知道为什么,每次使用这个工具,我都担心最后的效果会不如用讨厌的 Microsoft Word 来得好。这是我的一种过度担心,但他从未向我保证这样的事不会发生。
我当然不是说 LaTeX 不好。建站以来,我也有一搭没一搭地学各类语言,但与其说是学,不如说是在毫无基础的情况下强行尝鲜,这样下来效果到底如何,我很难客观评价好坏,但我确实时常感到崩溃——这是意料之中的结果,我明白欲速则不达,但我总想走更近的路。我真的在考虑要不要下次还是拿 Word 写好了。但我害怕自己捡起来的一块拼图在我走后就没有再添上的,而我成为这块拼图上板上钉钉的破坏者,而且是在它本就破碎的基础上雪上加霜的破坏者。
我开玩笑的。不过说真的——难道你不会想要这样一种工具,既能像 Markdown 那样高效编写,又有着 LaTeX 那样强大的样式控制吗?这就是我的另一个疑惑:为什么没有一个高效编写的 LaTeX 呢?
但 Harry 毕竟是你 Harry,这个不可能三角终于是被实现了。那么接下来,本篇将介绍如何用 Markdown 高效编写优美排版的理想文档。
2024 年 10 月 15 日:因为胡乱推送丢失了一些内容,哎呀,气死我了!
基本用法
对那些跳转过来的朋友:这是一篇讲如何用 Markdown 写 Beamer 的文章。首先你需要配置好 LaTeX 与 Pandoc,对我来说就是去官网点击 download 然后跟着指引一步步安装罢了。
接下来的活动就有些令人激动了,你只需要将下面链接里面的几个文件克隆到本地,直接 make 就好。不知道这么说对不对,总之就是在目录下打开终端,然后敲 make
回车。不出意外的话,你应该可以看到 1-test.pdf
文件的生成结果。嗯。没错。这就完成了。
我要先说清楚:即使这篇文章是我所写,但这些代码全部来自 Harry,过程中遇到的大部分问题也是在他的帮助下解决的,这些他为我分享的智慧,依然属于他。
这里有几件事需要指明。
我知道的是:中文、英文写作是两种体验。
你或许不知道的是:Beamer 更适合简单的演示场景,特别是学术类 Slides,它不太适合需要复杂动画效果的演示。另外感谢来自评论区的补充:使用这套流程不降低 LaTeX 的学习成本;相反,一旦出错,可能会比纯 LaTeX 更难调试。它要求用户有基础的 LaTeX 知识,减少的是日常使用时候的冗杂语法负担。虽然本文已经解决了大部分对我来说常见的使用场景,但仍可能存在其他未提及的错误情况。
一件不为人知的事:make 成功之前我曾解决若干字体缺失与 undefined control sequence 相关报错。查找聊天记录时发现,可以通过修改 fontset(详见 texdoc ctex)或者下载缺失的字体文件解决。我是通过下载这里的文件解决了字体缺失相关的报错。
一件恐怖的事:我不记得还有一个 undefined control sequence 是怎么解决的了。只记得 pip install Pygments
是需要的。
我是不是忘了什么,在 clone 到本地与爆破成功的间隙里,我是不是还下载了一些文件,但是我忘记了?
编译阶段
我无暇琢磨这些。下一步是编译自己的 markdown 文档为 slides。在你的文档 example.md
文件里填好 yaml 头:
1 |
|
如果你想配置多个作者与机构,可以这样写:
1 |
|
你将得到:
接下来你就可以用 Markdown 语法来写 slides 的内容了。有一件事情需要说明,在这里,Markdown 的二级标题会被翻译为每一张幻灯片上的标题,章节标题需要用 markdown 的一级标题来表示。也可以使用 pandoc 的 --shift-heading-level-by
选项修改。
在书写大量内容之前你可通过以下命令尝试编译:
1 | make %% 生成文件夹下所有 md 文件的 PDF %% |
如果报错
如果成功,你可以直接跳过这一部分。
我开始查找存在的聊天记录。我找到了遇到的第一个问题:编译带有删除线文本的 Markdown 文档时会报错。
那么对于删除线的解决方法便是:在 metadata.yaml
文件中加入:
1 | header-includes: |
第二个问题是在使用 minted 环境时,编译带有代码块的 Markdown 文档时会报错。这个问题的根源在于多个连字符 ------
会被翻译为没有 fragile 选项的 frame。那么对于 minted 环境代码块的解决方式便是:为包含代码块的 frame 添加标题。如:
1 | ------ |
这样可以确保生成的 LaTeX 代码中包含 \begin{frame}[fragile]
。
如果你在编译过程中遇到了报错,可以尝试在终端运行 make foo.tex
(将 foo
替换为你的 Markdown 文件名)查看生成的 .tex
文件进一步排查问题所在。
修改主题色
故事的结局正如当初预言的那样,你将获得一个 thubeamer 主题的 slides。大家在幼儿园都学过了,THU 的主题色是紫色。不是清华的咋办?
我的方法是修改 metadata.yaml
文件。在 header-includes
中加入:
1 | header-includes: |
这里可以按需修改前两行的 {RGB}{180,47,38}
颜色。
快问快答
Q:单张内容太长了一页放不下怎么办?
A:可在标题后加上 {.allowframebreaks}
,如 ## 这是一个二级标题 {.allowframebreaks}
。你也可以在写完 Markdown 之后使用正则表达式将 ^(#{1,6} .*)
替换为 $1 {.allowframebreaks}
。
Q:副标题怎么加?
A:参考以下示例:
1 | ## \LaTeX “命令” |
以及,在这个 Markdown 里面有需要的话,你可以直接写任何 LaTeX。
Q:如何引用对象?
A:以图片引用为例,你可以给对象添加标签:\label{name}
,然后通过 \ref{name}
来引用它。
简单一点可以这样:
1 | ![This is the caption\label{mylabel}](/url/of/image.png) |
请注意图片必须单独成段,即上下必须要有空行。
如果要限制图片大小可以这样:
1 | 如图 \ref{fig:1} 所示,Bakry (2024) 提出了一个层级决策模型(HDM)用于评估政策: |
你将得到:
Q:默认图表标题为 图 1、表 1 等,我想用英文怎么做呢?
A:切换语言为英文:
1 | - \usepackage[english]{babel} |
或者,在 metadata.yaml
里加入:
1 | - \renewcommand{\tablename}{Table} |
Q:左右分栏排版?
A:使用 minipage
环境。如:
1 | \begin{minipage}{0.6\textwidth} |
或者使用 columns
环境:
1 | \begin{columns} |
Q:一些常用 cheatsheet?
A:
1 | \pause % Pause the presentation until the next slide |
Q:最后的花体感谢页面怎么做呢?
A:在 metadata.yaml
里加入:
1 | - \usepackage{calligra} |
然后在 example.md
中写入:
1 | ## |
你将得到:
我还想要 Markdown to article!
当然了,这个也可以拿来编译 article 类文档。如果你用不上 minted 代码高亮,可以在终端运行
1 | pandoc --defaults=pandoc-homework.yaml \ |
如果想把 minted.lua 加上去,我暂时还不知道怎么用 makefile 直接编译,需要将命令拆成两步。第一步,在终端里运行:
1 | pandoc --defaults=pandoc-homework.yaml --lua-filter=minted.lua \ |
得到生成的 .tex
文件后,再运行 xelatex -shell-escape -output-directory=tmp example.tex
可得到 PDF 文件。
其余似乎没有什么可以再说的了。10 月 16 日值得纪念,这一天:我买的新小说到了。买了今年秋天第一件新衣服。买了毛咕噜的书打算狠狠蹭一波诺奖的热点。完成了我本月大概是最后一个作业。答应了本月第一个出门邀约。等洗完澡我准备开始看一下刚到的小说,反正论文也写不完。并且,我居然写了一篇博文。