章 11. 資料轉換

# 章 11. 資料轉換

下面是關於Debian 系統上可用的格式轉化工具及其相關提示的資訊。

基於標準的工具，是非常好用的，但支援的專有資料格式有限.

## 11.1. 文字資料轉換工具

如下是文字資料轉換工具。

表格 11.1. 文字資料轉化工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`libc6` | V:940, I:999 | 5355 | 字元集 | 使用 iconv(1) 的不同語言環境（locale）之間的文字編碼轉換器 (基礎的)
`recode` | V:2, I:13 | 528 | 字元集+換行 | 不同語言環境（locale）之間的文字編碼轉換器（多功能的，更多別名和特性）
`konwert` | V:2, I:42 | 137 | 字元集 | 不同語言環境（locale）之間的文字編碼轉換器（高檔的）
`nkf` | V:0.4, I:8.5 | 359 | 字元集 | 日語字元集翻譯
`tcs` | V:0.01, I:0.14 | 518 | 字元集 | 字元集翻譯
`unaccent` | V:0.03, I:0.30 | 35 | 字元集 | 代替重音字元，使用和它們相當的非重音字元
`tofrodos` | V:1, I:13 | 50 | 換行 | 在 DOS 和 Unix 之間的文字格式轉換: fromdos(1) 和 todos(1)
`macutils` | V:0.04, I:0.45 | 319 | 換行 | 在 Macintosh 和 Unix 之間的文字格式轉換: frommac(1) 和 tomac(1)

### 11.1.1. 用 iconv 指令來轉換文字檔案

| 提示
iconv(1) 是 `libc6` 軟體包的一部分並且它可以在類 Unix 的系統上轉換字元的編碼。

你能夠通過如下的指令用 iconv(1) 來轉換文字檔案的編碼。

    $ iconv -f encoding1 -t encoding2 input.txt >output.txt

編碼值是大小寫不敏感的，且會在匹配時忽略“`-`”和“`_`”。可以使用“`iconv -l`”指令檢查支援的編碼。

表格 11.2. 編碼值和用法的列表

編碼值 | 用法
--- | ---
ASCII | 美國資訊交換標準程式碼，7位程式碼不帶重音符號
UTF-8 | 用於所有現代作業系統的多語言標準
ISO-8859-1 | 舊的西歐語言標準，ASCII + 重音符號
ISO-8859-2 | 舊的東歐語言標準，ASCII + 重音符號
ISO-8859-15 | 舊的帶有歐元符號的西歐語言標準（ISO-8859-1）
CP850 | code page 850，用於西歐語言的微軟 DOS 的帶有圖形的字元，ISO-8859-1 的變體
CP932 | code page 932, 日語 Microsoft Windows 的 Shift-JIS 變體
CP936 | code page 936，用於簡體中文的微軟作業系統風格的 GB2312，GBK 或者 GB18030 的變體
CP949 | code page 949，用於韓語的微軟作業系統風格的 EUC-KR 或者 Unified Hangul Code 的變體
CP950 | code page 950，用於繁體中文的微軟作業系統風格的 Big5 的變體
CP1251 | code page 1251，用於西裡爾字母的微軟作業系統風格的編碼
CP1252 | code page 1252，用於西歐語言的微軟作業系統風格的 ISO-8859-15 的變體
KOI8-R | 用於西裡爾字母的舊俄語 UNIX 標準
ISO-2022-JP | 日文郵件的標準編碼，只使用 7 位位元組
eucJP | 老的日文 UNIX 標準的 8 位位元組，和 Shift-JIS 完全不同
Shift-JIS | 日文 JIS X 0208 附錄 1 標準 (參見 CP932)

| 注意
一些編碼只支援資料轉換，它不能作為語言環境的值 (節 8.1, “語言環境”)。

像 ASCII 和 ISO-8859 這樣適用於單位元組的字元集，字元編碼和字元集幾乎指的是同一件事情。

對於多字元的字元集，比如說，用於日文的 JIS X 0213，或用於差不多所有語言的 Universal Character Set (UCS, Unicode, ISO-10646-1) , 有多種編碼方案來序列化它們的位元組資料。

- 日文的 EUC 和 ISO/IEC 2022 (也被稱為 JIS X 0202)

- Unicode 的 UTF-8、UTF-16/UCS-2 和 UTF-32/UCS-4 編碼

對於以上這些，字元集和字元編碼之間有著明顯的區別。

對某些計算機廠家而言，code page 是作為字元編碼表的同義詞來使用。

| 注意
請注意，大部分編碼系統共享 ASCII 的 7 位字元的同樣編碼，但也有一些列外。如果你從通常所說的 shift-JIS 編碼格式，轉化老的日文 C 語言程式和 URL 資料，到 UTF-8 格式,你需要使用 "`CP932`" 作為編碼名來代替 "`shift-JIS`" 來得到期望的結果： `0x5C` → "`\`" 和 `0x7E` → "`~`".否則，這些將被轉化為錯誤的字元。

| 提示
recode(1) 也可能被使用並且不僅僅是 iconv(1)，fromdos(1)，todos(1)，frommac(1) 和 tomac(1) 功能的結合。想要獲得更多資訊，請參見 "`info recode`"。

### 11.1.2. 用 iconv 檢查檔案是不是 UTF-8 編碼

你能夠通過如下指令用 iconv(1) 來檢查一個文字檔案是不是用 UTF-8 編碼的。

    $ iconv -f utf8 -t utf8 input.txt >/dev/null || echo "non-UTF-8 found"

| 提示
在上面的例子中使用 "`--verbose`" 參數來找到第一個 non-UTF-8 字元。

### 11.1.3. 使用 iconv 轉換檔名

這裡是一個示例腳步，在同一目錄下，將在老的作業系統系統下建立的檔名編碼，轉換為現代 UTF-8.

    #!/bin/sh
    ENCDN=iso-8859-1
    for x in *;
     do
     mv "$x" "$(echo "$x" | iconv -f $ENCDN -t utf-8)"
    done

"`$ENCDN`" 變數定義了在老的作業系統下，檔名使用的原始編碼，見 表格 11.2, “編碼值和用法的列表”.

對於更加複雜的情況，請使用適當的編碼作為 mount(8) 的選項(參見 節 8.1.3, “檔名編碼”) 來掛載包含有這樣檔名的檔案系統（比如說，磁碟上的一個分割槽），使用 "`cp -a`" 指令來拷貝它的整個內容到另外一個使用 UTF-8 掛載的檔案系統上。

### 11.1.4. 換行符轉換

文字檔案的格式，特別是行尾（換行符）編碼，有平臺獨立性。

表格 11.3. 不同平臺的換行符樣式列表

平臺 | 換行符編碼 | 控制碼 | 十進位制 | 16 進位制
--- | --- | --- | --- | ---
Debian (unix) | LF | `^J` | 10 | 0A
MSDOS 和 Windows | CR-LF | `^M^J` | 13 10 | 0D 0A
蘋果的 Macintosh | CR | `^M` | 13 | 0D

換行符轉換程式, fromdos(1), todos(1), frommac(1), 和 tomac(1), 是相當方便. recode(1) 也是有用的。

| 注意
在 Debian 系統上的一些資料，如 `python-moinmoin` 軟體包的 wiki 頁面資料，使用 MSDOS 式樣的 CR-LF 作為換行符編碼。所以，上面的規則僅僅是一個通用規則。

| 注意
大部分編輯器 (比如： `vim`, `emacs`, `gedit`, …) 能夠透明處理 MSDOS 式樣的換行符檔案。

| 提示
對於混合 MSDOS 和 Unix 式樣的檔案，統一到 MSDOS 換行符式樣，使用 "`sed -e '/\r$/!s/$/\r/'`" 代替 todos(1) 比較好。 (例如，在使用 diff3(1)移植兩個 MSDOS 式樣的檔案後.)這是因為 `todos` 給所有的行增加 CR.

### 11.1.5. TAB 轉換

這裡有一些轉換 TAB 程式碼的專業工具。

表格 11.4. `bsdmainutils` 和 `coreutils` 包中的用於轉換 TAB 的指令列表

功能 | `bsdmainutils` | `coreutils`
--- | --- | ---
把製表符擴展成空格 | "`col -x`" | `expand`
不把空格擴展成製表符 | "`col -h`" | `unexpand`

`indent` 包中的 indent(1) 指令能夠重新格式化 C 程式中的空格。

例如 `vim` 和 `emacs` 這樣的編輯軟體，可以被用來擴展 TAB。就拿 `vim` 來說，你能夠按順序輸入 "`:set expandtab`" 和 "`:%retab`" 指令來擴展 TAB。你也可以按順序輸入 `:%set noexpandtab`" 和 "`:%retab`" 指令來復原。

### 11.1.6. 帶有自動轉換功能的編輯器

像 `vim` 這樣的現代智慧編輯器軟體是相當聰明的並且能夠處理任何編碼系統以及任何檔案格式。你應該在支援 UTF-8 編碼的控制檯上並在 UTF-8 環境下使用這些編輯器來獲得最好的相容性。

以 latin1（iso-8859-1）編碼儲存的舊西歐語言的 Unix 文字檔案，“`u-file.txt`”，能通過如下所示的用 `vim` 輕易的編輯。

    $ vim u-file.txt

這是可能的因為 `vim` 的檔案編碼自動檢測機制先假定檔案是 UTF-8 編碼，如果失敗了，則假定它是 latin1 編碼。

以 latin2（iso-8859-2） 編碼儲存的舊波蘭語的 Unix 文字檔案，“`pu-file.txt`”，能通過如下所示的用 `vim` 編輯。

    $ vim '+e ++enc=latin2 pu-file.txt'

以 eucJP 編碼儲存的舊日語的 Unix 文字檔案，"`ju-file.txt`"，能通過如下所示的用 `vim` 編輯。

    $ vim '+e ++enc=eucJP ju-file.txt'

以所謂的 shift-JIS 編碼 (更確切的說法是：CP932) 儲存的舊日語 MS-Windows 文字檔案，"`jw-file.txt`"，能通過如下所示的用 `vim` 編輯。

    $ vim '+e ++enc=CP932 ++ff=dos jw-file.txt'

當一個檔案用 vim 開啟的時候帶有 "`++enc`" 和 "`++ff`" 選項，在 Vim 指令列輸入 "`:w`" 指令會以原格式儲存檔案並且會覆蓋原檔案。你也可以在 Vim 指令列指定儲存檔名及其格式，例如，"`:w ++enc=utf8 new.txt`"。

請查閱 `vim` 線上幫助中的 mbyte.txt，"多位元組文字支援"和表格 11.2, “編碼值和用法的列表”來獲得 "`++enc`" 使用的本地值的資訊。

`emacs` 家族的程式能夠實現同樣的功能。

### 11.1.7. 提取純文字

如下所示讀入 web 頁面並把它轉化成文字檔案。當從 Web 中拷貝調配或者是在 web 頁面中應用類似 grep(1) 的基礎 Unix 文字工具時，以下指令是非常有用的。

    $ w3m -dump https://www.remote-site.com/help-info.html >textfile

同樣，你可以使用如下所示的工具從其他格式提取純文字資料。

表格 11.5. 用於提取純文字資料的工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 功能
--- | --- | --- | --- | ---
`w3m` | V:11, I:137 | 2853 | html→text | 用 "`w3m -dump`" 指令把 HTML 轉化為文字的轉換器
`html2text` | V:3, I:68 | 298 | html→text | 高階的 HTML 到文字檔案的轉換器 (ISO8859-1)
`lynx` | V:28, I:449 | 2031 | html→text | 用 "`lynx -dump`" 指令把 HTML 轉化為文字的轉化器
`elinks` | V:3, I:16 | 1789 | html→text | 用 "`elinks -dump`" 指令把 HTML 轉化為文字的轉換器
`links` | V:2, I:21 | 2321 | html→text | 用 "`links -dump`" 指令把 HTML 轉化為文字的轉換器
`links2` | V:1, I:10 | 5466 | html→text | 用 "`links2 -dump`" 指令把 HTML 轉化為文字的轉換器
`catdoc` | V:15, I:171 | 682 | MSWord→text,TeX | 轉化 MSWord 檔案到純文字或 TeX檔案
`antiword` | V:0.9, I:6.5 | 587 | MSWord→text,ps | 轉化 MSWord 檔案到純文字或 ps 檔案
`unhtml` | V:0.04, I:0.50 | 40 | html→text | 從一個 HTML 檔案裡面刪除標記標籤
`odt2txt` | V:1, I:21 | 60 | odt→text | 從開放文件格式到文字格式的轉化器

### 11.1.8. 高亮並格式化純文字資料

你可以通過如下所示的來高亮並格式化純文字資料。

表格 11.6. 高亮純文字資料的工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`vim-runtime` | V:17, I:365 | 38706 | 高亮 | 用 "`:source $VIMRUNTIME/syntax/html.vim`" Vim 巨集指令轉化原始碼到 HTML
`cxref` | V:0.03, I:0.23 | 1191 | c→html | 從 C 程式到 latex 和 HTML 的轉換器（C語言）
`src2tex` | V:0.02, I:0.18 | 1799 | 高亮 | 轉換許多原始碼到 TeX（C語言）
`source-highlight` | V:0.5, I:3.2 | 2131 | 高亮 | 轉換原始碼到帶有高亮顯示的 HTML, XHTML, LaTeX, Texinfo, ANSI 顏色轉義序列和 DocBook 檔案 (C++)
`highlight` | V:0.4, I:3.1 | 1411 | 高亮 | 轉化許多原始碼到帶有高亮顯示的 HTML, XHTML, RTF, LaTeX, TeX or XSL-FO 檔案。(C++)
`grc` | V:1.0, I:6.0 | 208 | text→有顏色的 | 用於任何文字的通用顏色生成器 (Python)
`pandoc` | V:10, I:47 | 208068 | text→any | 通用標記轉化器 (Haskell)
`python3-docutils` | V:12, I:52 | 2009 | text→any | 重構文字文件到 XML (Python)
`markdown` | V:0.5, I:5.9 | 56 | text→html | Markdown 文本文件到 (X)HTML (Perl)
`asciidoctor` | V:0.4, I:4.8 | 101 | text→any | AsciiDoc 文本文件格式化到 XML/HTML (Ruby)
`python3-sphinx` | V:6, I:27 | 3235 | text→any | 基於文件釋出系統 (Python)重構文本
`hugo` | V:0.8, I:5.1 | 66608 | text→html | 基於 Markdown 的靜態站點發布系統(Go)

## 11.2. XML 資料

擴展標記語言 Extensible Markup Language (XML) 是一種標記語言，用於含有結構化資訊的文件。

在 XML.COM 檢視介紹資訊.

- "什麼是 XML?"

- "什麼是 XSLT?"

- "什麼是 XSL-FO?"

- "什麼是 XLink?"

### 11.2.1. XML 的基本提示

XML 文字看起來有些像 HTML.它能夠使我們管理一個文件的多個格式。一個簡單的 XML 系統是 `docbook-xsl` 軟體包，在這裡使用。

每一個 XML 檔案使用下面的標準 XML 宣告開始。

    <?xml version="1.0" encoding="UTF-8"?>

XML 元素的基本語法是按下面的方式標記。

    <name attribute="value">content</name>

內容為空的 XML 元素，使用下面的短格式標記。

    <name attribute="value" />

上面列子中的 "`attribute="value"`" 是可選的。

XML 裡面的註釋部分，是按下面的方式標記。

    <!-- comment -->

不同於增加標記，XML 至少要求使用預定義實體裡的內容來轉化下列字元。

表格 11.7. XML 預定義實體列表

預定義實體 | 轉化的字元
--- | ---
`&quot;` | `"` : 引號
`&apos;` | `'` : 撇號
`&lt;` | `<` : 小於號
`&gt;` | `>` : 大於號
`&amp;` | `&` :＆號

| 注意
“`<`”或“`&`”不能在屬性（attributes）或元素（elements）中使用。

| 注意
當 SGML 式樣的使用者定義實體，比如 "`&some-tag;`", 被使用的時候，第一個定義會覆蓋其它的。實體定義在 "`<!ENTITY some-tag "entity value">`"裡表示。

| 注意
只要 XML 標記是一致使用某一標籤名集合（一些資料作為內容或屬性值），使用 Extensible Stylesheet Language Transformations (XSLT) 來轉換到另外一個 XML，是一個微不足道的任務。

### 11.2.2. XML 處理

有許多工具可以用於處理 XML 檔案，比如說： 可擴充樣式表語言 Extensible Stylesheet Language (XSL).

一旦你建立了一個好的成形的 XML 檔案，基本上來講，你就可以使用 可擴充樣式表語言轉換 Extensible Stylesheet Language Transformations (XSLT)，將其轉換成任何格式。

格式化物件的可擴充樣式表語言 Extensible Stylesheet Language for Formatting Objects (XSL-FO) 是用來作為格式化的解決方案. `fop` 軟體包比 Debian `main` 檔案庫要新，因為它依賴 Java 程式語言. LaTeX 程式碼通常是從 XML 使用 XSLT 生成，LaTe圖形化界面是用來建立 DVI, PostScript 和 PDF 這類可列印的檔案。

表格 11.8. XML 工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`docbook-xml` | V:15, I:408 | 2126 | xml | DocBook 的 XML 文件型別定義（DTD）
`docbook-xsl` | V:14, I:145 | 14823 | xml/xslt | 使用 XSLT 將 DocBook XML 處理成各種輸出格式的 XSL 樣式表
`xsltproc` | V:15, I:73 | 83 | xslt | XSLT 指令列處理器 (XML→ XML, HTML, 純文字，等等)
`xmlto` | V:0.5, I:8.6 | 124 | xml/xslt | 使用 XSLT 將 XML 轉換到任意格式的轉換器
`fop` | V:0.7, I:8.1 | 281 | xml/xsl-fo | 轉換 Docbook XML 檔案到 PDF
`dblatex` | V:0.9, I:5.8 | 4636 | xml/xslt | 使用 XSLT 將 Docbook 檔案轉換為 DVI, PostScript, PDF 文件
`dbtoepub` | V:0.05, I:0.50 | 37 | xml/xslt | DocBook XML 到 .epub 轉換

由於 XML 是 標準通用標記語言 Standard Generalized Markup Language (SGML)的一個子集,用於處理 SGML 的擴充工具，也能夠處理 XML，比如說 文件式樣語言和規範語言 Document Style Semantics and Specification Language (DSSSL).

表格 11.9. DSSSL 工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`openjade` | V:1, I:22 | 1066 | dsssl | ISO/IEC 10179:1996 標準 DSSSL 處理器 (最新的)
`docbook-dsssl` | V:0.5, I:7.9 | 2594 | xml/dsssl | 使用 DSSSL 處理 DocBook XML 到各種輸出格式的 DSSSL 樣式表
`docbook-utils` | V:0.4, I:5.6 | 287 | xml/dsssl | DocBook 檔案的工具包，包括使用 DSSSL 的轉換成其它格式 (HTML, RTF, PS, man, PDF)的 `docbook2*` 指令

| 提示
GNOME 的 `yelp` 往往能夠方便的直接讀取 DocBook XML 檔案，這是因為它可以從 X 獲得適當的渲染。

### 11.2.3. XML 資料提取

使用下面的方法，你能夠從其它格式提取 HTML 或 XML 資料。

表格 11.10. XML 資料提取工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`man2html` | V:0.1, I:1.3 | 142 | man 手冊頁→html | 從 man 手冊頁到 HTML 的轉換器(支援 CGI)
`doclifter` | V:0.01, I:0.05 | 487 | troff→xml | troff 到 DocBook XML 的轉換器
`texi2html` | V:0.2, I:3.0 | 1847 | texi→html | 從 Texinfo 到 HTML 的轉換器
`info2www` | V:0.9, I:1.5 | 76 | info→html | 從 GNU info 到 HTML 的轉換器 (支援 CGI)
`wv` | V:0.2, I:2.5 | 733 | MSWord→任何格式 | 從微軟 Word 格式到 HTML, LaTeX, 等格式的檔案轉換器。
`unrtf` | V:0.3, I:2.9 | 159 | rtf→html | 從 RTF 到 HTML 等的轉換器
`wp2x` | V:0.01, I:0.09 | 200 | WordPerfect→任意格式 | WordPerfect 5.0 和 5.1 檔案到 TeX, LaTeX, troff, GML 和 HTML

### 11.2.4. XML 資料檢查

對於非 XML 的 HTML 檔案，你能夠轉換它們為 XHTML，XHTML 是一個相當成型的 XML 例項。XHTML 能夠被 XML 工具處理.

XML 檔案的語法和在它們中發現的 URL 的完整性，能夠被檢查。

表格 11.11. XML 美化列印工具列表

軟體包 | 流行度 | 大小 | 功能 | 說明
--- | --- | --- | --- | ---
`libxml2-utils` | V:62, I:209 | 211 | xml↔html↔xhtml | 使用 xmllint(1) 的 XML 指令列工具 (語法檢查，重新格式化，梳理, …)
`tidy` | V:0.9, I:7.3 | 79 | xml↔html↔xhtml | HTML 語法檢查和重新格式化
`weblint-perl` | V:0.06, I:0.91 | 32 | 檢查 | 用於 HTML 的小巧的語法檢查器
`linklint` | V:0.06, I:0.47 | 343 | 連結檢查 | 快速的網站維護工具及連結檢查器

一旦適當的 XML 生成，基於標記的內容等，你能夠使用 XSLT 技術提取資料。

## 11.3. 排版

Unix上的 troff 程式最初是由 AT&T 公司開發的，可以被用做簡單排版。現在被用來建立手冊頁。

Donald Knuth 發明的 Tex 是非常強大的排版工具也是實際上的標準。最初是由 Leslie Lamport 開發的 LaTex 使得使用者可以更為方便的利用 Tex 的強大功能。

表格 11.12. 排版工具的列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`texlive` | V:1, I:28 | 55 | (La)TeX | 用於排版、預覽和列印的 Te圖形化界面
`groff` | V:2, I:24 | 16514 | troff | GNU troff 文字格式化系統

### 11.3.1. roff 排版

傳統意義上，roff 是 Unix 上主要的文字處理系統。參見 roff(7), groff(7), groff(1), grotty(1), troff(1), groff_mdoc(7), groff_man(7), groff_ms(7), groff_me(7), groff_mm(7) 和 "`info groff`"。

安裝好 `groff` 軟體包以後，你輸入 "`-me`" 巨集指令就能看到一份不錯的指導手冊，它的位置是 "`/usr/share/doc/groff/`"。

| 提示
"`groff -Tascii -me -`" 輸出帶有 ANSI 轉義碼的純文字。如果你想要 manpage 的輸出帶有許多 "^H" 和 "_"，那麼使用替代指令 "`GROFF_NO_SGR=1 groff -Tascii -me -`"。

| 提示
如果想要移除 `groff` 生成的文字檔案中的 "^H" 和 "_"，使用 "`col -b -x`" 來過濾它。

### 11.3.2. TeX/LaTeX

Tex Live 軟體提供了全部的 Te圖形化界面。`texlive` 元包只是 TeX Live 中的一部分，但是它足夠應付日常任務。

這裡有許多可用的 TeX 和 LaTeX 的參考資料。

- The teTeX HOWTO: The Linux-teTeX Local Guide

- tex(1)

- latex(1)

- texdoc(1)

- texdoctk(1)

- "The TeXbook", 作者 Donald E. Knuth, (Addison-Wesley)

- "LaTeX - A Document Preparation System", 作者 Leslie Lamport, (Addison-Wesley)

- "The LaTeX Companion", 作者 Goossens, Mittelbach, Samarin, (Addison-Wesley)

這是最強大的排版環境。許多 SGML 處理器把它作為其後臺字處理工具。`lyx` 軟體包提供的 Lyx 和 `texmacs` 軟體包提供的 GNU TeXmacs 都為 LaTeX 提供了非常不錯的所見即所得的編輯環境，然而許多人使用 Emacs 和 Vim 作為其原始碼編輯器。

有許多線上資源存在。

- TEX Live Guide - TEX Live 2007 ("`/usr/share/doc/texlive-doc-base/english/texlive-en/live.html`") (`texlive-doc-base` 包)

- Latex/Lyx 的一個簡單指引

- 使用 LaTeX 進行文書處理

當文件變得更大時，TeX 有時會出錯。你必須在 "`/etc/texmf/texmf.cnf`" 中增加 pool 的大小 (更確切的說話是編輯是 "`/etc/texmf/texmf.d/95NonPath`" 並且執行 update-texmf(8)) 來修復此問題。

| 注意
"The TeXbook" 的 TeX 原始碼可以從 texbook.tex 的 www.ctan.org tex-archive 站點上下載。此檔案包含了絕大多數所需的巨集指令。我聽說把文件中的第7到第10行註釋了並且新增 "`\input manmac \proofmodefalse`"，就可以用 tex(1) 來處理此文件。我強烈建議去購買這本書 (還有 Donald E. Knuth 寫的其他書) 而不是使用線上版本，但是線上版本中的原始碼確實是學習 Tex 輸入很好的例子！

### 11.3.3. 漂亮的列印手冊頁

你能夠用如下任意一個指令在印表機上漂亮的列印手冊頁。

    $ man -Tps some_manpage | lpr

### 11.3.4. 建立手冊頁

儘管用純 troff 格式寫手冊頁（manpage）是可能的，這裡還是有一些輔助的程式包用於建立手冊頁。

表格 11.13. 建立手冊頁的工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`docbook-to-man` | V:0.6, I:5.7 | 189 | SGML→man 手冊頁 | 從 DocBook SGML 到 roff 手冊頁巨集指令的轉換器
`help2man` | V:0.6, I:6.3 | 542 | text→man 手冊頁 | 通過 --help 參數自動生成手冊頁的工具
`info2man` | V:0.01, I:0.19 | 134 | info→man 手冊頁 | 轉換 GNU info 到 POD 或手冊頁的轉換器
`txt2man` | V:0.06, I:0.64 | 112 | text→man 手冊頁 | 把純粹的 ASCII 文字轉化為手冊頁格式

## 11.4. 可印刷的資料

在 Debian 系統中，可列印的資料是 PostScript 格式的。對於非 PostScript 印表機，通用 Unix 列印系統 (CUPS) 使用 Ghostscript 作為其後臺光柵處理程式。

在最近的 Debian 系統中，可列印的資料，也可以用 PDF 格式表示。

PDF 檔案能夠使用 GUI（圖形使用者介面）的檢視工具顯示，它的排版條目也可以被填充到 GUI（圖形使用者介面）檢視工具，比如 Evince 和 Okular (參見 節 7.4, “GUI（圖形使用者介面）應用”); 以及現代瀏覽器，比如 Chromium。

PDF 檔案能夠使用某些影像工具編輯，比如 LibreOffice、Scribus 和 Inkscape (參見 節 11.6, “圖形資料工具”)。

| 提示
你能夠用 GIMP 閱讀 PDF 檔案，並能夠用高於 300 dpi 畫素的解析度，將 PDF 轉換為 PNG 格式。這個可以作為 LibreOffice 背景圖片，用最簡單的操作生成一個期望的替代列印輸出。

### 11.4.1. Ghostscript

處理可印刷的資料的核心是 Ghostscript PostScript 直譯器，它能夠生成光柵影象。

表格 11.14. Ghostscript PostScript 直譯器列表

軟體包 | 流行度 | 大小 | 說明
--- | --- | --- | ---
`ghostscript` | V:142, I:563 | 177 | GPL Ghostscript PostScript/PDF 直譯器
`ghostscript-x` | V:0, I:15 | 88 | GPL Ghostscript PostScript/PDF 直譯器-X 顯示支援
`libpoppler156` | V:9, I:16 | 4989 | PDF 渲染庫 (xpdf PDF 瀏覽器的分支)
`libpoppler-glib8t64` | V:68, I:297 | 576 | PDF 渲染庫（基於 Glib 的共享庫)
`poppler-data` | V:150, I:585 | 13086 | 用於 PDF 渲染庫的 CMaps (CJK 支援：Adobe-*)

| 提示
"`gs -h`" 能夠顯示 Ghostscript 的調配資訊。

### 11.4.2. 合併兩個 PS 或 PDF 檔案

你能夠使用 Ghostscript 中的 gs(1) 來合併兩個 PostScript(PS) 或可移植文件格式（PDF） 檔案。

    $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=bla.ps -f foo1.ps foo2.ps
    $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

| 注意
PDF 是用途很廣的跨平臺可印刷的資料格式，它本質上是帶有一些額外特性和擴充的壓縮了的 PS 格式。

| 提示
對於指令列來說，psmerge(1) 和 `psutils` 包中的其他指令在處理 PostScript 文件時是很有用的。`pdftk` 包中的 pdftk(1) 在處理 PDF 文件的時候同樣是很好用的。

### 11.4.3. 處理可印刷資料的工具

如下是處理可印刷資料的工具列表。

表格 11.15. 處理可印刷資料的工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`poppler-utils` | V:106, I:474 | 756 | pdf→ps,text,… | PDF 工具：`pdftops`, `pdfinfo`, `pdfimages`, `pdftotext`, `pdffonts`
`psutils` | V:4, I:51 | 34 | ps→ps | PostScript 檔案轉換工具
`poster` | V:0.1, I:1.7 | 57 | ps→ps | 用 PostScript 頁製作大型海報
`enscript` | V:1, I:11 | 2138 | text→ps, html, rtf | 轉化 ASCII 文字到 PostScript, HTML, RTF 或 Pretty-Print
`a2ps` | V:0.7, I:7.1 | 4109 | text→ps | '任何文字到 PostScript' 的轉換器並且也是相當不錯的列印程式
`pdftk` | V:1, I:22 | 28 | pdf→pdf | PDF 文件轉換工具：`pdftk`
`html2ps` | V:0.1, I:1.7 | 256 | html→ps | 從 HTML 到 PostScript 的轉換器
`gnuhtml2latex` | V:0.05, I:0.58 | 26 | html→latex | 從 html 到 latex 的轉換器
`latex2rtf` | V:0.1, I:2.1 | 495 | latex→rtf | 轉換 LaTeX 文件到能被 Microsoft Word 讀取的 RTF 格式的文件
`ps2eps` | V:2, I:33 | 95 | ps→eps | 從 PostScript 到 EPS（Encapsulated PostScript）的轉換器
`e2ps` | V:0.01, I:0.11 | 104 | text→ps | 帶有日文編碼支援的文字到 PostScript 轉換器
`impose+` | V:0.1, I:1.5 | 118 | ps→ps | PostScript 工具
`trueprint` | V:0.01, I:0.09 | 148 | text→ps | 漂亮的列印許多源程式（C, C++, Java, Pascal, Perl, Pike, Sh, 和 Verilog）到 PostScript。(C 語言)
`pdf2svg` | V:0.2, I:3.0 | 33 | pdf→svg | PDF 到可升級的向量圖形格式的轉換器
`pdftoipe` | V:0.01, I:0.46 | 70 | pdf→ipe | 從 PDF 到 IPE‘s XML 格式的轉換器

### 11.4.4. 用 CUPS 列印

Unix 通用列印系統（CUPS） 中的 lp(1) 和 lpr(1) 指令都提供了自定義列印資料的選項。

你可以使用下列指令中的一個來列印 3 份有裝訂頁碼的檔案。

    $ lp -n 3 -o Collate=True filename

    $ lpr -#3 -o Collate=True filename

你能夠通過 "`-o number-up=2`", "`-o page-set=even`", "`-o page-set=odd`", "`-o scaling=200`", "`-o natural-scaling=200`" 等等印表機選項來進一步定製印表機操作，詳細的文件參見指令列列印和選項。

## 11.5. 郵件資料轉換

下列郵件資料轉換軟體包捕獲了我的眼球。

表格 11.16. 有助於郵件資料轉換的軟體包列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`sharutils` | V:3, I:28 | 1436 | 郵件 | shar(1), unshar(1), uuencode(1), uudecode(1)
`mpack` | V:0.9, I:8.0 | 109 | MIME | 編碼和解碼 MIME 資訊: mpack(1) 和 munpack(1)
`tnef` | V:0.4, I:4.1 | 103 | ms-tnef | 解包 MIME 附件型別 "application/ms-tnef"，該格式僅由微軟使用
`uudeview` | V:0.2, I:1.8 | 105 | 郵件 | 下列格式的編碼器和解碼器: uuencode, xxencode, BASE64, quoted printable 和 BinHex

| 提示
如果郵件客戶端可以配置使用 IMAP4 伺服器，網際網路訊息訪問協議 版本 4 (IMAP4) 伺服器可以用來把郵件從專有郵件系統裡面移出來。

### 11.5.1. 郵件資料基礎

郵件 (SMTP) 資料需要被限制為 7 位資料序列。二進位制資料和 8 位文本資料使用 Multipurpose Internet Mail Extensions (MIME) 網際網路多用途郵件擴充套件 和選擇的字元集編碼到 7 位格式。(參見 表格 11.2, “編碼值和用法的列表”)。

標準的郵件儲存格式是 mbox，它是依據 RFC2822 (由 RFC822 更新) 來的格式. 參見 mbox(5) (由 `mutt` 軟體包提供).

對於歐洲語言,由於沒有什麼 8 位字元，"`Content-Transfer-Encoding: quoted-printable`" 加 ISO-8859-1 字元集通常被用於郵件。如果歐洲文字是被編碼為 UTF-8,由於幾乎全是 7 位資料，使用 "`Content-Transfer-Encoding: quoted-printable`" 也是合適的。

對於日語，傳統的 "`Content-Type: text/plain; charset=ISO-2022-JP`" 通常被用於郵件來保持文字在 7 位。但是老的微軟系統會在沒有宣告的情況下使用 Shift-JIS 來發送郵件。如果日語文字是用 UTF-8 編碼, 由於含有許多 8 位資料，使用 Base64 是合適的。其它亞洲語言也是類似情形。

| 注意
如果你的非 Unix 郵件資料可以通過一個具備和 IMAP4 服務通訊的非 Debian 客戶端訪問，你可以通過執行你的 IMAP4 服務來將郵件資料移出。

| 注意
如果你使用其它郵件儲存格式，第一步把它們移動到 mbox 格式比較好。像 mutt(1) 這樣多功能的客戶端程式可以便捷的完成這類操作。

你可以使用 procmail(1) 和 formail(1) 把郵箱內容分開成每一封郵件.

每一封郵件能夠使用來自 `mpack` 軟體包的 munpack(1) 指令（或其它特異的工具）來獲得 MIME 編碼內容。

## 11.6. 圖形資料工具

雖然像 gimp(1) 這樣的圖形介面程式是非常強大的，但像 imagemagick(1) 這樣的指令列工具在用指令碼自動化處理影象時是很有用的。

實際上的數碼相機的影象是可交換的影象檔案格式(EXIF)，這種格式是在 JPEG 影象檔案格式上新增一些元資料標籤。它能夠儲存諸如日期、時間和相機設定的資訊。

The Lempel-Ziv-Welch (LZW)無損資料壓縮專利已經過期了。使用 LZW 壓縮方式的 圖形互動格式（GIF）工具現在可以在 Debian 系統上自由使用了。

| 提示
任何帶有可移動記錄介質的數碼相機或掃描器都可以在 Linux 上通過 USB 儲存讀取器來工作，因為它遵循相機檔案系統設計規則並且使用 FAT 檔案系統，參考節 10.1.7, “可移動儲存裝置”。

### 11.6.1. 圖形資料工具（元軟體包）

下列元軟體包是用 aptitude(8) 搜尋影像資料工具的一個好的起點。“Debian 影像工具維護團隊的軟體包概覽” 能夠作為另外一個起點。

表格 11.17. 圖形資料工具列表（元軟體包）

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`education-graphics` | I:0.35 | 25 | svg，jpeg，…… | 用於影像教學和圖片藝術的元軟體包。
`open-font-design-toolkit` | I:0.04 | 9 | ttf, ps, … | 用於開放字型設計的元包

| 提示
在 aptitude(8) （參考節 2.2.6, “aptitude 搜尋方式選項”）中用正規表達式 "`~Gworks-with::image`" 來查詢更多的影象工具。

### 11.6.2. 圖形資料工具（GUI 圖形使用者介面）

下列 GUI（圖形使用者介面）的圖形資料轉換、編輯和管理工具的軟體包捕獲了我的眼球。

表格 11.18. 圖形資料工具（GUI 圖形使用者介面）列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`gimp` | V:44, I:216 | 32791 | 圖形(點陣圖） | GNU 圖形處理程式
`xsane` | V:9, I:129 | 1512 | 圖形(點陣圖） | 用於 SANE 的基於 GTK 的前端圖形介面 (現在存取掃描器就很簡單了)
`scribus` | V:1, I:13 | 32423 | ps/pdf/SVG/… | Scribus DTP 編輯器
`libreoffice-draw` | V:82, I:418 | 10995 | 圖形（向量） | LibreOffice 辦公套件-繪畫
`inkscape` | V:12, I:78 | 112538 | 圖形（向量） | SVG（可升級向量圖形)編輯器
`dia` | V:1, I:17 | 3802 | 圖形（向量） | 圖表編輯器（Gtk）
`xfig` | V:0.6, I:8.9 | 7951 | 圖形（向量） | 在圖形介面下，互動式的生成影象變得方便
`gocr` | V:0.5, I:3.9 | 549 | image→text | 免費 OCR 軟體
`eog` | V:26, I:143 | 10524 | 影象(Exif) | Eye of GNOME 影象瀏覽程式
`gthumb` | V:3, I:12 | 5162 | 影象(Exif) | 影象瀏覽器（GNOME）
`geeqie` | V:3, I:11 | 2903 | 影象(Exif) | 基於 GTK 的影象瀏覽器
`shotwell` | V:14, I:246 | 6334 | 影象(Exif) | 數碼相片管理器（GNOME）
`gwenview` | V:40, I:115 | 6000 | 影象(Exif) | 圖片瀏覽器（KDE）
`kamera` | I:114 | 992 | 影象(Exif) | KDE 上的支援數碼相機的應用軟體
`digikam` | V:1.5, I:8.3 | 324 | 影象(Exif) | 用於 KDE 桌面環境的數字照片管理應用
`darktable` | V:4, I:11 | 35876 | 影象(Exif) | 攝影師的虛擬燈臺和暗房
`hugin` | V:0.5, I:5.6 | 6476 | 影象(Exif) | 全景圖片合成器
`librecad` | V:1, I:14 | 9164 | DXF，…… | 2D CAD 資料編輯器
`freecad` | V:1, I:21 | 112 | DXF，…… | 3D CAD 資料編輯器
`blender` | V:2, I:20 | 92911 | blend, TIFF, VRML, … | 用於動畫的 3D 編輯器
`mm3d` | V:0.02, I:0.21 | 4123 | ms3d, obj, dxf, … | 基於 OpenGL 的 3D 模型編輯器
`fontforge` | V:0.6, I:5.6 | 4054 | ttf, ps, … | 用於 PS，TrueType 和 OpenType 的字型編輯器
`xgridfit` | V:0.01, I:0.08 | 878 | ttf | 用於TrueType 字型的 網格擬合和小字還原技術 的程式

### 11.6.3. 圖形資料工具 (CLI 命令列)

下列 CLI（命令列）的圖形資料轉換、編輯和管理工具的軟體包捕獲了我的眼球。

表格 11.19. 圖形資料工具(CLI 命令列)列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`imagemagick` | V:9, I:278 | 79 | 圖形(點陣圖） | 圖形處理程式
`graphicsmagick` | V:1.0, I:8.6 | 5816 | 圖形(點陣圖） | 影象處理程式（`imagemagick`派生出來的)
`netpbm` | V:27, I:288 | 8435 | 圖形(點陣圖） | 圖形介面的轉換工具
`libheif-examples` | V:0.3, I:3.5 | 438 | heif→jpeg(bitmap) | 轉化 高效能影像檔案格式(HEIF) 到 JPEG、PNG 或 Y4M 格式，用 heif-convert(1)命令
`icoutils` | V:3, I:34 | 221 | png↔ico(bitmap) | MS Windows 符號和游標轉化為 PNG 格式，或者從 PNG 格式轉化為點陣圖格式 (favicon.ico)
`pstoedit` | V:2, I:39 | 1075 | ps/pdf→image(向量) | PostScript 和 PDF 檔案到可編輯的向量圖形的轉換器（SVG）
`libwmf-bin` | V:5, I:83 | 149 | Windows/image(向量) | Windows 元檔案 (向量圖形資料) 轉換工具
`fig2sxd` | V:0.03, I:0.18 | 158 | fig→sxd(向量) | 轉換 XFig 檔案為 OpenOffice.org 繪畫格式
`unpaper` | V:2, I:16 | 417 | image→image | 後處理 OCR 掃描頁面的工具
`tesseract-ocr` | V:8, I:33 | 2209 | image→text | 基於惠普的商業 OCR 引擎的免費 OCR 軟體
`tesseract-ocr-eng` | V:8, I:33 | 4032 | image→text | OCR 引擎資料：用於英文文字的 tesseract-ocr 語言檔案
`ocrad` | V:0.3, I:2.4 | 608 | image→text | 免費 OCR 軟體
`exif` | V:3, I:51 | 335 | 影象(Exif) | 顯示 JPEG 檔案中的 EXIF 資訊的指令列工具
`exiv2` | V:2, I:19 | 429 | 影象(Exif) | EXIF/IPTC 元資料處理工具
`exiftran` | V:1, I:11 | 81 | 影象(Exif) | 改變數碼照相機的 jpeg 影象格式
`exiftags` | V:0.3, I:2.7 | 309 | 影象(Exif) | 從數碼相機的 JPEG 檔案讀取 Exif 標籤的實用工具
`exifprobe` | V:0.2, I:2.1 | 506 | 影象(Exif) | 從數碼圖片中讀取元資料
`dcraw` | V:0.8, I:7.3 | 428 | image(原始的)→ppm | 解碼原始的數碼相機圖片
`findimagedupes` | V:0.1, I:1.1 | 75 | image→fingerprint | 找到相似或重複的影象
`ale` | V:0.02, I:0.16 | 850 | image→image | 合併影象來增加保真度或者用於建立馬賽克
`imageindex` | V:0.2, I:1.2 | 143 | image(Exif)→html | 從圖形中建立靜態 HTML 相簿
`outguess` | V:0.11, I:0.99 | 230 | jpeg,png | 通用的 Steganographic 工具
`jpegoptim` | V:0.6, I:6.0 | 59 | jpeg | 最佳化 JPEG 檔案
`optipng` | V:2, I:40 | 187 | png | 最佳化 PNG 檔案，無失真壓縮
`pngquant` | V:1, I:10 | 62 | png | 最佳化 PNG 檔案，有失真壓縮

## 11.7. 不同種類的資料轉換工具

這裡有許多其他用於資料轉換的工具。在 aptitude(8)（參考 節 2.2.6, “aptitude 搜尋方式選項”） 裡用正規表達式 "`~Guse::converting"`" 來查詢如下的軟體包。

表格 11.20. 不同種類的資料轉換工具列表

軟體包 | 流行度 | 大小 | 關鍵詞 | 說明
--- | --- | --- | --- | ---
`alien` | V:1, I:13 | 150 | rpm/tgz→deb | 把外來的軟體包轉換為 Debian 軟體包
`freepwing` | V:0.00, I:0.02 | 447 | EB→EPWING | 把 "電子書" (在日本流行) 變成單一的 JIS X 4081 格式 (EPWING V1 的子集）
`calibre` | V:7, I:24 | 65193 | any→EPUB | 電子書轉換器和庫管理

你能夠通過如下的指令從 RPM 格式的包中提取資料。

    $ rpm2cpio file.src.rpm | cpio --extract

章 10. 資料管理 |  | 章 12. 編程