fonts.conf 中文手冊

FONTS-CONF(5)                                                                                   FONTS-CONF(5)


名稱
    fonts.conf -- 字體配置文件


文件概要
    /etc/fonts/fonts.conf
    /etc/fonts/fonts.dtd
    /etc/fonts/conf.d/
    $XDG_CONFIG_HOME/fontconfig/conf.d/
    $XDG_CONFIG_HOME/fontconfig/fonts.conf
    ~/.fonts.conf.d/
    ~/.fonts.conf


描述
    Fontconfig 是一個字體配置函數庫,它既提供全局範圍的配置,也容許每一個用戶進行個性化的配置,應用程序能夠經過它訪問字體。


功能概覽
    Fontconfig 由兩個模塊組成:
    (1)配置模塊,用於解析XML格式的配置文件;
    (2)匹配模塊,根據應用程序請求的字體模式(pattern),返回最匹配的字體。


    字體配置
        配置模塊由如下三部分組成:
        (1)保存配置信息的 FcConfig 數據類型、(2)解析XML文本的 libexpat 庫、(3)提取配置信息的 FcConfigParse 函數。
        其中,FcConfigParse 函數的做用是將XML格式的配置文件中的數據提取出來,填充到數據類型爲 FcConfig 的變量中。
        從外部來看,配置 Fontconfig 庫,就是編寫一個有效的XML配置文件並將其交給 FcConfigParse 函數處理。

        這樣作的目的是爲了讓字體的配置變得相對靜態,而且儘量普遍地在多個應用程序之間共享。
        這樣,在應用程序之間傳遞字體名稱(見後文的"Font Name")時,能夠得到一致的字體選擇。
        而選用XML做爲配置文件的格式,是由於它既便於外部程序編輯、又有嚴謹的結構和語法。

        字體的配置(其實就是<match target="scan">)與字體的匹配(matching)是兩個相互獨立的部分。
        由於某些應用程序但願使用其自身特有的字體匹配方式,它們只須要經過 Fontconfig 庫得到已有的字體列表,便可執行獨立的匹配操做。
        這種將配置與匹配分離的作法能夠將全部應用程序的字體配置集中到一處。集中的字體配置能夠簡化和標準化字體的安裝和個性化設置。


    字體屬性
        雖然字體模式(pattern)理論上能夠包含任意屬性,但仍是有一些約定俗成的屬性及其類型。
        Fontconfig 利用其中的一些屬性來作字體匹配與補全。其餘的屬性則被用於爲應用程序的渲染機制提供輔助信息。
        [說明]所謂"補全"是指:當應用程序提交的字體模式缺乏某些屬性時,Fontconfig 會經過其內置的推測規則"補全"這些屬性。

        屬性(Property)   類型    描述[以"微軟雅黑粗體"爲例,將其對應的屬性值放於{}中]
        --------------------------------------------------------------
        family          String   字族名稱{"Microsoft YaHei" "微軟雅黑"}
        familylang      String   每一個字族名稱所對應的語言{"en" "zh-cn"}
        style           String   字體風格名稱(會覆蓋slant與weight){"Bold" "Félkövér" "Полужирный" ...}
        stylelang       String   每一個字體風格名稱所對應的語言{"en" "hu" "ru" ...}
        fullname        String   字體全名(一般包含style){"Microsoft YaHei Bold" "微軟雅黑 Bold" ...}
        fullnamelang    String   每一個字體全名所對應的語言{"en" "zh-cn" ...}
        slant           Int      傾斜度{0}。分爲:Italic(100,斜體), oblique(110,合成斜體), roman(0,正體)
        weight          Int      粗細程度{200},從0-210,由最細到最粗。例如:light(50,細), regular(80,通常), medium(100,中等), bold(200,粗)
        width           Int      寬度{100},從50-200,由最窄到最寬。例如:condensed(75,壓縮), normal(100,正常), expanded(125,加寬)
        size            Double   磅大小(point size),單位是絕對大小的"磅"(=1/72英尺)。[默認值是"12"]
        pixelsize       Double   像素大小(pixel size),單位是顯示屏上的"像素"。[pixelsize = (size*scale*dpi)/72]
        aspect          Double   在微調(hinting)前將字形(glyph)水平拉寬的倍數。
        spacing         Int      字符間距。分爲:proportional(0,變寬), dual(90,雙寬), mono(100,等寬), charcell(110,字符單元)
        foundry         String   字體制造商名稱{"microsoft"}
        antialias       Bool     渲染字形(glyph)時是否開啓抗鋸齒功能[建議對矢量字體設爲"true"]
        hinting         Bool     渲染字形(glyph)時是否開啓微調功能(包括內嵌微調與自動微調)[建議對矢量字體設爲"true"]
        autohint        Bool     "true"表示只使用自動微調;"false"表示優先使用內嵌微調,但對於沒有內嵌微調的字體仍會使用自動微調。[建議設爲"false"]
        hintstyle       Int      微調的程度(同時做用於內嵌微調與自動微調)。分爲:none(0,關閉), slight(1,輕度), medium(2,中度), full(3,徹底)
        verticallayout  Bool     是否採用豎直排版
        globaladvance   Bool     是否使用字體提供的全局間距值(即將被廢棄)
        file            String   字體文件的名稱
        index           Int      字體文件內該字體的索引號,由"0"開始計數。
        ftface          FT_Face  使用指定的 Freetype face 對象
        rasterizer      String   使用哪一種渲染引擎(rasterizer)(即將被廢棄)
        outline         Bool     字形(glyph)是否具備輪廓線{True}
        scalable        Bool     字形(glyph)是否能夠縮放{True}
        scale           Double   磅->像素(point->pixel)的縮放係數[默認值是"1"]
        dpi             Double   目標dpi(像素/英寸)值
        rgba            Int      LCD子像素的排列順序。分爲:unknown(0,未知), rgb(1), bgr(2), vrgb(3), vbgr(4), none(5,無子像素)。
        lcdfilter       Int      LCD filter 的風格
        minspace        Bool     是否消除行間距(也就是使用最小行間距)
        charset         CharSet  字體所支持的Unicode字符的列表{太長,省略}
        lang            String   字體所支持的RFC-3066語言的列表{"aa|af|av|ay|...|zh-cn|zh-sg|zu|..."}
        fontversion     Int      字體的版本號{401080}
        capability      String   字體的排版功能列表{"otlayout:hani"}
        embeddedbitmap  Bool     是否使用字體中內嵌的點陣字形
        embolden        Bool     字形渲染引擎(rasterizer)是否應該以合成的方式加粗[例如在偏移1像素的地方重繪一次,形成粗體的假象]
        fontfeatures    String   要開啓的OpenType特性標記(feature tag)列表
        prgname         String   正在運行的程序的名稱

        [提示1]有關 Int 類型的詳細說明,能夠參考下面對<const>單元的說明。
        [提示2]能夠用 fc-query /path/to/foo.ttf 查看字體的屬性


    字體匹配
        Fontconfig 將接收到的字體模板(pattern)和系統中全部可用字體逐一對比,計算二者的差距(distance),差距最小的字體將被選中。
        這樣能夠確保在任什麼時候候都能返回一個字體,但沒法保證所返回的字體必定與模板的要求徹底吻合。

        要進行字體匹配,應用程序必須首先建立一個字體模板,並在其中包含所指望的字體的全部屬性。
        模板中的每一個屬性均可以包含按照優先級排列的多個值:越靠前的值,優先級越高。
        也就是說,若是現有字體中有兩個字體分別匹配同一個屬性的兩個值,那麼匹配較前的值的字體被認爲"差距更小",或者說"更爲接近"。

        在真正開始匹配字體以前,Fontconfig 會首先按照配置文件的要求(一系列<match target="pattern">配置塊),
        對應用程序建立的字體模板進行第一次修改。修改的過程包括<test>與<edit>兩個步驟:
        首先用一系列<test>指令進行匹配,而後再用一系列<edit>指令進行修改,而<test>與<edit>的執行順序就是它們在配置文件中出現的順序。
        一樣,每一個<match target="pattern">配置塊也會按照它們在配置文件中出現的順序依次執行。

        完成對字體模板的第一次修改以後,Fontconfig 將會繼續對其執行一系列默認的替換操做,從而獲得一組規範化的屬性(包含了所有要素)。
        這樣就能夠避免底層的渲染程序一直爲各類未指定的屬性提供默認值。

        字體模板通過第一次修改與規範化兩個步驟以後,如今終於能夠用來和系統中的字體進行匹配了。
        模板和系統中每一個字體的差距(distance)經過如下屬性進行計算(按照優先級排序,屬性越靠前,優先級越高):
        foundry, charset, family, lang, spacing, pixelsize, style, slant, weight, antialias, rasterizer, outline

        上述規則中有一個特例須要特別注意:字族名稱(family)分爲強(strong)和弱(weak)兩種不一樣的綁定(binding)。
        強字族名稱比語言屬性(lang)的優先級要高,而弱字族名稱則比語言屬性(lang)的優先級要低。

        [譯者注]強綁定(s)與弱綁定(w)能夠當作是塗在family列表中每一個字族名稱上的顏色。在 Fontconfig 最初接收到的字體模板中,
        family列表中的每一項初始顏色大可能是(s)[也可能有少部分(w)],可是通過第一次修改(也就是一系列<edit>與<alias>)以後,
        family列表的不一樣位置可能會被插入不一樣顏色的項(默認爲'w'),同時原有的項也可能在替換時被改變顏色(默認爲'w'),
        甚至某些項還可能會被刪除,最後就變成了一個兩種顏色混雜的family列表。
        舉例來講,假定原始的family列表是:A(s),B(s),C(s),D(s),E(s),F(s),G(s),H(w);通過第一次修改以後,
        可能會變成(大小寫變化表示替換):1(w),A(s),2(w),b(w),3(s),4(s),5(w),D(w),6(s),e(s),7(w),F(s),8(w),G(s),H(w),9(s);
        其中(s)顏色的字族名稱的優先級高於語言屬性(lang),而(w)顏色的字族名稱的優先級則低於語言屬性(lang)。
        若是假定"lang=xx",而且僅有 b,G,H,4,5,8 項的lang屬性中含有"xx",而其餘項的lang屬性中都不含有"xx",
        那麼綜合"lang=xx"因素以後,family列表中每一項的實際優先級將變成:
        A(s),3(s),4(s),6(s),e(s),F(s),G(s),9(s),  b(w),5(w),8(w),H(w),  1(w),2(w),D(w),7(w)

        若是字體模板中出現字體自己所沒有的屬性,那麼這些屬性將會被按原樣保留。
        這樣就能夠確保向字體渲染引擎傳遞的渲染指令和其它數據,不會受到前述的修改與規範化兩個步驟的干擾。

        通過規範化以後的字體模板,將被按照配置文件的要求(一系列<match target="font">配置塊)進行第二次修改。
        修改規則與第一次修改徹底相同。最終,通過"第一次修改-規範化-第二次修改"處理的字體模板將會被返回給應用程序。

        最終返回的字體模板已經包含了充足的字體定位和渲染信息(包括文件名、像素大小以及其餘各類渲染數據)。
        因爲不包含任何專屬於 FreeType 庫的信息,因此應用程序能夠自由選擇渲染引擎,甚至直接訪問字體文件。

        如前所述,對字體模板的修改其實是分兩次進行的,由於本質上就須要有兩個不一樣操做:
        第一次修改決定了如何選取字體:主要是修正字族名稱,以及添加合適的默認值。
        第二次修改決定了如何渲染已選定的字體:這個步驟必須做用在已選定的字體上,而不能做用在原始的字體模板上。


    字體名稱(注意,是"Font Name"而不是"Family Name"[字族名稱])
        Fontconfig 爲字體模板(pattern)規定了一種文本格式,這種格式被稱爲"Font Name"(字體名稱)。
        它既是 Fontconfig 接受的格式,也是 Fontconfig 返回格式。
        這種格式由三個部分組成:(1)字族名稱列表,(2)磅大小列表,(3)附加的屬性值列表。具體以下:

            <families>-<point sizes>:<name1>=<values1>:<name2>=<values2>...

        屬性的名稱(name)不須要包含任何字族名稱(families)或者磅大小(point sizes)。
        若是屬性值(values)是一個列表,那麼必須用逗號分隔其中的每一個項。
        此外,還有一些符號常量能夠同時指定屬性的名稱和值。下面是一些例子:

        字體名稱                     含義
        ----------------------------------------------------------
        Times-12                     12 磅大小的 Times 正體(Roman)
        Times-12:bold                12 磅大小的 Times 粗體(Bold)
        Courier:italic               默認大小的 Courier 斜體(Italic)
        Monospace:matrix=1 .1 0 1    採用合成斜體(obliquing)的用戶首選的等寬字體
                                     [注]因爲"matrix"不是字體屬性,因此"matrix=1 .1 0 1"會原封不動的返回給應用程序。

        字族名稱(family)中的 '\', '-', ':', ',' 字符必需要使用'\'進行轉義。
        相似的,屬性值(values)中的 '\', '=', '_', ':', ',' 也必需要使用'\'進行轉義。


調試
    爲了幫助診斷字體和應用的各類問題,fontconfig 內置了許多調試功能。這些調試功能能夠經過 FC_DEBUG 環境變量進行控制。
    這個環境變量是個整數值,它的每一個位都對應着一類調試信息。具體以下:

      Name         Value    Meaning
      ---------------------------------------------------------
      MATCH            1    顯示字體匹配的簡要信息
      MATCHV           2    顯示字體匹配的擴展信息
      EDIT             4    監視 match/test/edit 的執行
      FONTSET          8    在啓動時跟蹤字體信息的加載
      CACHE           16    顯示字體緩存變化的簡要信息
      CACHEV          32    顯示字體緩存變化的擴展信息
      PARSE           64    (已廢棄)
      SCAN           128    顯示掃描字體文件並建立緩存的過程
      SCANV          256    顯示掃描字體文件的詳細信息
      MEMORY         512    監視 fontconfig 的內存使用量
      CONFIG        1024    監視加載了哪些配置文件
      LANGSET       2048    顯示用來建立 lang 的字符集
      OBJTYPES      4096    顯示值類型檢查失敗的消息

    將你指望看到的調試信息類別所對應的 Value 值相加,而後賦給 FC_DEBUG 環境變量,再運行應用程序就能夠在 stdout 上看到調試信息了。
    [例子]假如你想查看'Courier,mono'的匹配過程,能夠在命令行上運行: FC_DEBUG=5 fc-match -s 'Courier,mono'


語言標記(Lang Tag)
    數據庫中的每種字體都包含一個它所支持的語言的列表。
    該列表是經過比較該字體的 Unicode 覆蓋範圍和每種語言的正字法(orthography,界定了每種語言的字符範圍)以後計算出來的。
    語言的標記符合 RFC-3066 規範,形如"語言[-國家]"(中括號表示能夠省略)。
    "語言"部分是一個符合 ISO 639 規範的語言標記,而"國家"部分是一個符合 ISO 3166 規範的國家代碼。

    Fontconfig 內置了多種語言的正字法。除非從新編譯函數庫,不然沒法添加新的正字法。
    Fontconfig 目前支持 ISO639-1 命名的139種語言中的122種,以及 ISO 639-2 中141種雙字母編碼的語言和另外30種三字母編碼的語言。
    對於那些同時具有雙字母編碼與三字母編碼的語言,僅提供雙字母編碼標記。

    對於那些在不一樣地區分別使用不一樣字符集的語言,fontconfig 會針對每一個不一樣的地區使用不一樣的正字法。
    例如:阿塞拜疆語,庫爾德語,普什圖語,提格里尼亞語,漢語。


配置文件的格式
    fontconfig 的配置文件以XML格式存儲。XML格式的優勢是易於外部配置工具的編輯,同時又擁有嚴謹的語法結構。
    因爲XML文件是純文本文件,專家級的用戶還能夠直接用文本編輯器處理它們。

    Fontconfig 文檔類型定義在外部實體"fonts.dtd"中,該文件一般位於默認的字體設置目錄(/etc/fonts)。
    每一個配置文件必須包含以下結構:

	<?xml version="1.0"?>
	<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
	<fontconfig>
	...
	</fontconfig>


    <fontconfig>
        這是字體配置的頂層單元,能夠包含0或1個 <config>, <selectfont> 單元,
        以及任意數量的 <dir>, <cachedir>, <include>, <match>, <alias> 單元。


    <dir prefix="default">
        這個單元包含一個目錄名稱,Fontconfig 將會掃描其中的字體文件,而後將找到的字體添加到系統的可用字體列表中。
        若是將'prefix'設爲"xdg",那麼環境變量 XDG_DATA_HOME 的值將會被做爲前綴添加到路徑的頭部。
        詳情參見"XDG Base Directory Specification"。


    <cachedir prefix="default">
        這個單元包含一個目錄名稱(以'~'開頭則表示位於用戶的家目錄中),用於保存字體屬性的緩存(爲了加速以後的讀取)。
        默認值是"$XDG_CACHE_HOME/fontconfig"。詳情參見"XDG Base Directory Specification"。
        若是將'prefix'設爲"xdg",那麼環境變量 XDG_CACHE_HOME 的值將會被做爲前綴添加到路徑的頭部。
        若是配置文件中包含多個<cachedir>單元,那麼在讀取緩存時,將會按順序依次搜索,而在寫入緩存時,則僅寫入第一個有寫入權限的目錄。
        緩存文件的名字遵循"<hash value>-<architecture>.cache-<version>"格式,其中的<version>是字體配置文件的版本號(目前是"3")。


    <include ignore_missing="no" prefix="default">
        這個單元包含一個額外的配置文件或目錄(以'~'開頭則表示位於用戶的家目錄中)。
        若是是目錄,那麼該目錄中全部文件名符合"[0-9]*.conf"格式的文件(以數字開頭並以'.conf'結尾),都將被按照文件名的ASCII順序依次處理。
        注意,這些文件自己必須是具備完整XML結構的字體配置文件(包含完整的DOCTYPE聲明),而不是用於插入此處的配置片斷。
        當配置文件的XML數據被 FcConfigParse 函數解析以後,
        這個單元中所包含的文件(或目錄中文件名符合"[0-9]*.conf"格式的文件)也會被傳遞給 FcConfigLoadAndParse 函數進行處理,
        從而將這些文件的內容也整合到配置中。
        若是將'ignore_missing'設爲"yes"(而不是默認的"no"),那麼將不會對丟失的文件或目錄發出警告。
        若是將'prefix'設爲"xdg",那麼環境變量 XDG_CONFIG_HOME 的值將會被做爲前綴添加到路徑的頭部。
        詳情參見"XDG Base Directory Specification"。


    <config>
        這個單元提供了一個整合附加配置信息的地方。<config>能夠包含0或1個 <blank>, <rescan> 單元。


    <blank>
        字體中常常會缺乏某些字符的字形(glyph),這些字符在編碼中存在,可是卻只能在屏幕上繪製成空白。
        經過在<blank>單元中放置本來就應該繪製成空白的 Unicode 字符(例如空格),就能夠推斷出:
        那些既不包含在<blank>中、又被繪製爲空白的字符,就是該字體所不支持的字符。
        這些不被支持的字符將會從該字體支持的字符集中剔除。
        <blank>能夠包含任意數量的<int>和<range>單元,用於指定這些空白字符的Unicode碼位(code point)。


    <rescan>
        <rescan>僅可容納單獨一個<int>單元,表示每隔多少秒自動掃描一次字體配置文件。
        每次掃描,Fontconfig 都會驗證全部的配置文件和目錄,並自動重建內部的數據結構。


    <selectfont>
        <selectfont>經過包含0或1個 <rejectfont>, <acceptfont> 單元來設置字體黑名單與白名單。
        經過包含一個<rejectfont>單元,能夠明確將某些字體排除在可用字體列表以外;
        一樣,經過包含一個<acceptfont>單元,也能夠明確將某些字體包含在可用字體列表以內。


    <acceptfont>
        <acceptfont>經過包含任意數量的<glob>和<pattern>單元來匹配"白名單"字體。
        全部被匹配到的字體都會被列入"白名單",也就是會被明確包含在可用字體列表以內,它們既能夠用於字體匹配,也能夠被列出給應用程序。
        注意,"白名單"中的字體永遠不會被<rejectfont>列入"黑名單"。


    <rejectfont>
        <rejectfont>經過包含任意數量的<glob>和<pattern>單元來匹配"黑名單"字體。
        全部被匹配到的字體都會被列入"黑名單"(注意:"白名單"中的字體永遠不會被列入"黑名單"),也就是會被明確排除在可用字體列表以外:
        它們既不會被用於字體匹配,也不會被列出給應用程序,就好象系統中更本不存在這些字體同樣。


    <glob>
        <glob>單元能夠容納一個shell風格的文件名匹配模式(包含"?"和"*"),用於根據字體的全路徑名稱進行匹配。
        能夠用於匹配一組特定目錄(例如:/usr/share/fonts/uglyfont*)中的字體,或者用於匹配具備特定後綴名(例如:*.pcf.gz)的字體。
        不過,基於後綴名的匹配並不老是那麼可靠,由於並不是全部字體文件的命名都十分規範。
        此外,須要注意的是,<glob>單元僅可做用於目錄,而不能做用於單個字體。


    <pattern>
        <pattern>經過包含任意數量的<patelt>單元,將字體的屬性值與<patelt>單元列出的屬性值列表進行比較,
        若是每一個<patelt>單元列出的屬性值列表中都至少有一項與輸入字體對應的屬性值相符,
        那麼就表示該字體與整個<pattern>單元的要求相符合。
        這樣就能夠基於字體的屬性(縮放,粗細等)來匹配字體,這可比根據字體文件的後綴名匹配要可靠多了。


    <patelt name="屬性">
        首先,必須明確指定"屬性",以代表該<patelt>單元要比較的是字體的哪一個屬性。
        其次,<patelt>又經過包含一系列常量單元,來指定可與該屬性匹配的值列表。
        "常量單元"是指:<int>, <double>, <string>, <matrix>, <bool>, <charset>, <langset>, <const>


    <match target="目標">
        <match>必須首先包含一系列<test>組成的列表(能夠爲空),而後再包含一系列<edit>組成的列表(能夠爲空),
        也就是<test>列表必須位於<edit>列表以前。注意:雖然兩個列表均可覺得空,可是不能夠同時爲空。
        若是"目標"知足<test>列表的全部測試條件,那麼將被按照<edit>列表中的指令序列進行修改。
        "目標"的默認值是"pattern",表示此<match>單元針對的是用於匹配的字體模板(第一次修改)。
        若是"目標"的值是"font",那麼就表示此<match>單元針對的是已被選定的字體(第二次修改)。
        若是"目標"的值是"scan",那麼就表示此<match>單元針對的是掃描字體以建立內部配置數據的初始化階段(FcConfigParse)。


    <test qual="品質" name="屬性" target="目標" compare="比較" ignore-blanks="false">
        <test>必須包含一個單獨的表達式單元(其值將在運行時實時計算),用於和"目標"的"屬性"(參見前面"字體屬性"小節)值列表進行"比較"。
        [譯者注]若是在<test>中包含了多個表達式單元,將會被警告:"Having multiple values in <test> isn't supported ..."。
        "表達式單元"是指:<int>, <double>, <string>, <matrix>, <bool>, <charset>, <langset>, <name>, <const>, 
        <or>, <and>, <eq>, <not_eq>, <less>, <less_eq>, <more>, <more_eq>, <contains>, <not_contains>, 
        <plus>, <minus>, <times>, <divide>, <not>, <if>, <floor>, <ceil>, <round>, <trunc> 
        "比較"的默認值是"eq"[等於],其餘還有:"not_eq"[不等於], "less"[小於], "less_eq"[小於等於], 
        "more"[大於], "more_eq"[大於等於], "contains"[包含(字符串)], "not_contains"[不包含(字符串)]。
        "品質"的默認值是"any",表示只要"屬性"值列表中有任意一項"比較"成功,就算測試成功。
        若是"品質"的值是"all",那麼只有"屬性"值列表中的全部項全都"比較"成功,才能算測試成功。
        若是"品質"的值是"first",那麼"屬性"值列表中的第一項必須"比較"成功,才能算測試成功。
        若是"品質"的值是"not_first",那麼"屬性"值列表中的第一項必須"比較"失敗,同時後繼項中又有至少一項"比較"成功,才能算測試成功。
        "目標"的默認值是"default",表示繼承外層<match>單元的值。惟一的例外是:
        當外層是<match target="font">時,可將"目標"設爲"pattern",以強迫此<test>做用於原始的字體模板,而不是選中的字體。
        'ignore-blanks'僅在 compare="eq" 或 compare="not_eq" 的狀況下才有意義,
        其默認值是"false",表示任何字符串中的空白在"比較"時都會被保留,若是設爲"true",則表示在"比較"時忽略字符串中的空白。


    <edit name="屬性" mode="修改方式" binding="綁定">
        <edit>包含一系列特定順序的表達式單元(其值將在運行時實時計算),用於修改"目標"(來自外層<match>單元)的"屬性"值列表。
        "表達式單元"是指:<int>, <double>, <string>, <matrix>, <bool>, <charset>, <langset>, <name>, <const>, 
        <or>, <and>, <eq>, <not_eq>, <less>, <less_eq>, <more>, <more_eq>, <contains>, <not_contains>, 
        <plus>, <minus>, <times>, <divide>, <not>, <if>, <floor>, <ceil>, <round>, <trunc> 
        "綁定"僅在 name="family" 的狀況下才有意義(參見前面的字體匹配規則特例)。
        其默認值是"weak",表示弱綁定;若設爲"strong",則表示強綁定;而設爲"same",則表示不改變當前的綁定。
        至於如何修改,則與兩個因素有關:(1)"修改方式",(2)此<edit>的"屬性"是否與同<match>內某個<test>的"屬性"相同。
        具體以下表所示:

          "修改方式"              有相同"屬性"              無相同"屬性"
          ---------------------------------------------------------------------
          "assign"(默認值)        替換第一個匹配的值        替換所有值
          "assign_replace"        替換所有值                替換所有值
          "prepend"               在第一個匹配的值以前插入  在值列表的首部插入
          "prepend_first"         在值列表的首部插入        在值列表的首部插入
          "append"                在第一個匹配的值以後添加  在值列表的尾部添加
          "append_last"           在值列表的尾部添加        在值列表的尾部添加
          "delete"                刪除第一個匹配的值        刪除所有值
          "delete_all"            刪除所有值                刪除所有值


    <alias binding="綁定">
        <alias>單元爲修改字族名稱提供了一種專門的速記法(有多此一舉之嫌)。
        "綁定"的默認值是"weak",表示弱綁定;若設爲"strong",則表示強綁定;而設爲"same",則表示不改變當前的綁定。
        <alias>必須首先包含一個單獨的<family>單元,而後再依次包含:0或1個<prefer>單元、0或1個<accept>單元、0或1個<default>單元。
        [譯者注]若是在<alias>中包含了多個<family>單元,將會被警告:"Having multiple <family> in <alias> isn't supported ..."。
        這種標記法等價於以下結構:
          <match>
            <test name="family" ignore-blanks="true"><string value=[family]/></test>
            <edit name="family" binding="綁定" mode="prepend"> <string value=[prefer]/> ... </edit>
            <edit name="family" binding="綁定" mode="append"> <string value=[accept]/> ... </edit>
            <edit name="family" binding="綁定" mode="append_last"> <string value=[default]/> ... </edit>
          </match>


    <family>
        用於容納一個單獨的字族名稱。


    <prefer>, <accept>, <default>
        這些單元能夠容納一系列特定順序的<family>單元。


    <int>, <double>, <string>, <bool>
        這些單元必須按照其聲明的類型容納一個單獨的常量值。<bool>只能容納 true 或者 false 。
        此外,浮點數必須以數字開頭,而不能以小數點開頭(例如:必須使用 0.5 而不是 .5 ,而對於負數,則必須使用 -0.5 而不是 -.5 )。


    <matrix>
        <matrix>必須包含4個<double>單元,以指定仿射變換的四個係數(用於合成斜體)。
        此外,也能夠用表達式單元(參見前面的解釋)來替換<double>單元,可是每一個表達式單元的計算結果都必須是數值。


    <range>
        <range>經過包含兩個<int>單元界定一個整數範圍(包括兩端的整數)。


    <charset>
        <charset>能夠包含任意數量的 <int>, <range> 單元,用於表示一組Unicode碼位(code point)。
        因爲每一個碼位都是一個正整數,都對應着一個Unicode字符,因此<charset>單元至關於定於了一個字符集。


    <langset>
        <langset>必須包含至少一個<string>單元,而每一個<string>單元必須包含一個符合RFC-3066規範的語言標記(語言[-國家])。


    <name target="目標">
        <name>必須包含一個字體屬性的名稱,而單元的值則等於"目標"的該屬性值列表中的第一個值。
        "目標"的默認值是"default",表示繼承外層<match>單元的值。惟一的例外是:
        當外層是<match target="font">時,可將"目標"設爲"pattern",以強迫此<name>做用於原始的字體模板,而不是選中的字體。


    <const>
        <const>必須包含一個下表中的常量名稱。表中的數值老是整數,而且這些常量只能做爲對應屬性值的字符記號使用。

          常量            屬性            數值  [譯者注]
          ----------------------------------------------------
          thin            weight          0
          extralight      weight          40
          ultralight      weight          40
          light           weight          50
          book            weight          75
          regular         weight          80
          normal          weight          80
          medium          weight          100
          demibold        weight          180
          semibold        weight          180
          bold            weight          200
          extrabold       weight          205
          black           weight          210
          heavy           weight          210
          roman           slant           0     [正體]
          italic          slant           100   [斜體]
          oblique         slant           110   [合成斜體]
          ultracondensed  width           50
          extracondensed  width           63
          condensed       width           75
          semicondensed   width           87
          normal          width           100
          semiexpanded    width           113
          expanded        width           125
          extraexpanded   width           150
          ultraexpanded   width           200
          proportional    spacing         0    [比例,也就是非等寬,也就是沒有統一的寬度,每一個字符的寬度都不一樣]
          dual            spacing         90   [雙寬,只有兩個固定的寬度,一般是一個全角=兩個半角,例如"SimHei"與"幼圓"]
          mono            spacing         100  [等寬,只有一個固定的寬度,也就是每一個字符的寬度都徹底相同,例如"Courier"]
          charcell        spacing         110  [字符單元,僅用於純點陣字體,例如"Unifont"]
          unknown         rgba            0    [未知]
          rgb             rgba            1    [橫向(水平)"Red Green Blue",這是最多見的LCD]
          bgr             rgba            2    [橫向(水平)"Blue Green Red"]
          vrgb            rgba            3    [縱向(垂直)"Red Green Blue"]
          vbgr            rgba            4    [縱向(垂直)"Blue Green Red"]
          none            rgba            5    [無子像素,也就是非LCD屏,例如傳統的CRT顯示器]
          lcdnone         lcdfilter       0    [完全關閉 LCD filter,不推薦,它會致使筆畫邊緣出現彩色邊紋]
          lcddefault      lcdfilter       1    [最大限度的消除彩色邊紋,可是可能會增長筆畫的模糊程度。多數場合這是最佳選擇]
          lcdlight        lcdfilter       2    [減輕筆畫的模糊程度,但不能最大限度的消除彩色邊紋。少數場合也許效果更好]
          lcdlegacy       lcdfilter       3    [爲了與傳統的"libXft color filter"兼容而設置,將來會被刪除]
          hintnone        hintstyle       0    [禁用微調(包括自動微調與內嵌微調)]
          hintslight      hintstyle       1    [優先保持字符的形態,可是可能會下降筆畫的銳利度]
          hintmedium      hintstyle       2    [在字符形態與筆畫銳利度之間進行折中,實際效果一般至關於"hintfull"]
          hintfull        hintstyle       3    [優先提升筆畫的銳利度,可是可能破壞字符的形態]


    <or>, <and>, <plus>, <minus>, <times>, <divide>
        這些單元都必須包含至少兩個表達式單元(參見前面的解釋),而後對它們進行相應的運算:
        <or>(或);<and>(與);<plus>(加);<minus>(減);<times>(乘);<divide>(除)。
        注意,<or>與<and>執行的是邏輯運算(而不是位運算)。


    <eq>, <not_eq>, <less>, <less_eq>, <more>, <more_eq>, <contains>, <not_contains>
        這些單元都必須包含剛好兩個表達式單元(參見前面的解釋),而後對它們進行相應的運算:
        <eq>(等於);<not_eq>(不等於);<less>(小於);<less_eq>(小於等於);<more>(大於);
        <more_eq>(大於等於);<contains>(包含);<not_contains>(不包含)。
        他們都會獲得一個邏輯結果(true 或 false)。


    <not>, <floor>, <ceil>, <round>, <trunc>
        這些單元都必須包含剛好一個表達式單元(參見前面的解釋),而後對它們進行相應的運算。
        <not>執行的是邏輯運算(而不是位運算),會獲得一個邏輯結果(true 或 false)。
        其餘都是算術運算,都會獲得一個整數:
        <floor>表示向下取整;<ceil>表示向上取整;<round>表示四捨五入;<trunc>表示去掉小數部分。


    <if>
        <if>必須包含剛好三個表達式單元(參見前面的解釋)。
        若是第一個表達式的值是真,那麼整個單元的值就取第二個表達式的值,不然就取第三個表達式的值。


配置文件示例

    系統配置文件
        這是一個針對全系統範圍的配置文件示例,文件位於 /etc/fonts/fonts.conf

        <?xml version="1.0"?>
        <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
        <!-- /etc/fonts/fonts.conf 文件用於全系統範圍的配置 -->
        <fontconfig>

        <!-- 在下列目錄中尋找字體 -->
        <dir>/usr/share/fonts</dir>
        <dir>/usr/X11R6/lib/X11/fonts</dir>

        <!-- 將過期的 'mono' 別名替換爲規範的 'monospace' -->
        <match target="pattern">
            <test qual="any" name="family"><string>mono</string></test>
            <edit name="family" mode="assign"><string>monospace</string></edit>
        </match>

        <!-- 將全部沒法識別的別名統一替換成 'sans-serif' -->
        <match target="pattern">
            <test qual="all" name="family" mode="not_eq"><string>sans-serif</string></test>
            <test qual="all" name="family" mode="not_eq"><string>serif</string></test>
            <test qual="all" name="family" mode="not_eq"><string>monospace</string></test>
            <edit name="family" mode="append_last"><string>sans-serif</string></edit>
        </match>

        <!-- 加載用戶本身定製配置文件,可是即便文件不存在,也不報警 -->
        <include ignore_missing="yes" prefix="xdg">fontconfig/fonts.conf</include>

        <!-- 加載本地定製的配置文件,可是即便文件不存在,也不報警 -->
        <include ignore_missing="yes">conf.d</include>
        <include ignore_missing="yes">local.conf</include>

        <!-- 將一些著名的 Type1 字體替換爲對應的 TrueType 版本,以改善屏幕顯示效果 -->
        <alias>
            <family>Times</family>
            <prefer><family>Times New Roman</family></prefer>
            <default><family>serif</family></default>
        </alias>
        <alias>
            <family>Helvetica</family>
            <prefer><family>Arial</family></prefer>
            <default><family>sans</family></default>
        </alias>
        <alias>
            <family>Courier</family>
            <prefer><family>Courier New</family></prefer>
            <default><family>monospace</family></default>
        </alias>

        <!-- 爲標準的字族名稱提供所需的別名,把這個配置段放在用戶本身定製配置文件以後,以確保可以覆蓋用戶的設置 -->
        <alias>
            <family>serif</family>
            <prefer><family>Times New Roman</family></prefer>
        </alias>
        <alias>
            <family>sans</family>
            <prefer><family>Arial</family></prefer>
        </alias>
        <alias>
            <family>monospace</family>
            <prefer><family>Andale Mono</family></prefer>
        </alias>

        <-- 若是'family'包含 'Courier New' 或 'Courier',那麼就將'monospace'添加爲備選 -->
        <match target="pattern">
            <test name="family" mode="eq"><string>Courier New</string></test>
            <edit name="family" mode="prepend"><string>monospace</string></edit>
        </match>
        <match target="pattern">
            <test name="family" mode="eq"><string>Courier</string></test>
            <edit name="family" mode="prepend"><string>monospace</string></edit>
        </match>

        </fontconfig>


    用戶配置文件
        這是一個針對單個用戶的配置文件示例,文件位於 $XDG_CONFIG_HOME/fontconfig/fonts.conf

        <?xml version="1.0"?>
        <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
        <!-- $XDG_CONFIG_HOME/fontconfig/fonts.conf 針對單個用戶的配置文件 -->
        <fontconfig>

        <!-- 私人專用的字體文件目錄 -->
        <dir prefix="xdg">fonts</dir>

        <!-- 指定LCD屏次像素的排列順序爲"rgb"。因爲次像素平滑隻影響渲染而不影響匹配,因此應該老是使用 target="font" -->
        <match target="font">
            <edit name="rgba" mode="assign"><const>rgb</const></edit>
        </match>

        <!-- 當要求顯示中文有襯線字體的時候,使用"WenQuanYi Zen Hei"(文泉驛正黑) -->
        <match>
            <!-- 若是你不想爲全部中文都使用文泉驛正黑,能夠將 zh 替換爲 zh-tw 或 zh-cn 等。 -->
            <!-- 注意:即便設爲 zh-cn 也依然匹配 zh ,若是你須要精確的匹配,應使用 compare="eq" -->
            <test name="lang" compare="contains"><string>zh</string></test>
            <test name="family"><string>serif</string></test>
            <edit name="family" mode="prepend"><string>WenQuanYi Zen Hei</string></edit>
        </match>

        <!-- 當要求顯示日文無襯線字體的時候,使用"VL Gothic" -->
        <match>
            <test name="lang" compare="contains"><string>ja</string></test>
            <test name="family"><string>sans-serif</string></test>
            <edit name="family" mode="prepend"><string>VL Gothic</string></edit>
        </match>
        </fontconfig>
    

文件

    fonts.conf
        是 fontconfig 庫的主配置文件,使用 XML 格式。

    conf.d
        是外部應用程序或本地系統管理員用來保存額外配置文件的目錄。
        其中包含的配置文件必須是XML格式,文件名必須以ASCII十進制數字開頭,並以字典順序排序。
        主配置文件 fonts.conf 經過<include>單元引用此目錄。

    fonts.dtd
        是描述配置文件語法規則的DTD文件

    $XDG_CONFIG_HOME/fontconfig/conf.d
    ~/.fonts.conf.d
        是每一個用戶用來保存額外配置文件的目錄(一般是自動生成的)。其實際位置由主配置文件 fonts.conf 指定。
        須要注意的是 ~/.fonts.conf.d 已經被反對使用,並會在將來的版本中再也不被默認讀取。

    $XDG_CONFIG_HOME/fontconfig/fonts.conf
    ~/.fonts.conf
        是每一個用戶的個性化配置文件。其實際位置由主配置文件 fonts.conf 指定。
        須要注意的是 ~/.fonts.conf 已經被反對使用,並會在將來的版本中再也不被默認讀取。

    $XDG_CACHE_HOME/fontconfig/*.cache-*
    ~/.fontconfig/*.cache-*
        當沒有在主緩存目錄(<cachedir>)中發現字體的緩存信息時,就會在這些文件中緩存字體的信息。
        這些文件由 fontconfig 自動維護。
        須要注意的是 ~/.fontconfig/*.cache-* 已經被反對使用,並會在將來的版本中再也不被默認讀取。


環境變量

    FONTCONFIG_FILE
        用於指定主配置文件

    FONTCONFIG_PATH
        用於指定保存額外配置文件的目錄

    FC_DEBUG
        用於指定輸出哪些調試信息。參見前面的"調試"小節

    FONTCONFIG_USE_MMAP
        接受一個bool值,用於控制在訪問緩存文件時,是否使用 mmap(2) 系統調用接口。
        默認狀況下,fontconfig 將會檢查緩存文件所在的文件系統是否能夠安全的使用 mmap(2) 功能。
        明確設置此變量以後,將會跳過這個檢測,強制使用或禁用 mmap(2) 功能。


參見
    fc-cat(1), fc-cache(1), fc-list(1), fc-match(1), fc-query(1)
相關文章
相關標籤/搜索