\chapter{幻灯片}
现在你已经领略甚至可能全部掌握了 \ConTeXt\ 常用的的排版元素,若不使用它们而是依然使用 Microsoft PowerPoint 制作幻灯片甚为可惜。如果你已决意使用 \ConTeXt\ 制作幻灯片,你会发现,你几乎不需要再学习多少新的 \ConTeXt\ 命令便可随心所欲地制作清新质朴的幻灯片了。
\section{纸面尺寸}
纸面尺寸是每一页的打印尺寸。至此为止,本文档之前所有的示例,在 \type{TEXpage} 环境里的,纸面尺寸取决于文档内容的多少,而在 \type{text} 环境里的,纸面尺寸默认是 A4,即 $21\,{\rm cm}\times 29.7\,{\rm cm}$,如果你需要将该尺寸换成 A5,只需在样式文件中作以下设定
\starttyping[option=TEX]
\setuppapersize[A5]
\stoptyping
制作幻灯片通常不需要太大的纸面尺寸。\ConTeXt\ 提供了 S4 尺寸($400\,{\rm pt}\times 300\,{\rm pt}$),可将其作为幻灯片的纸面尺寸。也可以自己定义纸面尺寸并使用,例如
\starttyping[option=TEX]
\definepapersize[foo][width=640pt,height=480pt]
\setuppapersize[foo]
\stoptyping
实际上,纸面尺寸仅对排版结果的打印很重要,倘若只是在计算机(或投影仪)屏幕上观看排版结果,我们总是可以通过调整正文字体大小去应对过大或过小的纸面尺寸,但是纸面尺寸的宽高比例,对于屏幕非常重要。通常,幻灯片的宽高比应当与屏幕的分辨率相适应为最佳。例如,我的屏幕分辨率是 $1600\times 900$,那么我要制作的幻灯片页面的宽高比也应当是 $16:9$,故而纸面尺寸可设定为
\starttyping[option=TEX]
\definepapersize[foo][width=640pt,height=360pt]
\setuppapersize[foo]
\stoptyping
现在,我们可以制作幻灯片的最原始的形式:
\starttyping[option=TEX]
\usemodule[visual]
\definepapersize[foo][width=640pt,height=360pt]
\setuppapersize[foo]
\starttext
\title{\fakewords{3}{5}}
\fakewords{50}{100}
\stoptext
\stoptyping
\midaligned{\externalfigure[13/slides-1.pdf][width=.6\textwidth,frame=on]}
\section{页面布局}
在 \type{text} 环境之前添加以下代码
\starttyping[option=TEX]
\showframe
\stoptyping
\noindent 可在页面上显示当前的页面布局,结果如图 \in[12-layout-1] 所示。可根据图 \in[ConTeXt-layout] 理解页面布局中各区域名称和尺寸参数名称。
\placefigure[here][12-layout-1]{\ConTeXt\ 默认的页面布局}{\externalfigure[13/layout-1.pdf][width=.6\textwidth]}
\placefigure[here][ConTeXt-layout]{页面布局注解}{\externalfigure[13/ConTeXt-layout.svg][width=.8\textwidth]}
使用 \type{\setlayout} 可对各区域尺寸进行调整,例如让版心居中,即图 \in[ConTeXt-layout] 所示的 \type{width} 和 \type{textheight} 确定的区域居中,因为在默认情况下,它有些偏左。我们已经知道,页面的横向尺寸是 640 pt,按照以下设定便可将问题解决:
\starttyping[option=TEX]
\setuplayout
[leftedge=0pt,leftedgedistance=0pt,
leftmargin=80pt,leftmargindistance=10pt,
backspace=90pt,
rightedge=0pt,rightedgedistance=0pt,
rightmargin=80pt,rightmargindistance=10pt,
width=460pt]
\stoptyping
\noindent 上述设定,实现了页面布局中页面总宽度值 640 pt 的分配,但是要注意一点,\type{backspace} 的值等于 4 个以 \type{left} 为前缀的参数值之和,虽然在设定了它的各个分量后,但 \ConTeXt\ 在遇到默认的 \type{backspace} 值与实际的 \type{left...} 参数值之和不符时,会根据 \type{backspace} 值进行页面布局。倘若我们不关心 \type{left...} 参数,即 \ConTeXt\ 默认对页面左侧留白区域默认如何分配,仅需要让 \ConTeXt\ 知道 \type{backspace=90pt},则上述代码可简化为
\starttyping[option=TEX]
\setuplayout
[backspace=90pt,
rightedge=0pt,rightedgedistance=0pt,
rightmargin=80pt,rightmargindistance=10pt,
width=460pt]
\stoptyping
\noindent 还可以进一步简化,因为 \ConTeXt\ 对 \type{rightedge} 和 \type{rightedgedistance} 赋予的默认值原本就是 0,因此有
\starttyping[option=TEX]
\setuplayout
[backspace=90pt,
rightmargin=80pt,rightmargindistance=10pt,
width=460pt]
\stoptyping
如果我们只关心版心的横向居中问题,并不关心左右留白区域的尺寸,最为简单的布局方式是
\starttyping[option=TEX]
\setuplayout[width=middle]
\stoptyping
以上设置的是页面横向布局。对于纵向布局,存在与 \type{backspace} 类似的问题,即 \type{topspace} 的设定。\type{tospace} 的值是 \type{top} + \type{topdistance},但是在 \type{\setuplayout} 中只对后者进行设定是无效的,必须先设定 \type{tospace},然后再将其值分配给 \type{top} 和 \type{topdistance},或让 \ConTeXt\ 自动分配。
对于页面纵向布局参数,我要去掉页面顶部和底部留白,只需作以下设定
\starttyping[option=TEX]
topspace=0pt,height=middle,bottom=0pt
\stoptyping
\noindent 现在全部的页面布局设定如下:
\starttyping[option=TEX]
\setuplayout[width=middle,topspace=0pt,height=middle,footer=40pt]
\stoptyping
完成页面布局设定后,别忘记去掉 \type{text} 环境之前的 \type{\showframe} 语句。此外,我建议你在 \type{text} 环境里动手试验一番 \type{\showlayout}。
\section[slide-fonts]{字体}
在 \ConTeXt\ 使用汉字字体,对此估计你已经颇为熟悉了。在幻灯片中,我使用以下字体:
\starttyping[option=TEX]
\definefallbackfamily
[myfonts][ss][latinmodernsans][range={0x0000-0x0400},force=yes]
\definefontfamily[myfonts][ss][simhei][bf=simhei,it=kaiti,bi=simhei]
\setscript[hanzi]
\setupbodyfont[myfonts,ss,16pt]
\stoptyping
\noindent 上述字体设定并不完整,尚未设定衬线字族和等宽字族,这些待需要时再予以设定。
\section[regular-style]{常规样式}
首先,消除 \ConTeXt\ 默认在页面顶部设置的页码:
\starttyping[option=TEX]
\setuppagenumbering[location=]
\stoptyping
\noindent 幻灯片通常不需要页码,即使需要页码,默认的页码出现的位置和字号皆不合适。
设置行间距为 1.75 倍,即 $1.75\times 16\,{\rm pt}$:
\starttyping[option=TEX]
\setupinterlinespace[line=28pt]
\stoptyping
以下代码设置了了第 1 级列表样式,(1)定义一个新的列表项符号,将其设置列表项默认符号;(2)消除列表项之间的额外间距;(3)列表项的符号和内容之间插入 .5em 的间距;(4)列表前后各空 1/4 行,因为在幻灯片中,纵向空间颇为珍贵。
\starttyping[option=MP]
\startuseMPgraphic{square}
path a, b;
a := (-.5, 0) -- (-.5, .5) -- (.5, .5);
b := (-.5, -.5) -- (.5, -.5) -- (.5, 0);
for i = a, b:
draw i scaled 10pt withpen pencircle scaled 2pt withcolor darkred;
endfor;
draw (0, 0) withpen pensquare scaled 4pt withcolor darkred;
\stopuseMPgraphic
\stoptyping
\starttyping[option=TEX]
\definesymbol[10][{\lower.15ex\hbox{\useMPgraphic{square}}}]
\setupitemize
[1][10,packed]
[distance=0.4em,
before={\blank[quarterline]},after={\blank[quarterline]}]
\stoptyping
\noindent 如果你还需要二级、三级列表,可参照上述设定制作适合的样式。
将幻灯片一级无编号标题和有编号标题均设置为居中对齐,字号级别为 \type{b},颜色为 \type{darkred},前后各空半行:
\starttyping[option=TEX]
\setuphead
[title,chapter]
[align=center,style=\ssb,color=darkred,
before={\blank[halfline]},after={\blank[halfline]}]
\stoptyping
现在,在 \type{text} 环境中随便写点什么,察验上述设定是否起效。
\starttyping[option=TEX]
\starttext
\startbuffer[foo]
\chapter{蒙}
亨。匪我求童蒙,童蒙求我;初筮告,再三渎,渎则不告。利贞。
\startitemize
\item 初六,发蒙,利用刑人,用说桎梏;以往吝。
\item 九二,包蒙,吉。纳妇,吉;子克家。
\item 六三,勿用取女,见金夫,不有躬,无攸利。
\item 六四,困蒙,吝。
\item 六五,童蒙,吉。
\item 上九,击蒙,不利为寇,利御寇。
\stopitemize
\stopbuffer
\dorecurse{10}{\getbuffer[foo]}
\stoptext
\stoptyping
\midaligned{\externalfigure[13/slides-2.pdf][width=.6\textwidth,frame=on]}
\noindent 上述代码使用了 \ConTeXt\ 的 \type{buffer} 环境和循环宏 \type{\dorecurse}。所谓 \type{buff},是一个可以设定名字的缓存,它可以包含 \ConTeXt\ 排版代码。\type{\getbuffer} 可获得指定名字的缓存中所包含的全部代码。\type{\dorecurse} 可以将其所含内容重复指定次数。上述代码所产生的效果是生成十页内容相同的幻灯片。
截止至此,我们第一次在示例中使用有编号标题。对于 \type{\chapter} 建议在幻灯片样式中增加以下设定,将其数字编号更改为中文编号,另外设置编号不参与对齐,亦即只有标题内容参与对齐:
\starttyping[option=TEX]
\setuphead[chapter][conversion=chinesenumerals,alternative=inmargin]
\stoptyping
\midaligned{\externalfigure[13/slides-3.pdf][width=.6\textwidth,frame=on]}
\blank
\noindent 如果你还需要二级、三级标题,可参照上述设定制作适合的样式。
\section{页脚}
在 \in[regular-style] 节中,我关闭了 \ConTeXt\ 好意提供的页码。因为我希望页码出现在页面的右下角,且除以总页数,以便清楚幻灯片的进度。
\ConTeXt\ 提供了 \type{\setupfootertexts} 命令,可以在页脚左、右区域放入文字、盒子或图形等内容,同时提供了 \type{\setupfooter} 用于设定页脚区域的文字样式。另外,\type{\userpagenumber} 和 \type{\lastuserpage} 可分别用于获取当前页的页码和最后一页的页码。基于这些命令,便可实现能够表示进度的页码。例如
\starttyping[option=TEX]
\showframe
\setupfooter[style=small,color=darkred]
% 页脚左侧区域为空,右侧区域放置用于表示进度的页码
\setupfootertexts[margin][][\hss\userpagenumber/\lastuserpage]
\stoptyping
\noindent 结果如图 \in[页码进度] 所示。
\placefigure[here][页码进度]{第 4 页幻灯片}{\externalfigure[13/slides-4.pdf][page=4,width=.6\textwidth,frame=on]}
现在,我们已经有了一个基本可用的幻灯片样式了。倘若使用刚学过的 \METAPOST\ 语言,琢磨一下,给幻灯片增加些许不庸俗又实用的装饰,也许会让人觉得你的幻灯片颇为用心。
\section{进度条}
现在,我们放弃使用当前页码除以总页数的方式表示进度,而是颇为用心地用 \METAPOST\ 在页面底部绘制一个进度条。实际上,用不了几行代码便可实现:
\starttyping[option=MP]
\startuseMPgraphic{processbar}
numeric w, n, s, t;
w := \overlaywidth; n := \lastuserpage;
s := .5w / (n + 2); t := \userpagenumber - 1;
path p; p := (fullsquare scaled \overlayheight);
pickup pencircle scaled 2pt;
picture q;
q := image(for i = 0 upto n - 1:
p := (p shifted (2s, 0)) randomized .5pt;
if t = i: fill p withcolor darkgreen; fi;
draw p withcolor transparent(1, 0.5, darkgray);
endfor;);
draw q xsized w;
\stopuseMPgraphic
\stoptyping
\starttyping[option=TEX]
\defineoverlay[process][\useMPgraphic{processbar}]
\setupfootertexts[{\framed[frame=off,offset=0pt,
width=\makeupwidth,height=.8em,
background=process,empty=yes]{}}]
\stoptyping
\noindent 上述代码唯一需要解释之处是,当 \type{\setupfootertexts} 只有一个参数时,该参数的值会被安置在页脚的中间区域。所构造的进度条效果如图 \in[processbar] 所示。
\placefigure[here][processbar]{第 3 页幻灯片}{\externalfigure[13/slides.pdf][width=.6\textwidth,page=4,frame=on]}
\section{封面和致谢}
幻灯片的封面和最后的致谢页皆可使用 \type{sandardmakeup} 环境制作。例如
\starttyping[option=TEX]
\startstandardmakeup[align=center]
\ssd \color[darkred]{如何用 \ConTeXt\ 制作幻灯片}
\blank[2*line]
\ssb 李某人
\blank[line]
2023 年 3 月 28 日
\stopstandardmakeup
\stoptyping
\noindent 结果如图 \in[cover] 所示。
之所以使用 \type{standardmakeup} 环境,是因为它是完全的空白页,且不会参与页码计数。
\placefigure[here][cover]{封面}{\externalfigure[13/slides.pdf][width=.6\textwidth,page=1,frame=on]}
\section{不要太刺眼}
白色背景,往往过于刺眼。我们可将幻灯片背景色设置为浅灰色:
\starttyping[option=TEX]
\setupbackgrounds[page][backgroundcolor=lightgray,background=color]
\stoptyping
\noindent 结果如图 \in[slide-background] 所示。
\placefigure[here][slide-background]{浅灰色背景}{\externalfigure[13/slides-finished.pdf][width=.6\textwidth,page=1,frame=on]}
\section{小结}
本章仅介绍了非常基本的幻灯片制作过程。一份精致的幻灯片样式,值得你用心设计,但是切记,不要喧宾夺主。质胜文则野,文胜质则史。孔子说,好的幻灯片样式,总是是文质彬彬的。本文制作的幻灯片示例,路数偏野。