使用 ConTeXt 的 buffer 制作逐步显示效果
用过 LaTeX Beamer 宏包的同学应当知道 Beamer 在制作步骤列表时,可将一块完整的内容分布于多个演示文档页面,以实现演示过程中逐步显示的效果。
ConTeXt 也有一些模块可以实现逐步显示效果,例如 Raw Steps 模块 [1],还有 Hans Hagen 基于 PDF 的 JavaScript 实现的 s-pre-60.mkiv 和 s-pre-61.tex [2]。前者与后者的详细的功能比较见 [3],简而言之,前者与 LaTeX Beamer 相似,通过静态页面的切换实现内容的逐步显示;后者是通过 PDF 内嵌的 JavaScript 程序控制页面元素的显示与隐藏。虽然后者可以充分利用 PDF 的性能,但现在也许只有 Adobe Reader 可以很好的支持 PDF 中嵌入 Javascript,作为 Linux 环境中的 Evince 用户,我对后者伤不起啊,因此我投前者一票。但是很不幸,Raw Steps 年久失修,现在基本上废掉了,其作者也不知所踪,而我现在还不具备修复它的能力。不过 Raw Steps 的原理很简单,它主要是利用 ConTeXt 的 buffer 功能实现的。
ConTeXt 的 Buffer 机制
下面是 ConTeXt 的 Buffer 机制的一份简单示例。
\starttext \startbuffer[buffer1] your buffer 1 text. \stopbuffer \startbuffer[buffer2] your buffer 2 text. \stopbuffer \getbuffer[buffer1] \dorecurse{10}{\getbuffer[buffer2]} \stoptext
排版结果如下图所示。
从上面的例子大致可以了解 ConTeXt 的 Buffer 的用法,即:
- 使用 \startbuffer[foo] ... \stopbuffer 将内容置于名称为“foo”的 Buffer 之中;
- 使用 \getbuffer[foo] 命令将名称为“foo”的 Buffer 中的内容取出来。
内容逐步显示的实现
只要明白了 Buffer 的用法,那么利用它来实现内容逐步显示的方法就很简单了,看下面的示例。
\starttext \startbuffer[buffer1] your buffer 1 text. \stopbuffer \getbuffer[buffer1] \page \startbuffer[buffer2] \getbuffer[buffer1]\par your buffer 2 text. \stopbuffer \getbuffer[buffer2] \stoptext
这个示例的输出的 PDF 文档第 1 页显示的内容为:
your buffer 1 text.
第 2 页显示的内容为:
your buffer 1 text.
your buffer 2 text.
使用 PDF 阅读器的全屏模式显示这份 PDF 文档时,在切换页面时,就可以营造逐步显示的假象。
页码的问题
上一节虽然通过 Buffer 的“继承”实现了内容的逐步显示,但是 ConTeXt 默认会将页码排版于输出结果的页眉中部,这样每页都会出现不同的页码,在页面切换时,页码的变化会影响逐步显示效果。因此我们需要想出一个办法能够让需要进行内容逐步显示的页面的页码保持不变,同时又不影响其他页面的页码。
应当感谢 ConTeXt 应有尽有的功能,我们可以在第一个 Buffer 之前使用 \realpageno 获取该 Buffer 所在页面的真实页码(因为还有虚假页码),并在第一个 Buffer 内部使用 \setuppagenumber 将该页码设为当前页面的页码,然后通过 Buffer 的集成,第一个 Buffer 中的页码设定会遗传给后续的各个 Buffer,从而实现逐步显示内容的页码统一。具体见以下示例:
\starttext \input knuth \page \newcount\firststeppageno \firststeppageno=\realpageno \startbuffer[buffer1] \setuppagenumber[number=\the\firststeppageno] your buffer 1 text. \stopbuffer \getbuffer[buffer1] \page \startbuffer[buffer2] \getbuffer[buffer1]\par your buffer 2 text. \stopbuffer \getbuffer[buffer2] \page \startbuffer[buffer3] \getbuffer[buffer2]\par your buffer 3 text. \stopbuffer \getbuffer[buffer3] \page \input knuth \stoptext
这个示例的排版输出结果共有 5 个页面,其中第 1 页与最后一页显示的是 knuth.tex 文件内容,它们显示的的页码分别为 1 和 3 ;第 2、3、4 页是逐步显示的内容,它们的页码均为 2。
新的逐步显示模块的设想
对于逐步显示的内容,每次都要写 \startbuffer ... \stopbuffer、\getbuffer 之类的宏,显得非常繁琐。我需要重新制造一个可用的 Raw Steps 模块 [1] 的轮子,来简化逐步显示内容的处理,不过这次可以利用 LuaTeX 的 Lua 程序嵌入功能来实现。
这个模块的接口的初步设计如下例所示:
\usemodule[pseudosteps] \starttext \startPseudoSteps Some text with \PseudoStep{blabla blabla...}. Some text with \PseudoStep{blabla blabla...}. \stopPsedoSteps \stoptext
本文引用的资料:
[1] http://modules.contextgarden.net/t-rsteps
转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com