返回列表 回复 发帖

[ConTeXt] MkIV:重新做了一份 zhfonts.tex 兼谈 LuaTeX “编程”

本帖最后由 LiYanrui 于 2010-1-13 09:13 编辑

这次是用 lua 动态生成 typescript 代码并插入到文档中,详见附件。

示例1:
默认的中文字体: Adobe 宋、黑、仿宋
默认英文字体:lm 系列
使用 \usezhfonts 取代 \setupbodyfont
  1. \usemodule[zhfonts]
  2. \usezhfonts[rm,12pt]

  3. \starttext
  4. 所有动物都生而平等,balabala 但有些动物比其他动物更平等。

  5. \ss 所有动物都生而平等,balabala 但有些动物比其他动物更平等

  6. \tt 所有动物都生而平等,balabala 但有些动物比其他动物更平等
  7. \stoptext
复制代码
示例2:可以有选择的替换默认的字体
  1. \usemodule[zhfonts]
  2. \setupzhfonts[serif][bold=adobeheitistd]
  3. \setupzhfonts[mono][regular=adobesongstd, bold=adobeheitistd, italic=adobesongstd,bolditalic=adobeheitistd]

  4. \setuplatinfonts[serif][regular=texgyrepagellaregular, bold=texgyrepagellabold,italic=texgyrepagellaitalic, bolditalic=texgyrepagellabolditalic]

  5. \usezhfonts[rm,12pt]

  6. \starttext
  7. 所有动物都生而平等,balabala 但有些动物比其他动物更平等。

  8. \ss 所有动物都生而平等,balabala 但有些动物比其他动物更平等

  9. \tt 所有动物都生而平等,balabala 但有些动物比其他动物更平等
  10. \stoptext
复制代码
附件: 您所在的用户组无法下载或查看附件
技术潜水员
本帖最后由 LiYanrui 于 2009-11-23 10:48 编辑

发现用 Lua 字串解析的方式来处理宏参数,要比 http://wiki.contextgarden.net/Commands_with_KeyVal_arguments 这种宏方式舒服多了。

比如:
  1. \def\setupzhfonts[#1][#2]{
  2.     \ctxlua{zhfonts.refresh_font_model ('zh', '#1', '#2')}
  3. }
复制代码
zhfonts.refresh_font_model 函数的实现:
  1. function zhfonts.refresh_font_model (language, family, types)
  2.     if not verify_font_model () then gen_default_font_model () end
  3.     local model = nil
  4.     local font_array = strsplit (types, ',')

  5.     if language == 'zh' then model = zh_font_model end
  6.     if language == 'latin' then model = latin_font_model end

  7.     for v in values (font_array) do
  8.         local font_item = strsplit (v, '=')
  9.         model[strtrim(family)][strtrim(font_item[1])] = strtrim (font_item[2])
  10.     end
  11. end
复制代码
只需要做一个字串分割函数 strsplit,就可以提出参数列表。
本帖最后由 LiYanrui 于 2009-11-23 10:38 编辑

产生 typescript 代码的函数是这样子的:
  1. function zhfonts.gen_text_typescript ()
  2.     local families = {'Serif', 'Sans', 'Mono'}
  3.     local types = {'', 'Bold', 'Italic', 'BoldItalic'}
  4.     local override_area = '[0x00400-0x2FA1F]'

  5.     for family in values (families) do
  6.         local lp1 = string.lower (family)
  7.         context ('\\starttypescript[' .. lp1 .. '][zhfonts]')
  8.         for type in values (types) do
  9.             local lp2 = string.lower (type)
  10.             if lp2 == '' then lp2 = 'regular' end
  11.             context ('\\definefontsynonym[latin' .. family .. type .. ']'
  12.                        .. '[name:' .. latin_font_model[lp1][lp2] .. ']')
  13.             context ('\\definefontfallback[zh' .. family .. type .. ']'
  14.                        .. '[name:' .. zh_font_model[lp1][lp2] .. ']' .. override_area)
  15.             context ('\\definefontsynonym[zh' .. family .. type .. 'fallback]'
  16.                        .. '[latin' .. family .. type .. ']'
  17.                        .. '[fallbacks=zh' ..   family .. type .. ']')
  18.             context ('\\definefontsynonym[' .. family .. type .. '][zh' .. family .. type .. 'fallback]')
  19.         end
  20.         context ('\\stoptypescript')
  21.     end

  22.     context ('\\starttypescript[zhfonts]')
  23.     context ('\\definetypeface[zhfonts][rm][serif][zhfonts]')
  24.     context ('\\definetypeface[zhfonts][ss][sans][zhfonts]')
  25.     context ('\\definetypeface[zhfonts][tt][mono][zhfonts]')
  26.     context ('\\stoptypescript')

  27.     context ('\\usetypescript[zhfonts]')
  28. end
复制代码
我将生成的缺省 typescript 打印出来,就是附件里的 pdf。那个 \usezhfonts 宏就是调用这个函数来产生 typescript 并将其插入到文档中的。

\usezhfonts 的定义:
  1. \def\usezhfonts[#1]{%
  2.     \ctxlua{zhfonts.use ('#1')}
  3. }
复制代码
zhfonts.use 函数的实现:
  1. function zhfonts.use (param)
  2.     if not verify_font_model () then gen_default_font_model () end
  3.     zhfonts.gen_text_typescript ()
  4.     context ('\\setscript[hanzi]')
  5.     context ('\\setupbodyfont[zhfonts, ' .. param .. ']')
  6. end
复制代码
附件: 您所在的用户组无法下载或查看附件
在文档中充分利用 lua 编程功能的一些介绍见 http://wiki.contextgarden.net/Programming_in_LuaTeX

从中可以体会到 luatex 带来的好处
本帖最后由 LiYanrui 于 2009-11-24 08:49 编辑

Hans 制作了一份讲述如何直接用 lua 来写“文档”的文档,可从 http://www.pragma-ade.com/general/manuals/cld-mkiv.pdf 下载。lua 粉丝或许会喜欢这样来写文档 :-)

比方说下面这份 test.lua “程序”源码:
  1. local todimen = number.todimen
  2. context.startTEXpage()
  3. local paperwidth  =  tex.dimen.paperwidth
  4. local paperheight =  tex.dimen.paperheight
  5. local nofsteps    =  25
  6. local firstcolor  =  "darkblue"
  7. local secondcolor =  "white"
  8. context.definelayer(
  9.     { "titlepage" }
  10. )
  11. context.setuplayer(
  12.     { "titlepage" },
  13.     {
  14.         width = todimen(paperwidth),
  15.         height = todimen(paperheight),
  16.     }
  17. )
  18. context.setlayerframed(
  19.     { "titlepage" },
  20.     { offset = "-5pt" },
  21.     {
  22.         width = todimen(paperwidth),
  23.         height = todimen(paperheight),
  24.         background = "color",
  25.         backgroundcolor = firstcolor,
  26.         backgroundoffset = "10pt",
  27.         frame = "off",
  28.     },
  29.     ""
  30. )
  31. for i=1, nofsteps do
  32.     for j=1, nofsteps do
  33.         context.setlayerframed(
  34.             { "titlepage" },
  35.             {
  36.                 x = todimen((i-1) * paperwidth /nofsteps),
  37.                 y = todimen((j-1) * paperheight/nofsteps),
  38.                 rotation = math.random(360),
  39.             },
  40.             {
  41.                 frame = "off",
  42.                 background = "color",
  43.                 backgroundcolor = secondcolor,
  44.                 foregroundcolor = firstcolor,
  45.                 foregroundstyle = "type",
  46.             },
  47.             "CLD"
  48.         )
  49.     end
  50. end
  51. context.tightlayer(
  52.     { "titlepage" }
  53. )
  54. context.stopTEXpage()
  55. return true
复制代码
用命令:
  1. context test.lua
复制代码
来编译,就得到下面这个图案的 pdf 文件了。
附件: 您所在的用户组无法下载或查看附件
不错,挺快的,我这加载 zhfonts 只用了 5 秒不到。顺便给个完整的例子:
  1. %!TEX TS-program = context mkiv
  2. %
  3. \usemodule[zhfonts]
  4. \setupzhfonts[serif][regular=adobesongstd, italic=AdobeKaitiStd-Regular, bold=adobeheitistd, bolditalic=adobeheitistd]
  5. \setupzhfonts[sans][regular=adobeheitistd, italic=AdobeKaitiStd-Regular, bold=adobeheitistd, bolditalic=adobeheitistd]
  6. \setupzhfonts[mono][regular=AdobeFangsongStd-Regular, italic=AdobeFangsongStd-Regular, bold=adobeheitistd, bolditalic=adobeheitistd]

  7. \setuplatinfonts[serif][regular=DejaVu Serif, bold=DejaVu Serif Bold, italic=DejaVu Serif Italic, bolditalic=DejaVu Serif Condensed Bold Italic]
  8. \setuplatinfonts[sans][regular=DejaVu Sans, bold=DejaVu Sans Bold, italic=DejaVu Sans Oblique, bolditalic=DejaVu Sans Bold Oblique]
  9. \setuplatinfonts[mono][regular=DejaVu Sans Mono, bold=DejaVu Sans Mono Bold, italic=DejaVu Sans Mono Oblique, bolditalic=DejaVu Sans Mono Bold Oblique]

  10. \usezhfonts[rm,12pt]

  11. \starttext
  12. \rm\tf 所有动物都生而平等,balabala 但有些动物比其他动物更平等。\par
  13. \rm\it 所有动物都生而平等,balabala 但有些动物比其他动物更平等。\par
  14. \rm\bf 所有动物都生而平等,balabala 但有些动物比其他动物更平等。\par
  15. \rm\bi 所有动物都生而平等,balabala 但有些动物比其他动物更平等。\par

  16. \blank

  17. \ss\tf 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par
  18. \ss\it 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par
  19. \ss\bf 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par
  20. \ss\bi 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par

  21. \blank

  22. \tt\tf 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par
  23. \tt\it 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par
  24. \tt\bf 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par
  25. \tt\bi 所有动物都生而平等,balabala 但有些动物比其他动物更平等\par
  26. \stoptext
复制代码
结果:
附件: 您所在的用户组无法下载或查看附件
中文支持现在剩下最大的问题就是标点的处理了。当初做过一些尝试,但是最终失败了,刚才意外发现了失败的原因,还可以接着试试。
报告个问题,如果用下面的方式定义字体,就会报错:
  1. \usemodule[zhfonts]
  2. \setuplatinfonts[serif]
  3.         [regular=DejaVu Serif,
  4.         bold=DejaVu Serif Bold,
  5.         italic=DejaVu Serif Italic,
  6.         bolditalic=DejaVu Serif Condensed Bold Italic]
  7. \usezhfonts[rm,12pt]

  8. \starttext
  9. hello
  10. \stoptext
复制代码
log如下:
  1. loading         : ConTeXt User Module / zhfonts
  2. ))
  3. Runaway argument?
  4. serif] [regular=DejaVu Serif, bold=DejaVu Serif Bold, italic=DejaVu S\ETC.
  5. ! File ended while scanning use of \setuplatinfonts.
  6. <inserted text>
  7.                 \par
  8. <*> "./context mkiv.tex"
  9.                         
  10. ?
复制代码
本帖最后由 LiYanrui 于 2009-11-23 16:26 编辑

是换行符导致的,我再修修
8# cdacl

已解决,首帖附件。
返回列表