蘋果公司為何用基於 XSL-FO 的 XEP 來生成《iOS Human Interface Guidelines》等文檔的 PDF 版本?相較 TeX 解決方案及 InDesign 等軟體,它有何優勢?
剛才我看到《iOS Human Interface Guidelines》PDF 版本(也就是「MobileHIG.pdf」)的元數據中顯示:編碼軟體為「XEP 4.9 build 20070115」。
但 iPhone 的 User Guide 全都是用 Adobe InDesign 生成的(Adobe PDF Library 編碼)。而 Adobe 自己的幫助文檔是 FrameMaker 生成的(Acrobat Distiller Server 編碼)。
這個東西跟文檔生成的來源有關,Apple 有內部的文檔編寫格式和生成工具 (github 上的 appledoc 是模仿這個格式的一個實現),目標是同時生成便於瀏覽的 HTML 和便於列印的 PDF。作為中間處理 XML 是一個比較好的選擇 (企業出版很少用 TeX,FrameMaker 也是一個企業文檔生成常見的選擇,包括 Adobe、Intel、O"Reilly 和很多產品的使用手冊都是用它),那麼直接轉換為 XSL-FO 就很順理成章了,TeX 相比起來沒有很成熟的 XML 處理方案。
大部分 XSL-FO 的實現都是基於 Java 的,部署在文檔生成伺服器上,帶有濃重的「企業級軟體」的氣息,Apple 內部選擇文檔生成方案的人傾向選擇它也就不奇怪了。另外 TeX 做大規模的文檔生成,性能是比較差的。
InDesign 主要常用於插圖比較多,版面靈活的小冊子,設計師容易上手,Apple 要給普通用戶寫易讀的手冊,而且是在 iPhone 這個時代,首選當然是它也不奇怪了 (雖然很多公司用 FrameMaker 排版的手冊效果也不錯,但 FrameMaker 不支持 OS X,Classic 應用現在也不能跑了)。一直潛水中,謝謝@梁海的邀請。剛才看了一下這幾個PDF,有點明白了。有下面幾點:1. XSL-LO是一種基於XML生成 PDF的東西。XML適合寫邏輯計較好的東西,不用費心考慮字體版式什麼的,相對來說好設置,和寫一個網頁差不多。我覺得這個相對TeX的學習來講,夠簡單的。它的缺點呢,在英文wiki百科上有說明:http://en.wikipedia.org/wiki/XSL_Formatting_Objects#Drawbacks_of_XSL-FO1.1 只適合輕量級設計的文檔,也就是說天花亂墜的效果這個就不可能實現,頁面布局也不好控制1.2 XSL-FO的實現過多,XEP就是一個,這種多實現會帶來問題,兼容性的1.3 不能手動控制排版或者即使手動也效果不大,這個可能是最可怕的,下面是大多數情況下不好控制的:
- Need to restart footnote numbers or symbol sequence on each new page
(however, some implementations provide extensions to support automatic
footnote numbering.) - Need to run text around both sides of a floated object (XSL-FO can
run text around one side and the top and/or bottom, but not both sides;
however, some implementations provide support for such complex layouts
via proprietary extensions.) - Need to have variable numbers of columns on a single page (however,
at least two commercial implementations provide extensions for creating
multi-column blocks within a page.) - Need to have column-wide footnotes (several implementations provide column footnote extensions.)
- Need to have marginalia that is dynamically placed relative to other
marginalia (for example, marginal notes that are evenly spaced
vertically on the page). XSL-FO only provides features for placing
marginalia so that it is vertically aligned with its anchor. - Need to create content that spreads across two pages as a float or
"out of line" object in an otherwise homogeneous sequence of repeating
page masters (this can be done in XSL-FO 1.1 using multiple body regions
and flow maps, but it requires being able to control the page masters
used for those pages.) - Need both bottom-floated content and footnotes on the same page.
- Need to be able to run text against an arbitrary curve (though some implementation support SVG, which can be used to get around this limitation).
- Need to be able to constrain lines to specific baseline grids (for
example, to achieve exact registration of lines on facing pages.) - Anything that requires page-aware layout, such as ensuring that a figure always occurs on the page facing its anchor point.
2. TeX呢,可以接受XML的輸入,也可以不用,TeX本身就有一種xmlTeX的擴展可以讀取以XML寫作的文件,可以偽裝成XSL等引擎輸出的效果,這個是TeX比較牛的地方。這裡來說說TeX的缺點:
2.1 第一個是學習成本的問題,大部分人學習的是LaTeX ,要學習的包比較多,不容易上手,尤其很多新手上來第一個問題可能是中文支持的問題,還有許多雜七雜八的東西,新手沒四五個月學不會的(我指的是學到很精的情況,普通人半個月就能冒充專家了,順便說一點,國內的TeX教程比較少,我推薦Einführung in TeX這本書來從基礎學起,見http://www.http://ruhr-uni-bochum.de/www-rz/schwanbs/TeX/)。更別說plain TeX了。2.2 宏的問題,這個是TeX裡面實現排版高度定製的一個東西,很神奇,也很高效,但是在《UNIX編程藝術》裡面,被數落了一下,原文大意指寫出來的宏可讀性不是很好,不過正面的是Paul Graham這位Lisp大牛就在他兩本Lisp書中提到TeX的宏可以寫出自下而上的東西,也就是說你在排版的時候,寫作宏就是完成排版方面設計的一些細節的東西,寫好了,還可以寫作更高階的宏把這個包括進去,如過多了,就形成了格式,如plain TeX,LaTeX和ConTeXt。2.3 兼容問題,這個兼容問題,TeX也有一些。比如國內用的CCT和CJK只能用到pdfTeX引擎下面,孫文昌的xeCJK只能用在XeTeX下面,日本的LuaTeX-ja只能用到LuaTeX上面。說個不是引擎上的,格式上的,LaTeX兼容問題也有(雖然很多學習LaTeX的被告知輸出的效果很美妙),LaTeX很多包的不同版本是不同的,所以把源文件交給兩個人,排版出來的效果也可能是不一樣的(雖然差別很細小),這個是很頭疼的問題,和不同人用到的發行版關係很大。3. ID這個,我用的不是很多,這個桌面排版是很專業的(前面兩個是幕後排版的,不是WYSWYG的),效果直觀,適合排版很多在視覺設計上要求嚴格的東西,但是要是涉及到技術類的文章,分章節很多,那ID不是個好主意,最好用上面兩者。八卦一下,ID排版演算法裡面吸收了一部分TeX斷行演算法。
總結一下,XSL-FO和TeX都適合懶人寫東西,用ID的人必須勤快。進一步說,XSL-FO更適合程序員什麼的(從w3c上面的XSL文檔上面貢獻者郵箱來看,有IBM,Adobe,Xerox等公司的程序員)寫東西,本身xml的東西就是程序員要掌握的東西,所以用XSL-FO的,尤其是程序員,學起來很容易。最後說說TeX,就一句話,這個是數學排版必備!
我個人對文檔發布的經驗全無,TeX、InDesign和FrameMaker都沒有用過。XSL-FO只是有一點點接觸而已。不過既然收到邀請,我就勉為其難補充一點個人想法。
採用哪種發布工具,如果公司沒有硬性規定,則主要看團隊的自行選擇,這很可能取決於團隊中的少數幾個人。我曾呆過的一個外企,其文檔發布系統是基於PageMaker二次開發的(貌似主要是整合了svn等版本管理工具),而這個系統據說是某兩個德國資深員工幾年來慢慢做出來的。不過我們IT部門的人看到都很頭大,因為咱搞不定這玩意兒,而且還牽涉到PageMaker在不同平台上的license問題。但是現有的文檔已經是基於這個系統了,切換到別的系統的風險實在太大。所以我個人感覺,如果公司比較大的話,不同團隊用不同的發布系統,也是很有可能的,而事後要統一到一套系統的成本和風險都不小,所以可能一直延續下去。
就我個人而言,我對XSL-FO更親近一些,因為這是一個基於XML的方案,能做到內容和格式的完全分離,這帶來極大的靈活性(TeX應該就不行)。並且XSL-FO是W3C的標準, 不會被綁定到一個公司的私有產品。還有就是XSL-FO的模型和CSS相對較近,對於Web開發者有天然的吸引力。我想這也許是採用XSL-FO的理由吧。
說點題外話,我甚至直接用CSS來排版,比如幾年前就用CSS2PDF之類的開源軟體來生成簡歷。這和XSL-FO是極其相似的,源文件可以完全一致,差別只是樣式語言。以前CSS的高級排版能力是非常弱的,且主要是基於西文的排版需求,所以只能用於要求不高的場合,無法用於要求印刷品質的場合。但是現在CSS3加入了大量高級排版特性,而且CSS3搭上了HTML5的快車,按其參與程度和發展速度,很可能會趕超XSL-FO的特性。如W3C的日文興趣小組【更正:應為日文排版任務組(Japanese Layout Task Force)】所做的日文排版需求文檔,基本涵蓋了東亞文字的所有排版需求(這個小組的成員包括了日本排版相關國家標準的撰寫者、微軟公司和多個日本排版公司的專家)。過去那些CSS2PDF的開源軟體在生成包含中文的PDF方面往往有很大問題,但是估計到現在應該已經能解決了,而且最近幾年用CSS語言來做專業排版的也早已有商業軟體了,特別是日本公司,所以這些應該不成問題了。由於最近我又換工作,要寫簡歷,準備再次用CSS來生成PDF,如有啥心得再上來更新。
推薦閱讀:
※有什麼好的鍛煉自己 LaTeX 能力的方法?
※如何提高使用 LaTeX 的水平?
※如何定義一個LaTeX行內代碼環境?
※XeLaTeX 編譯時間太長是什麼原因?
※LaTeX 與 TeX 有什麼本質區別?
