抄录(Verbatim)
使用 ConTeXt 的 buffer 制作逐步显示效果

ConTeXt 模块参数的获取

Garfileo posted @ 2011年6月11日 15:37 in ConTeXt 笔记 with tags ConTeXt MkIV zhfonts , 4496 阅读

很久以前,在写那个仅能满足我个人需求的 zhfonts 模块(面向 ConTeXt MkIV 版本)时,我便希望能够在 \usemodule 语句中直接传入正文字体的 typeface 和 size。例如:

\usemodule[zhfonts][style=rm, size=11pt]

然后在 zhfonts 模块中将 style 与 size 的值传递给 \setupbodyfont 宏,并使用 \prependtoks 宏将 \setupbodyfont 对应的记号(Token)挂载于 \starttext(准确的说是 \everystarttext 记号)之前用以实现字体的隐式设定,而无需每次都使用 \setupbodyfont[rm, 11pt] 这样的宏去显式设定正文字体。

按照 [1] 中的说明,我尝试使用 \currentmoduleparameter 与 \getmoduleparameter(这个宏貌似现在已经被废了)宏获取模块参数,没能成功。下面通过一个简单的示例来证明我的确没法成功。

首先,仿照 [1] 构建一个文件名为 blabla.tex 的模块,内容如下:

\startmodule[blabla]
\unprotect

\setupmodule[style=rm,size=11pt]
\def\@@@style{\currentmoduleparameter{style}}
\def\@@@size{\currentmoduleparameter{size}}
\prependtoks \setupbodyfont[\@@@style, \@@@size] \to \everystarttext

\protect
\stopmodule
\endinput

然后构建一份测试示例 test.tex,内容如下:

\usemodule[blabla][style=ss,size=24pt]

\starttext

Hello the blabla module!

\stoptext

编译 test.tex 后,观察其输出 pdf 文件,发现 \usemodule 语句中传入的 style 与 size 参数值根本没能传至 \setupbodyfont 宏。

由于对 TeX 宏的编写非常生疏,当初遇到了这个问题后,就没再深究。直至最近开始阅读《TeX by Topic》这本书,对 TeX 处理器有了大致的了解,便分析了一下这个问题。发现原因很简单,\currentmoduleparameter{style} 与 \currentmoduleparameter{size} 在 blabla 模块中没能被展开(可能是 \currentmoduleparameter 的定义中使用了 \noexpand 进行了限定),所以 \setupbodyfont 无法从它们获得相应的参数值。

那么应当如何在 blabla 模块中展开 currentmoduleparameter 宏?我使用了多个 \expandafter\noexpand 的组合尝试将其展开,未果。后来发现,只需要使用 \edef 宏去定义 \@@@style 与 \@@@size 宏即可,因为 \edef 会对它所定义的宏的替换文本是当场就完全展开的,于是将上述 blabla 模块修改为:

\startmodule[blabla]
\unprotect

\setupmodule[style=rm,size=11pt]
\edef\@@@style{\currentmoduleparameter{style}}
\edef\@@@size{\currentmoduleparameter{size}}
\prependtoks \setupbodyfont[\@@@style, \@@@size] \to \everystarttext

\protect
\stopmodule
\endinput

便终于遂愿了。

所以现在当你使用 [2] 中的 zhfonts 模块时,便无需再使用 \zhfonts[rm, 11pt] 这样的宏去显式设定正文字体了,只需采用类似以下方式设定字体即可。

\usemodule[zhfonts][style=rm, size=11pt]
\setupzhfonts[serif][regular=nsimsun]

\starttext
测试 test 测试
\stoptext

由于 style 和 size 在 zhfonts 模块中的默认值分别是 rm 和 11pt,所以上例可以简化为:

\usemodule[zhfonts]
\setupzhfonts[serif][regular=nsimsun]

\starttext
测试 test 测试
\stoptext

如果你恰好拥有 zhfonts 模块默认的那些字体,上例就可以变成:

\usemodule[zhfonts]

\starttext
测试 test 测试
\stoptext

参考文档

[1] http://wiki.contextgarden.net/Module_Parameters

[2] https://github.com/liyanrui/zhfonts/commit/f6b192a6490172f3266256486b44bf006f469e7a

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com

  • 无匹配

登录 *


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