其他幻灯片

今天在 TeX Live 2024 里写 \documentclass{slides},依然能编译通过。版本是 v2.4b,日期为 2022 年 5 月 18 日——它作为 LaTeX 内核的一部分至今仍在维护,是一个比 beamer 老得多的幻灯片 class。它的来历是 SliTeX,而 SliTeX 根本不是一个 class,而是一个独立的格式。LaTeX 项目自己随发行版附带的旧版用户指南,用一行字记下了 slides 就是从前的 SliTeX。自从 SliTeX 被并入 LaTeX 2e(1994 年 6 月 1 日发布)以来,幻灯片就成了 LaTeX 的一项功能,而不再是另一个程序。本页讲的是 beamer 之外的一切:比它更早的 class、曾想取代它的 powerdot、至今仍留在 TeX Live 里、日期停在上个世纪的那几个演示类、幻灯片写成 Markdown 时该怎么办,以及老实说——什么时候不该用 LaTeX 做幻灯片

\documentclass{slides}:SliTeX 的遗存到底做了什么

它做的第一件事是把正文变大。slides.def\normalsize 定义为 \@setfontsize\normalsize\itwentypt{28pt}——正文 20 pt,行距 28 pt。第二件事是词汇:幻灯片写在 \begin{slide} … \end{slide} 里,与之并列的还有 overlay 环境和 note 环境。排一份三者各一的文档,会得到三页,页脚分别印着 11-a1-1——幻灯片编号,overlay 以字母作分支,备注则以连字符接在幻灯片号后。单看「1-a」这一记法,就知道它当初是为叠放实体投影胶片而设计的。\onlyslides{...}\onlynotes{...} 接受一串编号,只输出其中一类(见 slides.def 第 92 行与第 97 行)。

最有意思的是它对颜色的处理。slides.cls 声明了 \DeclareMathVersion{invisible}——一个字面意义上「不可见」的数学版本。配合 \colorslides{...}\blackandwhite{...}slides.def 第 103 行与第 116 行),就能把同一张幻灯片按颜色分次印刷:把该印成红色的文字设为可见、其余设为不可见,然后换成只有蓝色可见。把印好的胶片叠起来,就得到一张套准精确的多色幻灯片。在 1980 年代,做一张彩色幻灯片就是这么回事。另有一处会绊住新文档:纸张。slides.cls 第 102 行声明 \ExecuteOptions{letterpaper,final},可实际用 pdflatex 编译出来的 PDF 是 A4(595.276 × 841.89 pt)。因为 TeX Live 的 pdftexconfig.tex 已经先设了 \pdfpagewidth = 210 true mm,而标准 class 从不覆盖它。若纸张尺寸要紧,就加载 geometry,或显式传入 a4paperletterpaper,然后用 pdfinfo 核对。

latex
\documentclass[a4paper]{slides}
\begin{document}
\begin{slide}
  Body text is 20pt here, on a 28pt baseline.
\end{slide}
\begin{overlay}
  Printed as slide 1-a, meant to sit on top of slide 1.
\end{overlay}
\begin{note}
  Printed as 1-1, for the speaker.
\end{note}
\end{document}

powerdot 今天还能用吗:pdflatex 是通不过的

它在。TeX Live 2024 里的 powerdot.clsv1.7,日期 2021/05/19,LPPL 维护状态为 "maintained",现任维护者就是作者 Hendri Adriaens。这不是一个已死的宏包。但若今天才开始用它,第一个小时会花在构建链上而不是演讲内容上:把一份 \documentclass[style=klope]{powerdot} 的文档交给 pdflatex,它会停在 ! Package hyperref Error: Wrong DVI mode driver option 'dvips',,后面跟着一长串 ! Undefined control sequence.。原因不是猜的,而是写在 class 里的:powerdot.cls 第 180 行在非 XeTeX 时调用 \RequirePackage[setpagesize=false,dvips,...]{hyperref}dvips 驱动硬编码进了 hyperref。powerdot 属 PSTricks 一系,也无条件加载 \RequirePackage{pstricks}

走得通的路有两条。一条是这个 class 所设想的 PostScript 链 latexdvipsps2pdf,另一条是它自身分支里准备好的 xelatex。两条在本机都通过了,含 \pause 的那一张也正确展开成了 overlay(PostScript 侧的 BoundingBox 为 792 × 594 pt,即 11 × 8.25 英寸横向,正是 powerdot 默认 paper=screen 的 4:3)。但生成的 PDF 的页面框并不会自动对上——在本机上它变成了 594 × 594 pt 的正方形——所以在拿去打印或投影之前,务必用 pdfinfo 核对,必要时向 dvipsps2pdf 显式指定纸张。它随包附了 17 个 powerdot-*.sty 样式(aggiecimentfymahuskyikedajefkaklopepaintingspaziksailorsimpletycjaupen 等)。历史上 powerdot 是 prosper/HA-prosper 的后继者,beamer 手册的致谢里也把 HA-prosper 的作者 Hendri Adriaens 列了进去。一个时代痕迹:随包的 README 至今仍把安装指引指向一个 tex.ac.uk/cgi-bin/ 的网址。

terminal
# pdflatex stops here:
#   ! Package hyperref Error: Wrong DVI mode driver option `dvips',

# the route the class was designed for
latex talk.tex && latex talk.tex
dvips -o talk.ps talk.dvi
ps2pdf talk.ps talk.pdf

# or the branch the class provides itself
xelatex talk.tex && xelatex talk.tex

# always confirm the page box before you print
pdfinfo talk.pdf | grep "Page size"

源码的手感与 beamer 相当不同。幻灯片写在 \begin{slide}{标题} … \end{slide} 里,分步同样用 \pause。但备注不是 \note{...},而是一个 note 环境,而且要放在 slide 之外——把 \note{...} 写进 slide 里,会停在 ! LaTeX Error: \begin{minipage} on input line 5 ended by \end{slide}.。输出切换靠两个 class 选项:modepresentprinthandoutdisplayslidesnotesslidesnotes。实测中 mode=handout,display=slidesnotes\pause 折叠掉了,并在备注页页脚印出 note 1 of slide 2(不过 handout 模式下不能用 landscape,class 自己会给出警告)。还有一件只有 powerdot 才有的把戏:clock=true 会把 Acrobat 的 JavaScript 嵌进 PDF,在幻灯片上显示一个走动的时钟clockformat=HH:MM:ssclockrefresh=1000)。它走不走取决于阅读器的 JavaScript 支持,所以正式使用前一定要在现场试一遍。

latex
\documentclass[style=klope,mode=handout,display=slidesnotes]{powerdot}
\title{A talk}\author{Me}
\begin{document}
\maketitle
\begin{slide}{First}
  \begin{itemize}
    \item One\pause
    \item Two
  \end{itemize}
\end{slide}
% the note environment goes OUTSIDE the slide
\begin{note}{Reminder}
  Say hello here.
\end{note}
\end{document}

TeX Live 里至今仍在的演示类:日期说明了什么

kpsewhich 一问,它们全都在:seminar.clstalk.clstexpower.stypdfscreen.stypdfslide.styprosper.cls。CTAN 不删旧东西,TeX Live 也就一直分发它们;把日期排成一列,演示类的历史就摆在眼前。其中有一个特别:seminar,1993 年由 Timothy Van Zandt 写成 LaTeX 2.09 的 document style,再由 Sebastian Rahtz 移植为 LaTeX 2e 的 class,至今仍以 v1.63a(2021/07/01)在维护。而 beamer 手册的历史一节记载,beamer 最初就是一小堆让 seminar 类更好用的私人宏。换句话说,这份名单里最老的那个,正是最新那个的母体。

文件TeX Live 2024 中的版本与日期身份
beamer.clsv3.71 (2024/01/06)事实标准;Till Tantau 于 2003 年写成,2010 年起由 Joseph Wright 等人维护
slides.clsv2.4b (2022/05/18)LaTeX 内核的一部分;从前的 SliTeX
seminar.clsv1.63a (2021/07/01)Timothy Van Zandt 于 1993 年创建;beamer 由此生长而来
powerdot.clsv1.7 (2021/05/19)PSTricks 一系;prosper/HA-prosper 的后继
talk.clsv1.1 (2006/07/11)围绕「同一内容输出多个版本」而设计的 class
texpower.styv0.2 (2005/04/08)为演示添加动态效果的宏包,不是 class
prosper.clsv1.5 (2001/07/17)Frédéric Goualard 与 Peter Møller Neergaard 所作;后由 powerdot 接手
pdfscreen.styv1.5 (2000/07/07)用于设计供屏幕阅读的 PDF;C. V. Radhakrishnan 所作
pdfslide.styv0.50 (1999/10/10)本表中最早的日期;PDF 幻灯片的早期尝试

在日文场景里还有一个近在手边的选项。如果你已经在用 jsarticle 写作,只要写 \documentclass[slide,papersize,landscape]{jsarticle} 就能得到大字号的幻灯片版式。jsarticle.cls 第 80 行声明 \DeclareOption{slide}{\@slidetrue\def\jsc@magscale{3.583}},而这个 3.583 的倍率与同一 class 的 36pt 选项完全相同——也就是说 slide 实质上等于 36 pt。想再大,这个 class 一直提供到 43pt(倍率 4.300)。在本机用 upLaTeX 加 dvipdfmx 编译,输出的是 A4 横向(841.89 × 595.28 pt)的 PDF。它没有主题也没有 overlay,但可以直接沿用你已经在写的日文文档格式,用十分钟做出明天公司内部读书会要用的幻灯片绰绰有余。

用 Markdown 写的幻灯片:Marp、reveal.js、pandoc 与 markdown 宏包

路分成两条:要么在外面处理 Markdown,再把结果交给 LaTeX,要么让 LaTeX 自己读 Markdown。前一支的代表是 Marp 和 reveal.js 一系,它们是用 npm 安装的 Node/浏览器程序,并不属于 TeX Live——本机上 marppandoc 都找不到。常用的桥梁是 pandoc,其官方手册把 beamer 列在输出格式之中,并把 beamer、revealjs、s5、slidy、dzslides、pptx 列为幻灯片格式;同一份手册也写明,要生成 PDF 需要另行安装 LaTeX 引擎。也就是说,即便走 pandoc 这条路,最后还是离不开 TeX Live

另一条路完全留在 TeX Live 之内。markdown 宏包(v3.4.2,2024-03-09)在 TeX 内部带了一个 Markdown 解析器,可以直接排出 markdown 环境里的内容。实测加载 \usepackage[hybrid]{markdown},在标了 [fragile] 的 beamer frame 里写入列表、*强调*inline code,全部都正确排版了。但有一个条件——在 pdfLaTeX 下 -shell-escape 是必须的。忘了加就会停在 ! Package markdown Error: Shell escape is restricted,随后是 Fatal error occurred, no output PDF file produced!。落到实务上,它正好适合这种情形:团队的稿子用 Markdown 写,而公式和插图要 LaTeX 的品质。反过来,如果你想连幻灯片的外观本身也用 Markdown 决定,那是 Marp 的活,不是 LaTeX 的。

latex
\documentclass[aspectratio=169]{beamer}
\usepackage[hybrid]{markdown}
\begin{document}
\begin{frame}[fragile]{From Markdown}
\begin{markdown}
- first bullet
- second bullet with *emphasis*

Ordinary paragraph with `inline code`.
\end{markdown}
\end{frame}
\end{document}

% compile with: pdflatex -shell-escape file.tex
% without it:  ! Package markdown Error: Shell escape is restricted

什么时候不该用 LaTeX 做幻灯片

说实话,有三种场合 LaTeX 并不合适。其一是外观要反复调几十遍的演讲。LaTeX 幻灯片是「改完再等」的媒介:一份 40 帧、121 页的稿子在本机实测每次 3.5 秒,而且因为 .nav.toc 还得跑两遍。这样的往返不适合一毫米一毫米地挪位置。其二是协同编辑。如果合作者不写 TeX,把 .tex 发过去,等于说「请先装好我的工具链再回复我」。其三是主办方要 .pptx 的时候;把希望寄托在 PDF 转 PowerPoint 上,不如一开始就换工具。而 LaTeX 完胜的场合是:公式、代码和图与论文出自同一条流水线;希望从同一份稿子机械地生成演讲版与分发版;以及想要在任何机器上打开都不会挪动一毫米的 PDF——beamer 手册本身就把「不必担心会场电脑里装了什么」列为优点之一。

  • 做新的演讲beamer。本表中唯一仍在活跃开发的一个,主题、overlay、handout、备注一应俱全。
  • 接手一份旧 .tex → 先看 \documentclass。是 slides 就说明源自 SliTeX;是 prosper 就可考虑迁到 powerdot。
  • 主体是 PSTricks 图形powerdot,但要用 latexdvipsps2pdfxelatex 构建,pdflatex 是过不去的。
  • 明天就要的日文幻灯片 → jsarticle 的 slide 选项(实质 36pt,最大可到 43pt)。
  • 稿子是 Markdown → 外部用 pandoc,或用 TeX Live 内的 markdown 宏包(pdfLaTeX 下 -shell-escape 必须)。
  • 主办方要求 .pptx → 别硬用 LaTeX。与其赌一次格式转换,不如一开始就换工具。