海报 (beamerposter/tikzposter/a0poster)

用 LaTeX 做 A0 海报时最常见的事故,是拿到印厂才发现文件其实是 A4。在 TeX Live 2024 上这真的会发生:把 a0poster 类丢给 pdflatexpdfinfo 报出的纸张是 595.276 × 841.89 pt,也就是 A4。同样冲着 A0 去,用 beamerpostertikzposter 编译,两者都正确地给出 2383.94 × 3370.39 pt(A0)。本页比较做会议海报的三条路——沿用 beamer 的 beamerposter、基于 TikZ 的专用类 tikzposter,以及始于 1997 年的 a0poster——逐一编译并用 pdfinfo 量出实际尺寸,最后归纳交付印厂前该确认什么。

海报的纸张尺寸 —— 用 pdfinfo 确认

首先,务必亲眼确认成品 PDF 的尺寸。运行 pdfinfo poster.pdfPage size: 那一行会报出大小。A0 是 2383.94 × 3370.39 pt,换算过来是 84.1 × 118.9 cm。如果那一行仍写着 A4(595.276 × 841.89 pt),问题不在你的类选项,而在于纸张尺寸根本没有传到 PDF 里。这一点靠肉眼看不出来:海报在屏幕上总是缩小显示,被压成 A4 的那份看上去只是「显示得小」而已。

类或宏包pdflatex 下的纸张(实测)尺寸如何确定
beamerposter2383.94 × 3370.39 pt(A0 纵向)size=a0orientation 直接写入 PDF
tikzposter2383.94 × 3370.39 pt(A0 纵向)a0paper 交给 geometry,因而能正确抵达 PDF
a0poster595.276 × 841.89 pt(A4)经由 PostScript 的 \special,pdflatex 会忽略
baposter无法加载TeX Live 2024 中并未收录(见下文)

beamerposter 怎么用 —— 其实只有 sizescale

如果你已经熟悉 beamer,beamerposter 是最短的路。在 \documentclass[final]{beamer} 之上叠一句 \usepackage[size=a0,scale=1.4,orientation=portrait]{beamerposter},你的 blockcolumns、主题和配色主题就都以海报尺寸照常工作。没有新语法要学。[final] 选项把叠层折叠成单页,当你回收一份仍含 \pause\only<2> 的幻灯稿时尤其有用。

poster.tex
\documentclass[final]{beamer}
% size: a0b a0 a1 a2 a3 a4 custom  /  orientation: portrait landscape
\usepackage[size=a0,scale=1.4,orientation=portrait]{beamerposter}
\title{A Poster Title}
\author{A. Author}
\institute{Somewhere}
\begin{document}
\begin{frame}[t]{}
\maketitle
\begin{columns}[t]
  \begin{column}{0.45\textwidth}
    \begin{block}{Introduction}
      Body text at poster scale.
    \end{block}
  \end{column}
  \begin{column}{0.45\textwidth}
    \begin{block}{Results}
      More body text.
    \end{block}
  \end{column}
\end{columns}
\end{frame}
\end{document}

scale 是字号放大率,这正是 beamerposter 的巧妙之处:每种纸张尺寸都预先归一化了一个基准倍率。读 beamerposter.sty 可知,a0 与 a0b 是 1.0,a1 是 0.70710678,a2 是 0.5,a3 是 0.35355339,a4 是 0.25。这串数正是 1/√2 的幂,对应 A 系列每降一级面积减半——即边长缩为 1/√2。于是 scale=1.0 在任何纸张上看起来都一样大:把 A1 的海报改做成 A0,文字的观感尺寸不变。实测中,a0 且 scale=1.0\normalsize24.88 pt(行距 30 pt),scale=1.4 时为 34.83 pt(行距 42 pt)。

纸张从 size=a0b a0 a1 a2 a3 a4 custom 中选,另配 orientation=portraitlandscape。实测中 orientation=landscape 把尺寸换成 3370.39 × 2383.94 pt,size=a1 给出 1683.78 × 2383.94 pt(A1),完全符合预期。选 size=custom 时,widthheight 要传以厘米为单位的纯数字width=200,height=300 得到 5669.29 × 8503.94 pt,即一张 2 米 × 3 米的横幅。TeX Live 2024 同捆的 beamerposter 是 v1.13(2018 年 4 月 23 日)。

tikzposter —— 由主题决定外观的专用类

tikzposter 从一开始就是为海报而写的类。声明 \documentclass[25pt,a0paper,portrait,margin=10mm]{tikzposter},正文写成 \block{标题}{内容},再用 \begin{columns}\column{0.5} 分栏。beamer 的那套词汇在这里不适用。外观靠一句 \usetheme{...} 就能整体改变,TeX Live 2024 版收有 九种:Autumn、Basic、Board、Default、Desert、Envelope、Rays、Simple、Wave。这九种全部实际编译过,无一报错,都输出了 A0 的 PDF。

poster.tex
\documentclass[25pt,a0paper,portrait,margin=10mm]{tikzposter}
\usetheme{Board}      % Autumn Basic Board Default Desert Envelope Rays Simple Wave
\usecolorstyle{Britain}  % Australia Britain Default Denmark Germany Russia Spain Sweden
\title{A Poster Title}
\author{A. Author}
\institute{Somewhere}
\begin{document}
\maketitle
\begin{columns}
\column{0.5}
\block{Introduction}{Body text at poster scale.}
\column{0.5}
\block{Results}{%
  \begin{tikzfigure}[A caption]
    % tikzfigure does NOT open a tikzpicture -- you must open one yourself
    \begin{tikzpicture}
      \draw (0,0) rectangle (2,2);
    \end{tikzpicture}
  \end{tikzfigure}}
\end{columns}
\end{document}

外观分四层:除了 \usetheme,还可叠加 \usecolorstyle(八种,名字奇特地取自国名——Australia、Britain、Default、Denmark、Germany、Russia、Spain、Sweden)、\usecolorpalette(五种)和 \useblockstyle(七种:Basic、Corner、Default、Envelope、Minimal、Slide、TornOut)。不过 TeX Live 2024 同捆的 tikzposter v2.0(2014 年 1 月 15 日)里有一条命令是坏的。文档中列出的 \innerblock,无论换什么主题、哪怕先调用 \useinnerblockstyle,都会以 ! TeX capacity exceeded, sorry [grouping levels=255]. 崩掉,而且根本不生成 PDF。需要嵌套框时请用 \coloredbox{...}——它在同样的环境里顺利通过。

另一个陷阱是 tikzfigure。这个环境只准备了一个 center 和一个题注计数器,并不替你打开 tikzpicture。若裸写 \draw 又在可选参数里加了题注,就会报 ! LaTeX Error: There's no line here to end.。原因在 tikzposter.cls 第 818 行:它在题注前放了 \\[10pt];若正文以垂直模式结束,那个 \\ 便没有行可结束。去掉题注错误就消失,但正确的做法是像上面的示例那样在里面老老实实开一个 tikzpicture。字号由类选项 12pt14pt17pt20pt25pt 决定;选 25pt 时实测 \normalsize24.88 pt,选 20pt 则为 20.74 pt。

a0poster 为何输出成 A4,以及拿到真正 A0 PDF 的两种办法

a0poster 会输出 A4,是因为它通过 PostScript 的 \special 来传达纸张尺寸。在 TeX Live 2024 上编译,日志里会排满 Non-PDF special ignored!,其下记录着 <special> header=./a0header.ps<special> papersize=83.96cm,118.82cm。pdfTeX 把这两条整个丢弃,于是纸张仍停在 article 默认的 A4。这个类确实会在编译时往当前目录写出一个名叫 a0header.ps 的 PostScript 片段,里面装着 PageSize [2380 3368]setpagedevice。本该读它的程序是 dvips。这是 Gerlinde Kettl 与 Matthias Weiser 自 1997 年起编写、日期为 2004 年 1 月 31 日的 v1.22b——DVI 鼎盛期的设计原封不动地留了下来。

shell
# Route 1 -- the route the class was designed for (DVI to PostScript to PDF)
latex poster.tex && dvips poster.dvi -o poster.ps && ps2pdf poster.ps
pdfinfo poster.pdf | grep "Page size"   # 2384 x 3370 pts (A0)

# Route 2 -- stay with pdflatex and copy the paper size into the PDF yourself.
# Put these two lines in the preamble of poster.tex:
#   \pdfpagewidth=\paperwidth
#   \pdfpageheight=\paperheight
pdflatex poster.tex
pdfinfo poster.pdf | grep "Page size"   # 2379.97 x 3368.13 pts (A0)

出路有两条。本来的路径latexdvipsps2pdf;实测中 .ps 开头带有 %%DocumentPaperSizes: a0,生成的 PDF 是 2384 × 3370 pt。另一条是继续用 pdflatex,在导言区写 \pdfpagewidth=\paperwidth\pdfpageheight=\paperheight,把类算好的尺寸自己抄进 PDF;这样得到 2379.97 × 3368.13 pt。另外要注意,不带任何选项的 \documentclass{a0poster} 默认是 landscape,a0b,final,而 a0b 并非 ISO 的 A0,而是119 × 87 cm 的「加大 A0」。若在意纸张,请明写 [a0,portrait]。字号方面,\normalsize 被重定义为 24.88 pt,此外该类还提供自有的 \veryHuge(74.3 pt)、\VeryHuge(89.16 pt)与 \VERYHuge(107 pt)。它本身没有分栏或区块机制,正文要靠你用 multicolmulticols 环境或 minipage 自行排布。

baposter 不在 TeX Live 2024 里

把内容排成盒子网格的 baposter,在大量海报教程里都被提到——但它不在 TeX Live 2024 中kpsewhich baposter.cls 什么都不返回,tlmgr info baposter 回答 cannot find package baposter。唯一名字相近的是 xebaposter,一个面向波斯语与拉丁文海报的 XeLaTeX 类,与之无关。所以要用 baposter 就得从 CTAN 手工安装;在付出这份代价之前,先试 tikzposter 会更快。

交给印厂之前该确认什么

三项确认就够了。纸张尺寸pdfinfoPage size: 行;字体嵌入要求 pdffonts 每一行的 emb 列都是 yes图像分辨率在成品尺寸下有 150 dpi 实用上已足够(凑近细读的海报则 300 dpi)。对 pdflatex 生成的海报运行 pdffonts,会看到诸如 PWNZYL+CMB10 这样带子集名的 Type 1 字体,embsub 两列都是 yes。只要那里出现一个 no,印厂的 RIP 就可能拿别的字体替换。

还有一道上限——很少碰到,碰到了却令人不知所措。TeX 的最大尺寸是 16383.99998 pt,约 5.75 m。用 \setlength 实测,16383.99998 pt 原样通过,而 577 cm 则以 ! Dimension too large. 崩掉。A0 的 3370 pt 远在其下,用 beamerposter 指定 2 m × 3 m 得到的 8503.94 pt 也还有余裕。但若想把覆盖展位背板的 6 m 长幅排成单页,就会撞上这堵墙。此时的定法是按一半尺寸排版,交印时放大 200%。

  • 想直接沿用已有的 beamer 稿beamerpostersizescale 基本决定一切
  • 想快速得到整洁外观tikzposter。九种主题加八种配色,但请避开 \innerblock
  • 想自己掌控版面,或已有旧稿a0poster,但务必用 pdfinfo 确认纸张尺寸已抵达 PDF
  • 有人推荐 baposter → TeX Live 2024 里没有。要么从 CTAN 手工安装,要么改用 tikzposter