svn checkout http://foundry.supelec.fr/svn/luatex/trunk luatex-src
编译成功,则 luatex 程序位于 luatex-src/build/texk/web2c 目录。
将编译所得 luatex 复制到 luatex-plain/bin/linux 目录
从 luatex-src/source/texk/kpathsea 目录中得到mktexlsr,将其复制到 luatex-plain/bin/linux 目录。
mktexlsr 脚本需要 kpathsea 库中的三个程序 kpseaccess、kpsestat 和 kpsewhich 的支持。这三个程序可在编译 luatex 阶段自动生成,位于 luatex-src/build/texk/kpathsea 目录,将它们复制到 luatex-plain/bin/linux 目录。
kpathsea 库在查找文件时,会首先读取它的配置文件 texmf.cnf,而且它会从自己所在的目录为出发点,采用相对路径的方式找到 texmf.cnf。默认情况下,kpathsea 库会首先在它所在的目录中寻找 texmf.cnf 文件;若未能找到,它便搜索上一级目录;若依然未找到,则继续向上追溯一级目录搜索。
kpathsea 库在其当前目录及其上级目录搜索 texmf.cnf 文件时,它还会关注各层目录中的 texmf/web2c、texmf-local/web2c、share/texmf/web2c 以及 share/texmf-local/web2c 等子目录。
注意:texmf.cnf 文件的最后一行必须是空行!这应当与 kpathsea 库读取文件的方式有关。
生成 Plain TeX 格式可从 http://tug.ctan.org/tex-archive/fonts/cm/tfm/ 下载 tfm.zip 文件。 建 立 luatex-plain/texmf/fonts/tfm/public/cm 目录,将 tfm.zip 解包后所得的全部 cm*.tfm 文件复制到该目录。
从http://mirror.ctan.org/macros/plain/base/plain.tex下载 plain.tex 文件,然后建立 luatex-plain/texmf/tex/plain/base 目录,并将 plain.tex 存于该目录。
hyphen.tex 可从 http://ftp.ctan.org/tex-archive/macros/plain/base/ 下载,然后构建 luatex-plain/texmf/tex/generic/hyphen 目录,并将 hyphen.tex 置于其中
在拥有所需的 tfm 文件以及 hyphen.tex 文件的前提下,input plain 应当是不会出错的。
需要在 TeX 提示符后输入“dump”控制序列,从而产生 Plain TeX 格式文件——plain.fmt。
如果,在前面执行 `luatex --ini` 命令之时,再加上一个选项“--jobname=luatex”,那么所产生的 Plain TeX 格式文件即为 luatex.fmt。
当然,也可以将所生成的 plain.fmt 直接改名为 luatex.fmt。总之,我们需要的是 luatex.fmt。这样当使用 luatex 编译 tex 文档时,它会利用 kpathsea 库寻找 luatex.fmt 文件并加载。
现在,luatex 程序与 luatex.fmt 均位于 luatex-plain/bin/linux 目录,我们需要将 luatex.fmt 文件也像 plain.tex 文件那样,将其安置于 kpathsea 库可以自动找到的目录。
luatex.fmt 的存放位置
可以模仿 TeX Live,将 luatex.fmt 存放于 $TEXMFSYSVAR/web2c/luatex 目录中。
首先,建立 luatex-plain/texmf-var/web2c/luatex 目录,并将 luatex.fmt 置于其中。
字体与映射虽然 luatex 的一大特色是直接支持 TrueType、OpenType 这样的矢量字体,但是本文所讲述的只是 luatex 比较传统的字体使用方法,这 luatex 从 pdftex 那里继承而来的。
CM 字体原本是 Knuth 使用 Metafont 设计的西文字体,它是位图字体(pk 格式)。我们可以使用 OpenType 格式 的 lm 字体去作为替代字体。如果仅仅是为了成功编译上述的 test.tex 文件,根据错误信息,那么我们只需要拥有 cmr10 的替代字体即可。
首 先,我们可从 http://www.ctan.org/tex-archive/fonts/lm/fonts/opentype/public/lm/ 下载 lmroman10-regular.otf 文件,并构建 luatex-plain/texmf/fonts/opentype/lm 目录,将 lmroman10-regular.otf 字体文件置于其中。
然后,需要在 texmf.cnf 文件添加 OPENTYPEFONTS 变量的定义,使得 kpathsea 库可以找到 .otf 字体文件。更新后的 texmf.cnf 内容如下:
TEXMFMAIN = $SELFAUTOPARENT/texmf
TEXMFSYSVAR = $SELFAUTOPARENT/texmf-var
TEXMF = {!!$TEXMFMAIN,!!$TEXMFSYSVAR}
TEXMFDBS = $TEXMF
TEXFORMATS = .;$TEXMF/web2c/luatex
TEXINPUTS = .;$TEXMF/tex/{plain,generic}/{base,hyphen,luatex}//
TFMFONTS = .;$TEXMF/fonts/tfm//
OPENTYPEFONTS = .;$TEXMF/fonts/opentype//
继 而,需要构建 luatex-plain/texmf/fonts/map/pdftex/plain 目录,在其中建立 pdftex.map 文件。这个 .map 文件的作用是告诉 luatex 要使用一种字体去替换另一种字体。我们的目的是使用 lmroman10-regular.otf 替换 cmr10.pk,因此 pdftex.map 的内容如下:
cmr10 LMRoman10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmroman10-regular.otf
上述代码可以告诉 luatex:我要使用 lmroman10-regular.otf 字体,按照 lm-rep-cmrm.enc 文件定义的规则,替换 cmr10.pk 字体相应的字形。
为了让 luatex 在运行时通过 kpathsea 库发现 pdftex.map 文件的存在,需要在 texmf.cnf 文件中添加 TEXFONTMAPS 变量的定义。更新后的 texmf.cnf 文件内容如下:
TEXMFMAIN = $SELFAUTOPARENT/texmf
TEXMFSYSVAR = $SELFAUTOPARENT/texmf-var
TEXMF = {!!$TEXMFMAIN,!!$TEXMFSYSVAR}
TEXMFDBS = $TEXMF
TEXFORMATS = .;$TEXMF/web2c/luatex
TEXINPUTS = .;$TEXMF/tex/{plain,generic}/{base,hyphen,luatex}//
TEXFONTMAPS = .;$TEXMF/fonts/map/pdftex//
TFMFONTS = .;$TEXMF/fonts/tfm//
OPENTYPEFONTS = .;$TEXMF/fonts/opentype//
前 面提到,在使用 lmroman10-regular.otf 替换 cmr10.pk 时,需要 lm-rep-cmrm.enc 文件的支持,该文件可从 http://www.ctan.org/tex-archive/fonts/lm/fonts/enc/dvips/lm/ 下载,并构建 luatex-plain/texmf/fonts/enc/dvips/lm 目录,将下载的 lm-rep-cmrm.enc 文件存于其中。为了可让 kpathsea 库能够搜索到这个文件,我们依然需要孜孜不倦的修改 texmf.cnf 文件,向其中添加 ENCFONTS 变量的定义。更新后的 texmf.cnf 文件内容如下:
TEXMFMAIN = $SELFAUTOPARENT/texmf
TEXMFSYSVAR = $SELFAUTOPARENT/texmf-var
TEXMF = {!!$TEXMFMAIN,!!$TEXMFSYSVAR}
TEXMFDBS = $TEXMF
TEXFORMATS = .;$TEXMF/web2c/luatex
TEXINPUTS = .;$TEXMF/tex/{plain,generic}/{base,hyphen,luatex}//
TEXFONTMAPS = .;$TEXMF/fonts/map/pdftex//
ENCFONTS = .;$TEXMF/fonts/enc/dvips//
TFMFONTS = .;$TEXMF/fonts/tfm//
OPENTYPEFONTS = .;$TEXMF/fonts/opentype//
当做完上述准备工作后,使用 `mktexlsr` 命令刷新 TeX 目录结构。
让 luatex plain 输出 pdf“luatex plain 从零构建”文中所讲的 Plain TeX 格式是基于 Knuth 的 plain.tex 文件产生的。为了产生可以输出 pdf 的 Plain TeX 格式,我们需要重新构造一个 tex 文件,在其中添加一些 luatex 原语(luatex 提供的 TeX 基本控制序列),并打开它的 pdf 输出功能。
首先,建立 luatex-plain/texmf/tex/generic/luatex 目录,然后在该目录中存放 luatex-plain.tex 文件,其内容如下:
input plain
directlua { tex.enableprimitives('',tex.extraprimitives()) }
pdfoutput=1
dump
luatex-plain.tex 文件的第 2 行代码用于开启对 luatex 提供的 TeX 原语的访问权限,这样我们方可使用像 pdfoutput 这样的 luatex 原语。
然后,修改 texmf.cnf 文件,在 TEXINPUTS 变量中添加 luatex-plain.tex 的查找路径,如下:
TEXMFMAIN = $SELFAUTOPARENT/texmf
TEXMFSYSVAR = $SELFAUTOPARENT/texmf-var
TEXMF = {!!$TEXMFMAIN,!!$TEXMFSYSVAR}
TEXMFDBS = $TEXMF
TEXFORMATS = .;$TEXMF/web2c/luatex
TEXINPUTS = .;$TEXMF/tex/{plain,generic}/{base,hyphen,luatex}//
TFMFONTS = .;$TEXMF/fonts/tfm//
继而使用 mktexlsr 命令刷新 TeX 目录结构。
最后,使用 `luatex --ini --jobname=luatex luatex-plain` 命令重新生成 luatex.fmt 文件。
luatex 字体加载luatex 是借助 fontforge 库读取字体并获取字体相关信息,例如字体名称、字符数以及各个字形(glyph)的编码、宽度、高度与深度等信息,而早先的 TeX 引擎,例如 tex、pdftex 均是通过 .tfm 文件获取字形信息,.tfm 文件需由用户提供。
luatex 的字体表
传统的 TeX 引擎是通过 tfm 文件来解除对具体字体的依赖,这一点从“luatex plain 从零构建”文中产生 Plain TeX 格式时编便已有所体现。luatex 虽然不再需要 tfm 文件,但是它需要字体表。
只要我们构建出这样的字体表,并将其交给 luatex,那么 luatex 便会认为我们向它提供了一款字体,哪怕我们在字体表中施展一些诡计欺骗它。
Hans 的字体脚本
通过上面的三个示例,大致可了解一些 luatex 的字体加载方式,真正的让 luatex 支持各种字体的加载,我们最好是将 Hans Hagen 为 luatex/Plain TeX 用户所写的一些脚本拿过来用。
首先,可从 http://minimals.contextgarden.net/current/context/beta/tex/generic/context/ 下 载 luatex-basics.tex、luatex-fonts.tex、luatex-fonts.lua、luatex-fonts- merged.lua 四个文件,并将其存储于 luatex-plain/texmf/tex/generic/luatex 目录。
然后,修改 luatex-plain/texmf/tex/generic/luatex 目录已有的 luatex-plain.tex 文件,向其中添加所下载的 .tex 文件。修改后的 luatex-plain.tex 文件内容如下:
input plain
directlua {tex.enableprimitives('', tex.extraprimitives())}
pdfoutput=1
everyjob expandafter {%
theeveryjob
input luatex-basicsrelax
input luatex-fontsrelax
}
edeffmtversion{fmtversion+luatex}
dump
从 http://download.openpkg.org/components/versioned/fontforge/fontforge/cidmap/ 下载 Adobe-GB1-5.cidmap 文件(如果系统中装有 fontforge 包,可从 /usr/share/fontforge 目录中得到这一文件),构建 luatex-plain/texmf/fonts/cid/fontforge 目录,将 Adobe-GB1-5.cidmap 文件存于其中,并修改 texmf.cnf 文件,向其中添加 FONTCIDMAPS 变量的定义。修改后的 texmf.cnf 文件内容如下:
TEXMFMAIN = $SELFAUTOPARENT/texmf
TEXMFSYSVAR = $SELFAUTOPARENT/texmf-var
TEXMF = {!!$TEXMFMAIN,!!$TEXMFSYSVAR}
TEXMFDBS = $TEXMF
TEXFORMATS = .;$TEXMF/web2c/luatex
TEXINPUTS = .;$TEXMF/tex/{plain,generic}/{base,hyphen,luatex}//
TEXFONTMAPS = .;$TEXMF/fonts/map/pdftex//
ENCFONTS = .;$TEXMF/fonts/enc/dvips//
TFMFONTS = .;$TEXMF/fonts/tfm//
TTFONTS = .;$TEXMF/fonts/truetype//:$OSFONTDIR//
OPENTYPEFONTS = .;$TEXMF/fonts/opentype//:$OSFONTDIR//
FONTCIDMAPS = .;$TEXMF/fonts/cid//
继而,执行 `mktexlsr` 命令刷新 TeX 目录结构。
最后,使用 `luatex --ini --jobname=luatex --progname=luatex luatex-plain` 命令重新生成 luatex.fmt,并将其存放于 luatex-plain/texmf-var/web2c/luatex 目录。
建立 Cache之所以说 Hans 的脚本强大,是因为他的脚本除了支持各种字体的载入,而且还提供了字体信息的 Cache。在加载字体时,如果是首次加载,那么便使用 fontloader.open 和 fontloader.to_table 函数打开字体文件并转化为初始的字体信息表,进而可得到 luatex 字体表,然后 Hans 提供的 cache 机制会将所得 luatex 字体表序列化写入 texmf.cnf 文件中 TEXMFCACHE 变量所定义的位置保存起来。这样,当再次载入相同字体时,便可直接从 cache 得到 luatex 字体表了。
默认情况下,Hans 的字体脚本会将 cache 目录设置在所编译的 .tex 文件所在的目录,建议将其设定在 luatex-plain/texmf-cache 目录,步骤如下:
建立 luatex-plain/texmf-cache 目录;
修改 texmf.cnf 文件,修改后的内容如下:
TEXMFMAIN = $SELFAUTOPARENT/texmf
TEXMFSYSVAR = $SELFAUTOPARENT/texmf-var
TEXMF = {!!$TEXMFMAIN,!!$TEXMFSYSVAR}
TEXMFDBS = $TEXMF
TEXFORMATS = .;$TEXMF/web2c/luatex
TEXINPUTS = .;$TEXMF/tex/{plain,generic}/{base,hyphen,luatex}//
TEXFONTMAPS = .;$TEXMF/fonts/map/pdftex//
ENCFONTS = .;$TEXMF/fonts/enc/dvips//
TFMFONTS = .;$TEXMF/fonts/tfm//
TTFONTS = .;$TEXMF/fonts/truetype//:$OSFONTDIR//
OPENTYPEFONTS = .;$TEXMF/fonts/opentype//:$OSFONTDIR//
FONTCIDMAPS = .;$TEXMF/fonts/cid//
TEXMFCACHE = $SELFAUTOPARENT/texmf-cache
字体种类1.光栅字体(.FON)
光栅字体(Raster Font)是针对特定的显示分辨率以不同大小存储的位图,用于
Windows系统中屏幕上的菜单、按钮等处文字的显示。它并不是以矢量描述的,放大以后
会出现锯齿,只适合屏幕描述。不过它的显示速度非常快,所以作为系统字体而在
Windows中使用。
2.矢量字体
矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界
上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定
的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。
矢量字体主要包括 Type1 、 TrueType、OpenType等几类。 矢量字体又叫Outline font
(轮廓字体),通常使用贝塞尔曲线,绘图指令和数学公式进行绘制。这样可以在对字体
进行任意缩放的时候保持字体边缘依然光滑,字体色素不会丢失。
1.PostScript字体(.PFM) 这种字体基于另一种矢量语言(Adobe PostScript)的描
述,常用于PostScript打印机中,不过Windows并不直接支持这类字体,要在Windows使用
这类字体需要安装"Adobe Type Manger"(ATM)软件来进行协调。
2.TrueType字体(.TTF) 这是我们日常操作中接触得最多的一种类型的字体,其最
大的特点就是它是由一种数学模式来进行定义的基于轮廓技术的字体,这使得它们比基于
矢量的字体更容易处理,保证了屏幕与打印输出的一致性。同时,这类字体和矢量字体一
样可以随意缩放、旋转而不必担心会出现锯齿。
3.OpenType字体(.TTC) OpenType,是一种可缩放字型(scalable font)电脑字体
类型,采用PostScript格式,是美国微软公司与Adobe公司联合开发,用来替代TrueType
字型的新字型。这类字体的文件扩展名为.otf,类型代码是OTTO,现行标准为OpenType1.4。
OpenType最初发表于1996年,并在2000年之后出现大量字体。它源于微软公司的
TrueType Open字型,TrueType Open字型又源于TrueType字型。OpenType font包括了
Adobe CID-Keyed font技术。Adobe公司已经在2002年末将其字体库全部改用OpenType格
式。到2005年大概有一万多种OpenType字体,Adobe产品占了三分之一。