Next Previous Contents

3. TrueType 字型 (少數 Windows 在行的事情)

因為在 Redmond 的那群傢伙非常關心他們軟體的外觀而不是內容,他們在 Windows 裡加上對 TrueType 字型的支援。當然,他們是從源起於 MacOS 中的 TrueType 中得到了這個主意。 Window 9x 和其他的 Windows 都內含 Arial,Times New Roman,和 Courier New。他們約等於 Helvetica,Times,和 Courier。TrueType 字型是能縮放的,所以它們在放大時很好看,而它們也被好好的調整(hint)過,在縮小的時候依然可讀。有許多的 Windows 應用程式附送好幾打的 TrueType 字型。先別急著把你的 Windows CD 拿去微波,得先拿到這些字型。

不幸的是,XFree86 3.x 並沒有內建支援 TrueType,所以你必須自己加入。然而,XFree86 4.x 則內建了 (請參考第 4 節)。這表示支援 TrueType 的字型伺服器和字型將會被安裝。但你並不會在各家的 distribution 中發現精美的 TrueType 字型。最可能的原因是現在並沒有以適當的 license 發行的精美字型。

3.1 取得 TrueType 字型

讓我們先處理字型。在各種 MS Windows 所附的 TrueType 字型應該都可以用。別忘記文字處理器和其他應用程式也都附有自己的字型。MacOS 的字型不能使用。若你已經把那片 CD 拿去微波,還有一些免費的 TrueType 字型可以下載 (請參考 6.2 節的連結)。

為了使用 TrueType 字型,這些字型必須能夠被字型伺服器讀取。這表示它們必須是在一個一直被掛載 (mount) 的檔案系統中。在雙作業系統 (dual boot system) 上,這也可以是一個 Windows 分割區。當然,這些字型也可以拷貝到 Linux 中。首先先變成超級使用者:

 # su -
 # mkdir -p /usr/local/share/fonts/ttfonts

現在切換到新的字型目錄下:

 # cd /usr/local/share/fonts/ttfonts

然後將字型加入這個目錄。不論你是從 Windows 系統中拷貝過來

 # cp /mnt/<path_to_fonts>/*ttf  .

或是從 Mircosoft 下載。這些字型是自解壓縮的 zip 檔。若你想在 Linux 下解壓縮,必須下載標示 'Windows 3.1' 的檔案。在 Linux 下以 Linux zip 解開

 # ls *exe | xargs -n 1 unzip -L

'-L' 的選項會將字名轉為小寫,這對於 xfsft 和 Redhat 的 xfs 是必要的。注意現在的 Linux zip 程式並不能處理 32 位元的 Win9x 字型壓縮檔。看起來似乎 Microsoft 不會再在這個網站上放入 16 bit 的 Arial, Courier 和 Times-Roman。或是你可以在 這裡 下載包含許多 MS TrueType 字型的 WebFonts RPM。它已經包含足夠的字型給 Netscape 和其他的網路瀏覽器使用了。

你必須在 X server 的 FontPath 中加入這個新的 TrueType 目錄。用你順手的文字編輯器加上適當的幾行:

FontPath        "/usr/local/share/fonts/ttfonts"
FontPath        "/usr/X11R6/lib/X11/fonts/misc:unscaled"
FontPath        "/usr/X11R6/lib/X11/fonts/100dpi:unscaled"
FontPath        "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
FontPath        "/usr/X11R6/lib/X11/fonts/Type1"
FontPath        "/usr/X11R6/lib/X11/fonts/Speedo"
FontPath        "/usr/X11R6/lib/X11/fonts/misc"
FontPath        "/usr/X11R6/lib/X11/fonts/100dpi"
FontPath        "/usr/X11R6/lib/X11/fonts/75dpi"

3.2 字型伺服器

現在有許多字型伺服器都可以使用: xfstt,xfsft,和 Redhat 自 xfsft 修改而來的 xfs。雖然這些名字看起來很像,但是它們卻是不同的套件。至少一個以上的套件應該已經包含於任何最近的 Linux distribution。而你也可能已經安裝了。

以前字型伺服器是用於在網路上提供字型。字型的資源可以存於一台機器上,其他的 client 可以在需要的時候讀取。但是它的發展者增加了新功能,如可以畫 TrueType 字型。(XFree86 4.x 已經包含這個功能,所以若只是要提供 TrueType 支援的話,並不需要另外的字型伺服器)。

xfstt

一個這樣的字型伺服器是 xfstt。它在設計上就有考慮到 TrueType 字型。

安裝

xfstt 非常容易安裝和設定。若你尚未安裝的話,必須從網站上下載 tarball 或是找找你的 CD。最新的版本是在 http://metalab.unc.edu/pub/Linux/X11/fonts/

有了 tarball 後,把它解開:

 $ tar -zxvf Xfstt-*tgz

然後編譯和安裝它。INSTALL 檔有簡單的說明。但是其實是不用花什麼腦筋,只要在 xfstt 的目錄下,輸入下面的指令即可:

 # make
 # make install

鍵入下面的指令來啟動 xfstt:

 # xfstt --sync              # 更新 xfstt 的字型資料庫
 # xfstt &                # 在背景執行 xfstt

xfstt 應該要比 X server 更早啟動。一旦這樣執行無誤,你可以在 /etc/rc.d/rc.local 或是適當的起始檔中加入上面這一行。然後鍵入:

 $ xset +fp unix/:7100       # 知會 X 有關 xfstt 和到那裡去找字型

或是在你的 XF86Config 檔中加入下面的指令,知會 X 有關於字型伺服器。當 FontPath 的位置和內容有改變的時候,重新執行 xfstt --sync

FontPath "unix/:7101"

調整預設字型的大小

若你的 TrueType 字型顯得相當小,下面的指令可能有幫助。

在 X server 命令列加上 -dpi (請參考第 3 章)。

使用 --res 來告訴 xfstt 增加預設的解析度。用下面的指令

 # xfstt --res 120

Redhat 的 xfs

就如同 Redhat Linux 6.0 一般,架構在 Redhat 上的 distribution (如 Mandrake 等) 已經包含了一個特別修正的 xfs 和修正過的 X servers。Redhat 的 xfs 包含了 xfsft 的修正檔,而這些修正檔則是架構在 FreeType Font library。Redhat 的 xfs 提供與 xfstt 類似的功能。它不只能處理 TrueType 和 Type 1 字型,也可以對付原本的 X 字型。

若是你使用架構於 Redhat 的 distribution,xfs 應該已經安裝好了。若沒有,它是在 XFree86-xfs*rpm 中。要想確定它是預設執行的服務,可以用 ntsysv 或:

 # chkconfig --add xfs

現在 xfs 就會在每一次開機的時候啟動。

設定 xfs 的 FontPath

在 Redhat 的預設安裝中,xfs 是經由 Unix Domain Socket 提供字型。我們必須告訴 X server 到那裡去找 xfs 和字型。在 /etc/X11/XF86Config 中的 FontPath 一定要包含:

FontPath   "unix/:-1"

至少預設的設置是如此。這是一個 xfs 會去 listen 的 socket。你也可以加上另外的 FontPath,但是它們必須由 X server 來處理,而不是 xfs。安裝新的 Redhat 6.x 應該就已經設定好了,但是若你是從舊的版本升級上來,必須自己動手修改。

xfs 在 /etc/X11/fs/config 中存有自己的 FontPath。這裡就是它找字型的地方。在 XF86Config 檔中,它放在 X server 的 FontPath 上面。你可以用文字編輯器加入新的路徑,或是用 chkfontpath 命令:

 # chkfontpath --add /usr/local/share/fonts/ttfonts

該 FontPath 在執行 chkfontpath 命令前必須要先存在。在 /etc/X11/fs/config 中相關部份看起來應該像是:

catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,
            /usr/X11R6/lib/X11/fonts/100dpi:unscaled,
            /usr/X11R6/lib/X11/fonts/75dpi:unscaled,
            /usr/X11R6/lib/X11/fonts/Type1,
            /usr/X11R6/lib/X11/fonts/Speedo,
            /usr/X11R6/lib/X11/fonts/misc,
            /usr/X11R6/lib/X11/fonts/100dpi,
            /usr/X11R6/lib/X11/fonts/75dpi,
            /usr/local/share/fonts/ttfonts

準備好字型

在真正使用 TrueType 字型前還有一些事情要作。xfs 需要一些事情按照規矩來。首先,所有的字名都必須是小寫。第二,字名裡不能有空白。然後,我們還要產生一些檔案才行。

先成為超級使用者,然後到 TrueType 字型的目錄下:

 # su -
 # cd /usr/local/share/fonts/ttfonts

若是有小寫的字名,你可以使用下面的 script 將所有的字名轉為小寫:

 #!/bin/sh
 #
 ## -------- convert upper to lower case ---------
 
 ls * | while read f
  do
    if [ -f $f ]; then
      if [ "$f" != "`echo \"$f\" | tr A-Z a-z`" ]; then
       #Note that 'This' will overwrite 'this'!
       mv -iv "$f" "`echo \"$f\" | tr A-Z a-z`"
      fi
    fi
  done

 ## eof

注意標點符號 -- 反引號 (backquotes) 很重要! 它也將字名中的空白移除。當 TrueType 字型適當被安裝後,你必須要產生 fonts.dirfonts.scale 檔。下面的命令可以做到:

 # ttmkfdir -o fonts.scale
 # mkfontdir

現在你的 TrueType 字型目錄中應該有 fonts.dirfonts.scale 檔。ttmkfdir 是在 Freetype 的 RPM 裡,而且它必須在 mkfontdir 前執行。這些命令不見得每次都會回報錯誤,所以要再驗證的確產生了檔案,且不是空檔:

 $ ls -l fonts.*
  -rw-r--r--  1 root   root   11657 Aug 17 10:31 fonts.dir
  -rw-r--r--  1 root   root   11657 Aug 17 10:31 fonts.scale

若你遇到問題,試試在 ttmkfdir 中加上 - m 的選項。這會放棄檔案中不正確的字元。設定一個數字,如 50 或是 100 (ttmkfdir -m 50) 。檔案本身是文字檔。看一看:

 $ less  fonts.dir
  114
  webdings.ttf  -microsoft-Webdings-medium-r-normal--0-0-0-0-p-0-microsoft-symbol
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-ascii-0
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-fcd8859-15
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-iso8859-15
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-iso8859-9
  verdanaz.ttf  -microsoft-Verdana-bold-i-normal--0-0-0-0-p-0-iso8859-1
 [...]

接著,更新 xfs (在 XFree86 4.x 或許不用) 和你 X server 的 FontPath:

 # /etc/rc.d/init.d/xfs restart
 $ xset +fp /usr/local/share/fonts/ttfonts
 $ xset fp rehash

當你加入或移除新的字型時,重新執行頭尾這兩個命令。xset +fp 只有在增加新的字型目錄時才需執行。

現在應該就沒問題了。你可以檢查 X 可以使用的字型:

$ xlsfonts | less

或是再用 xfontselgfontsel 來檢查。若在 xlsfonts 中可以看到,則 X 可以使用,反之亦然。若沒有出現,以 Ctrl-Alt-BS 重新啟動 X。

3.3 xfsft

xfsft 是由 Juliusz Chroboczek 所寫的 TrueType 解決方案。xfsft 是架構在 Mark Leisher 等人所寫的 FreeType font library。它基本上是一個 XFree86 xfs 再加上相關函式庫的修補檔 -- xfs + ft。Redhat 的 xfs 基本上是 xfsft 再加上一些小小的修正。而 Free86 4.x 也包含了同為 Juliusz 所寫的 freetype 字型模組(font module)。它是 XFree86 4.x 的 TrueType 解決方案中的一個。

要想編譯 xfsft 除了 xfsft 本身外,至少還要一些 XFree86 的原始檔,所以不適合心臟不夠強壯的人。編譯和設定 xfsft 的說明已經在 tarball 中,所以在這裡我不打算詳細敘述。他很直接。在 xfsft 的網頁 (見上面) 上有一些可執行檔的連結。

注意你必須產生 fonts.scalefonts.dir 檔給 xfsft。fonts.scale 可以手動產生,或是用 ttmkfdir 程式。它並未包含於 xfsft,但是你可以在 這裡 或許多 Linux 的網站上抓到。Redhat 在 Freetype 的 RPM 裡包含了這個程式。

你也會需要一個設定檔。下面是個例子:


-----------------------------------------------------

clone-self = off
use-syslog = off

client-limit = 20

catalogue = /usr/local/share/font/ttfonts

error-file = /home/jec/fonts/xfs.errors

# in decipoints
default-point-size = 120

# x,y
default-resolutions = 100,100,75,75

-----------------------------------------------------

然後執行 xfsft:

# xfs -port 7100 -config /path/to/your/config/file &

你可以在 X server 的 FontPath 中加上 xfsft:

$ xset +fp tcp/localhost:7100

若一切順利的話,你可以在 XF86Config 中加上這個 FontPath

3.4 fonts.alias 檔

fonts.alias 是另一個可以調整如何處理字型的設定檔。就如同 fonts.scalefonts.dir 一般,fonts.alias 也必須和字型放在同一個目錄下。它雖然不是必要的,但是有的話的確解決了某些可能發生問題。下面是一個摘自 Redhat 系統中 /usr/X11R6/lib/X11/fonts/misc/fonts.alias 第一行的例子:

 fixed    -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso8859-1

這裡 fixed 就是化身(alias)。每次 fixed 被呼叫時,我們事實上所得到的是第二列的字型定義。字太小了嗎? 只要改字型定義即可 (警告:至少在 Redhat 中,這個檔案很重要)。相同的原則可以應用到所有的字型,包含 TrueType 字。事實上,若你沒有 TrueType,你可以用這個技巧將 Type 1 或類似的字型化身為 TrueType。

在某些無法妥善處理自 fonts.scale 提供的資料的應用程式中,fonts.alias 就顯得相當重要。其中最著名的就是 Netscape。若沒有 fonts.alias,你會發現 Netscape 只能顯示現有 0 到 12 點的字。或許你也發現若在 Preferences 中指定另一種點數再配合上 scalable font 選項,Netscape 將無法存下這個設定。真令人厭煩! 所以我們需要這個檔案。下面是取自一個 fonts.scale 檔:

 arial.ttf   -monotype-Arial-medium-r-normal--0-0-0-0-p-0-ascii-0
 arial.ttf   -monotype-Arial-medium-r-normal--0-0-0-0-p-0-fcd8859-15
 arial.ttf   -monotype-Arial-medium-r-normal--0-0-0-0-p-0-iso8859-15
 arial.ttf   -monotype-Arial-medium-r-normal--0-0-0-0-p-0-iso8859-1

因為這些字是可以縮放的,所以並沒有預設的點數。舉 Arial 來說,我們必須產生我們自己的 fonts.alias ,如下:


 -monotype-Arial-medium-r-normal--6-60-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--9-90-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--7-70-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--9-90-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--8-80-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--10-100-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--9-90-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--11-110-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--10-100-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--12-120-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--11-110-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--12-120-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--12-120-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--12-120-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--13-130-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--13-130-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--14-140-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--14-140-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--15-150-0-0-p-0-iso8859-1 \
             -monotype-Arial-medium-r-normal--15-150-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--18-180-0-0-p-0-iso8859-1 \
            -monotype-Arial-medium-r-normal--18-180-75-75-p-0-iso8859-1

 -monotype-Arial-medium-r-normal--24-240-0-0-p-0-iso8859-1 \
            -monotype-Arial-medium-r-normal--24-240-75-75-p-0-iso8859-1

(請注意我們將原本是一行的寫成兩行以增加可讀性)。這兩列其實應該放在同一行,用一個以上的空白來區分,而且中間沒有 "\" 符號。這樣做了之後就會讓 Netscape 跑得很順。你可能也發現在前面幾行裡,第一列和第二列的點數並不相同。第一項的第一列是'6',但是在第二列卻化身為'9',所以是 9 點字。這是為了解決在 Netscape 裡天殺的小字而故意改的。你可依照你的喜好,解析度和眼力來調整。

這個檔案可以手動產生,或是用神奇的 sed 和 awk script。 這裡 有一個討論這檔案和其他字型相關的主題在 Kristin Aanestad 的網站上。那裡也有一個可以重複自動產生 fonts.alias 檔的 python script。感謝 Kristin,他的努力和見解啟發了這一節。


Next Previous Contents