日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

luatex plain 从零构建

發布時間:2024/4/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 luatex plain 从零构建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://garfileo.is-programmer.com/2010/9/23/luatex-plain.21484.html http://garfileo.is-programmer.com/2010/9/24/luatex-pdfoutput.21510.html http://garfileo.is-programmer.com/2010/9/27/luatex-fonts.21558.html 為什么要從零開始構建呢?我認為這是一個很好的理解和掌握luatex的機會,對于如我這樣的人,是很有意思的事,但是第一次做的時候可不是一件簡 單的事件,這個過程是比較痛苦的,你要從這中間學到東西,就一定要花一些時間。這三篇日志是對于這個工作的很好的講解。我這里是我看這三篇日志學習的一個 筆記,方便我日后的回顧,同時也是一個整理的過程。 昨天自己構建了一個luatex的環境,學會了許多tex的知識 在這里感謝# emerge -e world的作者,沒有你的工作,我可能還要在這上面花很多時間,走好多彎路。 從 luatex 的 svn 倉庫中遷出最新的源碼

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 从零构建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。