luatex plain 从零构建
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??傊?#xff0c;我們需要的是 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系統中屏幕上的菜單、按鈕等處文字的顯示。它并不是以矢量描述的,放大以后
會出現鋸齒,只適合屏幕描述。不過它的顯示速度非???#xff0c;所以作為系統字體而在
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產品占了三分之一。
轉載于:https://www.cnblogs.com/fengidri/archive/2012/01/07/2757453.html
總結
以上是生活随笔為你收集整理的luatex plain 从零构建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [恢]hdu 1865
- 下一篇: 限制不能使用最近三次的历史密码