luatex plain 从零构建
svn checkout http://foundry.supelec.fr/svn/luatex/trunk luatex-src
編譯成功,則 luatex 程序位于 luatex-src/build/texk/web2c 目錄。
將編譯所得 luatex 復(fù)制到 luatex-plain/bin/linux 目錄
從 luatex-src/source/texk/kpathsea 目錄中得到mktexlsr,將其復(fù)制到 luatex-plain/bin/linux 目錄。
mktexlsr 腳本需要 kpathsea 庫(kù)中的三個(gè)程序 kpseaccess、kpsestat 和 kpsewhich 的支持。這三個(gè)程序可在編譯 luatex 階段自動(dòng)生成,位于 luatex-src/build/texk/kpathsea 目錄,將它們復(fù)制到 luatex-plain/bin/linux 目錄。
kpathsea 庫(kù)在查找文件時(shí),會(huì)首先讀取它的配置文件 texmf.cnf,而且它會(huì)從自己所在的目錄為出發(fā)點(diǎn),采用相對(duì)路徑的方式找到 texmf.cnf。默認(rèn)情況下,kpathsea 庫(kù)會(huì)首先在它所在的目錄中尋找 texmf.cnf 文件;若未能找到,它便搜索上一級(jí)目錄;若依然未找到,則繼續(xù)向上追溯一級(jí)目錄搜索。
kpathsea 庫(kù)在其當(dāng)前目錄及其上級(jí)目錄搜索 texmf.cnf 文件時(shí),它還會(huì)關(guān)注各層目錄中的 texmf/web2c、texmf-local/web2c、share/texmf/web2c 以及 share/texmf-local/web2c 等子目錄。
注意:texmf.cnf 文件的最后一行必須是空行!這應(yīng)當(dāng)與 kpathsea 庫(kù)讀取文件的方式有關(guān)。
生成 Plain TeX 格式可從 http://tug.ctan.org/tex-archive/fonts/cm/tfm/ 下載 tfm.zip 文件。 建 立 luatex-plain/texmf/fonts/tfm/public/cm 目錄,將 tfm.zip 解包后所得的全部 cm*.tfm 文件復(fù)制到該目錄。
從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/ 下載,然后構(gòu)建 luatex-plain/texmf/tex/generic/hyphen 目錄,并將 hyphen.tex 置于其中
在擁有所需的 tfm 文件以及 hyphen.tex 文件的前提下,input plain 應(yīng)當(dāng)是不會(huì)出錯(cuò)的。
需要在 TeX 提示符后輸入“dump”控制序列,從而產(chǎn)生 Plain TeX 格式文件——plain.fmt。
如果,在前面執(zhí)行 `luatex --ini` 命令之時(shí),再加上一個(gè)選項(xiàng)“--jobname=luatex”,那么所產(chǎn)生的 Plain TeX 格式文件即為 luatex.fmt。
當(dāng)然,也可以將所生成的 plain.fmt 直接改名為 luatex.fmt。總之,我們需要的是 luatex.fmt。這樣當(dāng)使用 luatex 編譯 tex 文檔時(shí),它會(huì)利用 kpathsea 庫(kù)尋找 luatex.fmt 文件并加載。
現(xiàn)在,luatex 程序與 luatex.fmt 均位于 luatex-plain/bin/linux 目錄,我們需要將 luatex.fmt 文件也像 plain.tex 文件那樣,將其安置于 kpathsea 庫(kù)可以自動(dòng)找到的目錄。
luatex.fmt 的存放位置
可以模仿 TeX Live,將 luatex.fmt 存放于 $TEXMFSYSVAR/web2c/luatex 目錄中。
首先,建立 luatex-plain/texmf-var/web2c/luatex 目錄,并將 luatex.fmt 置于其中。
字體與映射雖然 luatex 的一大特色是直接支持 TrueType、OpenType 這樣的矢量字體,但是本文所講述的只是 luatex 比較傳統(tǒng)的字體使用方法,這 luatex 從 pdftex 那里繼承而來(lái)的。
CM 字體原本是 Knuth 使用 Metafont 設(shè)計(jì)的西文字體,它是位圖字體(pk 格式)。我們可以使用 OpenType 格式 的 lm 字體去作為替代字體。如果僅僅是為了成功編譯上述的 test.tex 文件,根據(jù)錯(cuò)誤信息,那么我們只需要擁有 cmr10 的替代字體即可。
首 先,我們可從 http://www.ctan.org/tex-archive/fonts/lm/fonts/opentype/public/lm/ 下載 lmroman10-regular.otf 文件,并構(gòu)建 luatex-plain/texmf/fonts/opentype/lm 目錄,將 lmroman10-regular.otf 字體文件置于其中。
然后,需要在 texmf.cnf 文件添加 OPENTYPEFONTS 變量的定義,使得 kpathsea 庫(kù)可以找到 .otf 字體文件。更新后的 texmf.cnf 內(nèi)容如下:
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//
繼 而,需要構(gòu)建 luatex-plain/texmf/fonts/map/pdftex/plain 目錄,在其中建立 pdftex.map 文件。這個(gè) .map 文件的作用是告訴 luatex 要使用一種字體去替換另一種字體。我們的目的是使用 lmroman10-regular.otf 替換 cmr10.pk,因此 pdftex.map 的內(nèi)容如下:
cmr10 LMRoman10-Regular "enclmrepcmrm ReEncodeFont" <lm-rep-cmrm.enc <lmroman10-regular.otf
上述代碼可以告訴 luatex:我要使用 lmroman10-regular.otf 字體,按照 lm-rep-cmrm.enc 文件定義的規(guī)則,替換 cmr10.pk 字體相應(yīng)的字形。
為了讓 luatex 在運(yùn)行時(shí)通過(guò) kpathsea 庫(kù)發(fā)現(xiàn) pdftex.map 文件的存在,需要在 texmf.cnf 文件中添加 TEXFONTMAPS 變量的定義。更新后的 texmf.cnf 文件內(nèi)容如下:
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 時(shí),需要 lm-rep-cmrm.enc 文件的支持,該文件可從 http://www.ctan.org/tex-archive/fonts/lm/fonts/enc/dvips/lm/ 下載,并構(gòu)建 luatex-plain/texmf/fonts/enc/dvips/lm 目錄,將下載的 lm-rep-cmrm.enc 文件存于其中。為了可讓 kpathsea 庫(kù)能夠搜索到這個(gè)文件,我們依然需要孜孜不倦的修改 texmf.cnf 文件,向其中添加 ENCFONTS 變量的定義。更新后的 texmf.cnf 文件內(nèi)容如下:
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//
當(dāng)做完上述準(zhǔn)備工作后,使用 `mktexlsr` 命令刷新 TeX 目錄結(jié)構(gòu)。
讓 luatex plain 輸出 pdf“l(fā)uatex plain 從零構(gòu)建”文中所講的 Plain TeX 格式是基于 Knuth 的 plain.tex 文件產(chǎn)生的。為了產(chǎn)生可以輸出 pdf 的 Plain TeX 格式,我們需要重新構(gòu)造一個(gè) tex 文件,在其中添加一些 luatex 原語(yǔ)(luatex 提供的 TeX 基本控制序列),并打開它的 pdf 輸出功能。
首先,建立 luatex-plain/texmf/tex/generic/luatex 目錄,然后在該目錄中存放 luatex-plain.tex 文件,其內(nèi)容如下:
input plain
directlua { tex.enableprimitives('',tex.extraprimitives()) }
pdfoutput=1
dump
luatex-plain.tex 文件的第 2 行代碼用于開啟對(duì) luatex 提供的 TeX 原語(yǔ)的訪問(wèn)權(quán)限,這樣我們方可使用像 pdfoutput 這樣的 luatex 原語(yǔ)。
然后,修改 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 目錄結(jié)構(gòu)。
最后,使用 `luatex --ini --jobname=luatex luatex-plain` 命令重新生成 luatex.fmt 文件。
luatex 字體加載luatex 是借助 fontforge 庫(kù)讀取字體并獲取字體相關(guān)信息,例如字體名稱、字符數(shù)以及各個(gè)字形(glyph)的編碼、寬度、高度與深度等信息,而早先的 TeX 引擎,例如 tex、pdftex 均是通過(guò) .tfm 文件獲取字形信息,.tfm 文件需由用戶提供。
luatex 的字體表
傳統(tǒng)的 TeX 引擎是通過(guò) tfm 文件來(lái)解除對(duì)具體字體的依賴,這一點(diǎn)從“l(fā)uatex plain 從零構(gòu)建”文中產(chǎn)生 Plain TeX 格式時(shí)編便已有所體現(xiàn)。luatex 雖然不再需要 tfm 文件,但是它需要字體表。
只要我們構(gòu)建出這樣的字體表,并將其交給 luatex,那么 luatex 便會(huì)認(rèn)為我們向它提供了一款字體,哪怕我們?cè)谧煮w表中施展一些詭計(jì)欺騙它。
Hans 的字體腳本
通過(guò)上面的三個(gè)示例,大致可了解一些 luatex 的字體加載方式,真正的讓 luatex 支持各種字體的加載,我們最好是將 Hans Hagen 為 luatex/Plain TeX 用戶所寫的一些腳本拿過(guò)來(lái)用。
首先,可從 http://minimals.contextgarden.net/current/context/beta/tex/generic/context/ 下 載 luatex-basics.tex、luatex-fonts.tex、luatex-fonts.lua、luatex-fonts- merged.lua 四個(gè)文件,并將其存儲(chǔ)于 luatex-plain/texmf/tex/generic/luatex 目錄。
然后,修改 luatex-plain/texmf/tex/generic/luatex 目錄已有的 luatex-plain.tex 文件,向其中添加所下載的 .tex 文件。修改后的 luatex-plain.tex 文件內(nèi)容如下:
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 文件(如果系統(tǒng)中裝有 fontforge 包,可從 /usr/share/fontforge 目錄中得到這一文件),構(gòu)建 luatex-plain/texmf/fonts/cid/fontforge 目錄,將 Adobe-GB1-5.cidmap 文件存于其中,并修改 texmf.cnf 文件,向其中添加 FONTCIDMAPS 變量的定義。修改后的 texmf.cnf 文件內(nèi)容如下:
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//
繼而,執(zhí)行 `mktexlsr` 命令刷新 TeX 目錄結(jié)構(gòu)。
最后,使用 `luatex --ini --jobname=luatex --progname=luatex luatex-plain` 命令重新生成 luatex.fmt,并將其存放于 luatex-plain/texmf-var/web2c/luatex 目錄。
建立 Cache之所以說(shuō) Hans 的腳本強(qiáng)大,是因?yàn)樗哪_本除了支持各種字體的載入,而且還提供了字體信息的 Cache。在加載字體時(shí),如果是首次加載,那么便使用 fontloader.open 和 fontloader.to_table 函數(shù)打開字體文件并轉(zhuǎn)化為初始的字體信息表,進(jìn)而可得到 luatex 字體表,然后 Hans 提供的 cache 機(jī)制會(huì)將所得 luatex 字體表序列化寫入 texmf.cnf 文件中 TEXMFCACHE 變量所定義的位置保存起來(lái)。這樣,當(dāng)再次載入相同字體時(shí),便可直接從 cache 得到 luatex 字體表了。
默認(rèn)情況下,Hans 的字體腳本會(huì)將 cache 目錄設(shè)置在所編譯的 .tex 文件所在的目錄,建議將其設(shè)定在 luatex-plain/texmf-cache 目錄,步驟如下:
建立 luatex-plain/texmf-cache 目錄;
修改 texmf.cnf 文件,修改后的內(nèi)容如下:
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)是針對(duì)特定的顯示分辨率以不同大小存儲(chǔ)的位圖,用于
Windows系統(tǒng)中屏幕上的菜單、按鈕等處文字的顯示。它并不是以矢量描述的,放大以后
會(huì)出現(xiàn)鋸齒,只適合屏幕描述。不過(guò)它的顯示速度非常快,所以作為系統(tǒng)字體而在
Windows中使用。
2.矢量字體
矢量字體(Vector font)中每一個(gè)字形是通過(guò)數(shù)學(xué)曲線來(lái)描述的,它包含了字形邊界
上的關(guān)鍵點(diǎn),連線的導(dǎo)數(shù)信息等,字體的渲染引擎通過(guò)讀取這些數(shù)學(xué)矢量,然后進(jìn)行一定
的數(shù)學(xué)運(yùn)算來(lái)進(jìn)行渲染。這類字體的優(yōu)點(diǎn)是字體實(shí)際尺寸可以任意縮放而不變形、變色。
矢量字體主要包括 Type1 、 TrueType、OpenType等幾類。 矢量字體又叫Outline font
(輪廓字體),通常使用貝塞爾曲線,繪圖指令和數(shù)學(xué)公式進(jìn)行繪制。這樣可以在對(duì)字體
進(jìn)行任意縮放的時(shí)候保持字體邊緣依然光滑,字體色素不會(huì)丟失。
1.PostScript字體(.PFM) 這種字體基于另一種矢量語(yǔ)言(Adobe PostScript)的描
述,常用于PostScript打印機(jī)中,不過(guò)Windows并不直接支持這類字體,要在Windows使用
這類字體需要安裝"Adobe Type Manger"(ATM)軟件來(lái)進(jìn)行協(xié)調(diào)。
2.TrueType字體(.TTF) 這是我們?nèi)粘2僮髦薪佑|得最多的一種類型的字體,其最
大的特點(diǎn)就是它是由一種數(shù)學(xué)模式來(lái)進(jìn)行定義的基于輪廓技術(shù)的字體,這使得它們比基于
矢量的字體更容易處理,保證了屏幕與打印輸出的一致性。同時(shí),這類字體和矢量字體一
樣可以隨意縮放、旋轉(zhuǎn)而不必?fù)?dān)心會(huì)出現(xiàn)鋸齒。
3.OpenType字體(.TTC) OpenType,是一種可縮放字型(scalable font)電腦字體
類型,采用PostScript格式,是美國(guó)微軟公司與Adobe公司聯(lián)合開發(fā),用來(lái)替代TrueType
字型的新字型。這類字體的文件擴(kuò)展名為.otf,類型代碼是OTTO,現(xiàn)行標(biāo)準(zhǔn)為OpenType1.4。
OpenType最初發(fā)表于1996年,并在2000年之后出現(xiàn)大量字體。它源于微軟公司的
TrueType Open字型,TrueType Open字型又源于TrueType字型。OpenType font包括了
Adobe CID-Keyed font技術(shù)。Adobe公司已經(jīng)在2002年末將其字體庫(kù)全部改用OpenType格
式。到2005年大概有一萬(wàn)多種OpenType字體,Adobe產(chǎn)品占了三分之一。
轉(zhuǎn)載于:https://www.cnblogs.com/fengidri/archive/2012/01/07/2757453.html
總結(jié)
以上是生活随笔為你收集整理的luatex plain 从零构建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [恢]hdu 1865
- 下一篇: 模拟windows任务管理器列举系统进程