ConTeXt 演示文档制作笔记-1

LiYanrui posted @ Aug 27, 2008 04:20:39 AM in Dream of TeX with tags ConTeXt presentation , 8411 阅读

这几天看资料,尝试,昏厥,就是想学习一下 ConTeXt 是如何做演示文档的,现在总算自以为初窥门径了,因此写了这篇文章,总结我对 ConTeXt 的页面布局、文档模式以及使用 MetaFun 制作文档样式的一些浅薄的认识。

1. 文档模式

ConTeXt 的文档模式功能很合我意,利用这一功能可以实现基于同一份 ConTeXt 文档产生不同样式的输出。请看下面的一个微型示例 ex-1.tex:

\setupcolors[state=start]

\startmode[presentation]
    \setuppapersize[S6][S6]
    \setupbodyfont[ss,18pt]
    \setuphead[section][before={\page}]
\stopmode

\startmode[handout]
    \setuppapersize[A4][A4]
    \setupbodyfont[rm,11pt]
    \setuphead[chapter][page=no]
\stopmode

\starttext

\chapter{This is a test}
\section{This is only a test}
\input knuth

\chapter{This is the second test}
\section{This is still a test}
\input knuth

\stoptext

将上述的 ex-1.tex 文档分别采用以下命令编译:

$ context --mode=presentation  --result=ex-1s.pdf   ex-1
$ context --mode=handout --result=ex-1p.pdf   ex-1

结果,我们得到了两份不同的 PDF 文档输出——ex-1s.pdfex-1p.pdf,它们的内容是一样的,只是外观有所区别而已。

ex-1s.pdf 的外观是由源文档中 presentation 模式环境定义的,而 ex-1p.pdf 的外观是由源文档中 handout 模式环境所定义的。ConTeXt 可以在文档中由用户自定义模式,模式环境之内的代码只有在编译命令中添加对应的 --mode 参数才可以让编译程序看得见,否则编译程序只能吞下模式环境之外的代码了。

如果我们坚持格式与内容分离的文档撰写风格,那么就可以灵活地利用模式环境来构造不同的文档外观,这就像 CSS 与 HTML 的关系,也可以理解为衣服与人的关系。

2. 对演示文档做一些美化

假如你和我一样能够吃糠咽菜,容忍非常简陋的东西,那么就可以认为上一节 ex-1s.pdf 是一份演示文档。它用的页面用纸是 S6 的,即长为 21.08200cm,宽为 15.8242cm,正文字体设置为非衬线尺寸为 18pt 的字型,并且设定了 \section 命令会开启新页面。

我不是一个自欺欺人的人,虽然我认为 ex-1s.pdf 是一份演示文档,但是我绝不否认我不喜欢它,爱美的天性促使我决定开始对它进行美化。记住,所有的美化工作都应当发生在 persentation 模式环境中。

首先,页面默认的排版布局有点问题,文档版面未居中,而是稍微偏左。不知 ConTeXt 给出这样默认的布局是否有什么深意,如果要将版面居中,可如此设定:

    \setuplayout[width=middle,height=middle,location=middle]

文档章节的标题字型我喜欢设为暗红色、粗体:

    \setuphead[chapter][color=darkred,style=\bfc]
    \setuphead[section][color=darkred,style=\bfb,before={\page}]

那个页码不值得保留,演示文档又不是书;如果非要保留,也应当将它放到一个不显眼的位置。可以这样来处理:

    \setuppagenumbering[location=]  % 隐掉页码
    % or
    % \setuppagenumbering[location={footer,right}] % 将页码放置在页面右下角

页面的背景色默认是白色,刺眼的白色。我希望将它设置成既不易于引起视觉疲劳又不引人注意的颜色,也许只有灰色适合。那就设成灰色的,不过这需要 MetaFun 的帮助。不使用 MetaFun 也可以进行背景色设置,但使用 ConTeXt 制作演示文档,迟早都要面对 MetaFun,晚痛不若早痛。

    \definecolor[bg][gray]
    \startuseMPgraphic{PageShape}
    StartPage;
        fill Page withcolor \MPcolor{bg};
    StopPage;
    \stopuseMPgraphic
    \defineoverlay[PageShape][\useMPgraphic{PageShape}]
    \setupbackgrounds[page][background=PageShape]

上述代码用意:

  1. 定义背景色 bg 为灰色 (gray);
  2. 开启 MetaFun 绘图环境,绘制一个和页面一样大小的灰色背景图片;
  3. 基于 MetaFun 所绘制的图形定义一个覆盖图 (overlay);
  4. 将覆盖图设为页面的背景,因为许多 ConTeXt 版面布局命令都可以将 overlay 设为背景图片。

这毕竟是演示文档,所以我希望它默认状态能够驱使 PDF Viewer 表现为全屏状态,于是就又增加了以下设置,将文档的默认状态设为全屏:

    \setupinteractionscreen[option=max]

现在,我们似乎得到了一个稍微有点姿色的演示文档了,请看:ex-2s.pdf

3. 制作一个有点动感的页面边框

这个已经稍有姿色的演示文档还缺乏一些动感。我在思考如何在页面的边缘区域画一个形状随机变化的矩形框,让页面显得不那么单调,又不过多分散观者的注意力。

现在我在上一节中所设置的 persentation 模式环境的基础上来添加一个页面边框,并适应性地将页面布局也做了一些小调整,现在 persentation 模式环境的完整代码如下:

\startmode[presentation]
    \setuppapersize[S6][S6]
    \setupbodyfont[ss,18pt]
    \setuplayout[width=middle,height=middle,location=middle]
    \setuphead[chapter][color=darkred,style=\bfc]
    \setuphead[section][color=darkred,style=\bfb,before={\page}]
    \setuppagenumbering[location=]
    \definecolor[bg][gray]
    \definecolor[ornament][r=.40,g=.60,b=.20]
    \startuseMPgraphic{PageShape}
    StartPage;
        path p;
        delta_w := -0.6*\the\backspace;
        delta_h := -0.6*\the\topspace;
        r := 9pt;
        fill Page withcolor \MPcolor{bg};
        p := Page enlarged (delta_w, delta_h) randomized r;
        draw p withcolor \MPcolor{ornament} withpen pencircle scaled 4pt;
    StopPage;
    \stopuseMPgraphic
    \defineoverlay[PageShape][\useMPgraphic{PageShape}]
    \setupbackgrounds[page][background=PageShape]
    \setupinteractionscreen[option=max]
\stopmode

代码一多起来,看上去就有点复杂了。不过要想理解也不是很难,找到 MetaFun 手册,配合 PDF 阅读器的查询功能,遇到不懂的命令就查查,我的做法就是这样。

从上面的代码也可以大致看出 MetaFun 对 MetaPost 进行了许多友好的封装,譬如在 StartPage ... StopPage 环境中,像 \the\backspace 这样的命令,可以将 ConTeXt 排版布局参数值提供给 MetaPost,从而可以绘制出符合页面布局需求的背景图形。

现在,我自认为已经拥有了一份简约而不简单的演示文档,并且也不再那么羞怯地贴出图来

4. 让页面边框成为进度条

页面边框仅仅是为了美观么?当然不是。其实我的真正意图是想将它作为一个进度条来使用,用于指示当前演示的位置,让昏昏欲睡的观者知道自己还能再坚持多久才可以听完我的报告。

MetaPost 提供了 cutafter 命令,可以在绘制一条路径时不绘制指定点之后的路径,利用这个,就可以绘制进度条了。这个想法来源于 ConTeXt Minimals 自带的 funny (s-pre-03.tex) 模板。再对上一节实现的 presentation 模式环境进行修改,完整的模式环境代码如下:

\startmode[presentation]
    \setuppapersize[S6][S6]
    \setupbodyfont[ss,18pt]
    \setuplayout[width=middle,height=middle,
                 location=middle,
                 leftmargin=.5cm,rightmargin=.5cm,
                 backspace=2cm,topspace=2cm,
                 header=.5cm,footer=.5cm]
    \setuphead[chapter][color=mydarkred,style=\bfb,before=\blank,after=\blank]
    \setuphead[section][color=mydarkred,style=\bfa,
                        before={\page\blank},after=\blank]
    \setuppagenumbering[location=]
    \definecolor[bg][gray]
    \definecolor[ornament][r=.40,g=.60,b=.20]
    \definecolor[mydarkred][r=.60,g=.20,b=.20]
    \startuseMPgraphic{PageShape}
    StartPage;
        path p;
        pair breakpt;
        numeric len;

        line_w := 4pt;
        delta_w := -0.5*\the\backspace;
        delta_h := -0.5*\the\topspace;
        r := 9pt;
       
        fill Page withcolor \MPcolor{bg};
       
        p := Page enlarged (delta_w, delta_h) randomized r;
       
        pickup pencircle scaled line_w;
        draw p withcolor \MPcolor{ornament} withpen pencircle scaled line_w;

        if (NOfPages>0):
           len := 4*(PageNumber/NOfPages);
            breakpt := point len of p;
            draw p cutafter breakpt withcolor \MPcolor{mydarkred};
        fi;
    StopPage;
    \stopuseMPgraphic

    \defineoverlay[PageShape][\useMPgraphic{PageShape}]
    \setupbackgrounds[page][background=PageShape]
    \setupinteractionscreen[option=max]
\stopmode

上述代码实现进度条的原理是:

  1. 设定进度条步进长度 len=(4*当前页码/页码总数),至于为什么是 4,是因为页面边框是个矩形框,由 4 段构成;
  2. 根据当前页面的页码来计算路径断点 breakpt 的位置;
  3. 绘制新路径,覆盖原页面边框。

进度条行走是的效果截图如下:

5. 继续前进

go to 我的第 2 篇笔记

Yue Wang 说:
2008年8月27日 05:21

嗯,你已经开始体会到ConTeXt真正奇妙的地方了:)欢迎来到ConTeXt的世界!

zpxing 说:
2008年8月27日 06:42

实在想说 context 幻灯片难度太高了,要用很多 MP 代码美化,而且很少有可以照抄的模板,怎么折腾也做不出像 beamer powerdot 里头几种很好看的配色。pragma 给出的 s-pre-xx 又实在难于欣赏。我折腾很久又放弃了。

Avatar_small
Li Yanrui 说:
2008年8月27日 06:53

我觉得还可以,简陋点倒没什么,关键是自己可以全盘控制样式。看 MP 代码,我觉得也比看 Beamer 内部实现的那些我看不懂的宏要有用得多,这样也好调动我学习 MP 的兴趣。最大的希望能够做出一个具有个人风格的模板,可以用很久很久。

如果真要应急做演示,我可能也会求助 Beamer,省了许多美化的工作。

Yue Wang 说:
2008年8月27日 18:42

@zpxing: 我从去年年初研究完beamer源码以后,从来不用TeX工具做幻灯片。做幻灯片很多工具可以完成得更出色更方便,比如Keynote是我见过最强大的幻灯片制作工具,或者其实很多人骂的PowerPoint也是不错的。看beamer的源码让我发现原来LaTeX是如此定义样式的,pgf是如此控制版面并作图的,使我对定义LaTeX有了更加深入的了解(不过前辈说要学习LaTeX,最好还是看source2e以及Memoir Class实现)。我也从来没有用ConTeXt做过真实演讲的幻灯片,只是平时空闲时可以用此打发时间,不过透过做ConTeXt幻灯片练手的过程,实际上可以学到很多的东西。你讲得很对,pragma的幻灯片模板都很丑,而且很少有可以照抄的模板,但是事实上这个正是一个学习的机会,从自己定义一个ConTeXt模板,首先是自己动脑子去设计一个外观,这个涉及到用铅笔圆规原原本本地按照比例和常数(比如e和pi)在纸上设计布局,同时,设计幻灯片可以说是对ConTeXt所有重要知识的一个最好的总结,它当中涉及了所有的关于版式纸张配色设计的命令,包括了所有的标题脚注页码枚举项等等的设定命令,包括了所有METAFUN以及和TeX交互的命令,甚至还包括了XML转TeX的所有细节(我的第一个ConTeXt幻灯片是用XML写的),以及ConTeXt中插入插图,Flash动画,音乐电影和u3d三维图纸以及javascript等各种pdf扩展的内容。可以说,像样地做一个幻灯片,收获是颇丰的,相当于一个ConTeXt所有功能的大杂烩。

zpxing 说:
2008年9月07日 04:22

最近看了 context meeting 的一些幻灯片,感觉这大约就可以代表 context 最高水准了。除了 taco 以外,其他的主要就是 taspresent 的 module。latex 的就是 beamer 类。

taspresent 系列的风格主要模仿了 beamer powerdot 和 s-pre。感觉很不错,用法也很简便。算是我以后一段时间的主要演示工具吧。

zpxing 说:
2008年9月17日 02:01

在 luatex.org 的文档集中,有一大类 Hans 做的幻灯片,统统采用不同的 layer 来标记 step, 逐步演示,比如 http://www.luatex.org/talks/screen-mplib-tug-2008.pdf 显得很强大。

Yue Wang 说:
2008年9月19日 02:25

@zpxing,Hans以前贴过把一个屏幕分成若干个layer的代码,你可以去参考。step是采用了s-pre-60(如果我没有记错文件名的话)中的javascript代码实现的。

制作当然强大,但是这样的方法制作幻灯片却不敢恭维。Hans显然没有悟出演说之道,我看他的讲话视屏看得昏昏欲睡(当然和英语口音也有关系)。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter