写在前面

本篇包含大量碎碎念,想直接看操作步骤的朋友可以跳至 #基本用法。

代码越少,越依赖其他工具。越依赖其他工具,兼容性越差。兼容性越差,越需要更多兼容代码。所以代码越少,代码越多。(来源

敲这篇文章第一个字的时候是 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,过程中遇到的大部分问题也是在他的帮助下解决的,这些他为我分享的智慧,依然属于他。

pandoc-to-beamer

这里有几件事需要指明。

我知道的是:中文、英文写作是两种体验。

你或许不知道的是:Beamer 更适合简单的演示场景,特别是学术类 Slides,它不太适合需要复杂动画效果的演示。另外感谢来自评论区的补充:使用这套流程不降低 LaTeX 的学习成本;相反,一旦出错,可能会比纯 LaTeX 更难调试。它要求用户有基础的 LaTeX 知识,减少的是日常使用时候的冗杂语法负担。虽然本文已经解决了大部分对我来说常见的使用场景,但仍可能存在其他未提及的错误情况。

一件不为人知的事:make 成功之前我曾解决若干字体缺失与 undefined control sequence 相关报错。查找聊天记录时发现,可以通过修改 fontset(详见 texdoc ctex)或者下载缺失的字体文件解决。我是通过下载这里的文件解决了字体缺失相关的报错。

一件恐怖的事:我不记得还有一个 undefined control sequence 是怎么解决的了。只记得 pip install Pygments 是需要的。

我是不是忘了什么,在 clone 到本地与爆破成功的间隙里,我是不是还下载了一些文件,但是我忘记了?

编译阶段

我无暇琢磨这些。下一步是编译自己的 markdown 文档为 slides。在你的文档 example.md 文件里填好 yaml 头:

example.md
1
2
3
4
5
6
7
---
title: Test Slides
subtitle: Using Pandoc to Write Beamer
date: 2024 8 27
author: Summer
institute: 白读
---

如果你想配置多个作者与机构,可以这样写:

example.md
1
2
3
4
---
author: Summer\inst{1} Winter\inst{2}
institute: \inst{1}白读 \inst{2}影视飓风云学生
---

你将得到:

Slides Cover
Slides Cover

接下来你就可以用 Markdown 语法来写 slides 的内容了。有一件事情需要说明,在这里,Markdown 的二级标题会被翻译为每一张幻灯片上的标题,章节标题需要用 markdown 的一级标题来表示。也可以使用 pandoc 的 --shift-heading-level-by 选项修改。

在书写大量内容之前你可通过以下命令尝试编译:

1
2
make             %% 生成文件夹下所有 md 文件的 PDF %%
make 文件名.pdf %% 生成某个文件的 PDF %%

如果报错

如果成功,你可以直接跳过这一部分。

我开始查找存在的聊天记录。我找到了遇到的第一个问题:编译带有删除线文本的 Markdown 文档时会报错。

那么对于删除线的解决方法便是:在 metadata.yaml 文件中加入:

metadata.yaml
1
2
3
4
header-includes:
- \usepackage{xeCJKfntef}
- \providecommand{\st}[1]{\CJKsout{#1}}
- \renewcommand{\st}[1]{\CJKsout{#1}}

第二个问题是在使用 minted 环境时,编译带有代码块的 Markdown 文档时会报错。这个问题的根源在于多个连字符 ------ 会被翻译为没有 fragile 选项的 frame。那么对于 minted 环境代码块的解决方式便是:为包含代码块的 frame 添加标题。如:

example.md
1
2
3
4
5
6
7
8
9
10
------

上面用 `------` 创建了一张幻灯片。这张幻灯片是没有标题的。

## 代码示例

```python
for i in range(10):
print("hello world")
```

这样可以确保生成的 LaTeX 代码中包含 \begin{frame}[fragile]

如果你在编译过程中遇到了报错,可以尝试在终端运行 make foo.tex (将 foo 替换为你的 Markdown 文件名)查看生成的 .tex 文件进一步排查问题所在。

修改主题色

故事的结局正如当初预言的那样,你将获得一个 thubeamer 主题的 slides。大家在幼儿园都学过了,THU 的主题色是紫色。不是清华的咋办?

我的方法是修改 metadata.yaml 文件。在 header-includes 中加入:

metadata.yaml
1
2
3
4
5
6
7
8
9
10
11
header-includes:
- |
```{=latex}
\definecolor{beamer@headercolor}{RGB}{180,47,38} % 浅红主题色
\definecolor{beamer@sidebarcolor}{RGB}{91,23,18} % 深红主题色
\setbeamercolor{structure}{fg=beamer@headercolor}
\setbeamercolor{title}{fg=white,bg=beamer@headercolor}
\setbeamercolor{frametitle}{fg=white,bg=beamer@headercolor}
\setbeamercolor{block title}{fg=white,bg=beamer@headercolor}
\setbeamercolor{block body}{bg=beamer@headercolor!10}
```

这里可以按需修改前两行的 {RGB}{180,47,38} 颜色。

快问快答

Q:单张内容太长了一页放不下怎么办?

A:可在标题后加上 {.allowframebreaks},如 ## 这是一个二级标题 {.allowframebreaks}。你也可以在写完 Markdown 之后使用正则表达式将 ^(#{1,6} .*) 替换为 $1 {.allowframebreaks}

Q:副标题怎么加?

A:参考以下示例:

1
2
3
## \LaTeX “命令”

\framesubtitle{\emph{宏}(Macro)、或者\emph{控制序列}(Control Sequence)}

以及,在这个 Markdown 里面有需要的话,你可以直接写任何 LaTeX。

Q:如何引用对象?

A:以图片引用为例,你可以给对象添加标签:\label{name},然后通过 \ref{name} 来引用它。

简单一点可以这样:

1
2
3
![This is the caption\label{mylabel}](/url/of/image.png)

See figure \ref{mylabel}.

请注意图片必须单独成段,即上下必须要有空行。

如果要限制图片大小可以这样:

1
2
3
4
5
6
7
8
如图 \ref{fig:1} 所示,Bakry (2024) 提出了一个层级决策模型(HDM)用于评估政策:

\begin{figure}[h!]
\centering
\includegraphics[width=0.75\textwidth, keepaspectratio]{/example-fig.png}
\caption{Bakry (2024) 的政策评估框架}
\label{fig:1}
\end{figure}

你将得到:

图片引用示例
图片引用示例

Q:默认图表标题为 图 1、表 1 等,我想用英文怎么做呢?
A:切换语言为英文:

1
- \usepackage[english]{babel}

或者,在 metadata.yaml 里加入:

1
- \renewcommand{\tablename}{Table}

Q:左右分栏排版?
A:使用 minipage 环境。如:

1
2
3
4
5
6
7
\begin{minipage}{0.6\textwidth}
\includegraphics[width=\textwidth, keepaspectratio]{/url/of/image.png}
\label{label1}
\end{minipage}
\begin{minipage}{0.35\textwidth}
Figure \ref{label1} plots the steady state consumption function.
\end{minipage}

或者使用 columns 环境:

1
2
3
4
5
6
7
\begin{columns}
\column{0.5\textwidth}
% Left column content goes here

\column{0.5\textwidth}
% Right column content goes here
\end{columns}

Q:一些常用 cheatsheet?
A:

1
2
3
4
5
6
7
8
9
10
11
\pause  % Pause the presentation until the next slide

\vspace{-1em} % Less vertical space
\smallskip % Add a small vertical space

\footnotesize % Change text size to footnotesize

\includegraphics[width=\textwidth]{fig1.png} % Include an image with width equal to text width

\definecolor{box}{RGB}{251,233,233} % Define a custom color
\colorbox{box}{Your text} % Apply the custom color to a text box

Q:最后的花体感谢页面怎么做呢?
A:在 metadata.yaml 里加入:

1
- \usepackage{calligra}

然后在 example.md 中写入:

1
2
3
4
5
6
## 

\begin{center}
{\Huge \calligra Thanks for your attention!}
\vspace{1cm}
\end{center}

你将得到:

Thanks Page
Thanks Page

我还想要 Markdown to article!

当然了,这个也可以拿来编译 article 类文档。如果你用不上 minted 代码高亮,可以在终端运行

1
2
pandoc --defaults=pandoc-homework.yaml \
example.md -o example.pdf

如果想把 minted.lua 加上去,我暂时还不知道怎么用 makefile 直接编译,需要将命令拆成两步。第一步,在终端里运行:

1
2
pandoc --defaults=pandoc-homework.yaml --lua-filter=minted.lua \
example.md -o example.tex

得到生成的 .tex 文件后,再运行 xelatex -shell-escape -output-directory=tmp example.tex 可得到 PDF 文件。

其余似乎没有什么可以再说的了。10 月 16 日值得纪念,这一天:我买的新小说到了。买了今年秋天第一件新衣服。买了毛咕噜的书打算狠狠蹭一波诺奖的热点。完成了我本月大概是最后一个作业。答应了本月第一个出门邀约。等洗完澡我准备开始看一下刚到的小说,反正论文也写不完。并且,我居然写了一篇博文。


working

©   开心地使用 Stellar 主题 ✧ 星际地球 读取运行时……

收集了 11 颗星星 ✧ 共 7.8w 颗星尘,

Umami Analytics Enabled | 站点更新日志