如何使用 LaTeX 輸出豎版排版的文章或書籍?


簡單的文字豎排,可以參考http://tex.stackexchange.com/questions/38593/rotating-text-by-90-degrees。(劉海洋也不在知乎。。。)

這種豎排只適合簡單的豎排,如橫排文檔中穿插的一小段豎排文字。

這類豎排是使用宏/外部轉換驅動來實現的,局限性很大,最好的辦法是使用引擎內建的。

真正意義上能夠很好處理豎排的分為兩個系列的TeX引擎:

  • Omega系,我在以前的答案中提到過,這個引擎已經過時了,但是用來豎排,這個引擎的功能是非常強大的。Omega系有幾個擴展:Aleph(Omega+e-TeX),exTeX(Omega+e-TeX+NTS)和LuaTeX(pdfTeX+Aleph+Lua)。總體狀況是Omega和Aleph過時,exTeX開發爛尾(如果能完成,這個還是很牛的,但是就是因為太大了,開發跟不上去),LuaTeX還處在排除bug時期(接收的Aleph代碼刪減太大,導致豎排功能太爛)。
  • pTeX系,這個國內介紹的很少,所以我敢保證我在這個答案中寫的很多部分是在國內首發的。pTeX這個名字展開來是publishing TeX,是日本ASCII公司的大野俊治、倉沢良一和濱野尚人開發的針對日語的TeX引擎。從1987年開始算起,這個引擎的資格絲毫不老,現在在日本,首選使用的還是pTeX,XeTeX和LuaTeX的流行時最近幾年的事情。pTeX的資料,曾經在TUG的刊物TUGboat上有一篇http://www.tug.org/TUGboat/tb11-3/tb29hamano.pdf,這個文章簡短地介紹了pTeX,在這裡,很明顯地提到了豎排。其實Omega的代碼是在1991年凍結的,但是二者在代碼上應該沒有互相借鑒。pTeX有幾種擴展:epTeX(e-TeX+pTeX),upTeX(支持Unicode),eupTeX(eTeX+upTeX)。現在推薦使用的是eupTeX,在TeX Live下,啟動的upTeX就默認是eupTeX。

下面仔仔細細說一下pTeX的衍生版本的情況,情況如下:

  • pTeX(見http://ascii.asciimw.jp/pb/ptex/)。這個是在2010年收入TeX Live中的,能夠正常使用,而MikTeX下面的pTeX好像會工作不正常,故不推薦在MikTeX下使用。pTeX原來只支持JIS編碼,不支持Unicode,後來黑木裕介等人開發了ptexenc才解決Unicode編碼問題。這裡不推薦使用pTeX的原因是避免編碼和一部分配置問題。pTeX有一個網頁版本:http://oku.edu.mie-u.ac.jp/~okumura/texonweb/。
  • epTeX/eupTeX(見http://sourceforge.jp/projects/eptex/)。開發者是北川弘典(同時也是LuaTeX-ja的領頭開發者),epTeX是他在東京大學研究生時候的作品,而eupTeX是在upTeX出來後合併代碼的產物。
  • upTeX(見http://homepage3.nifty.com/ttk/comp/tex/uptex.html)。upTeX是土村展之開發的,現在應該在関西學院大學。這個擴展對於Unicode的支持很好,在2012年的時候被合併到TeX Live中。upTeX有一個網頁版:http://glc.l.u-tokyo.ac.jp/texonweb/。

必須聲明的是pTeX不能直接生成pdf而是生成dvi文件,需要使用dvipdfmx來將生成的dvi轉換成pdf。這個有一個歷史遺留問題,在1995年的時候pTeX終於是基於TeX3.0的了,也給LaTeX的NFSS字體框架打補丁做成了pLaTeX,但是在其後的整整十年中都沒有太大的變化,都是直接生成dvi的,可能是日本那些印表機以及印刷單位都可以直接列印dvi文件太安逸了,一直都沒能有直接生成pdf文件的擴展,等到了北川弘典這裡,才有了一個合併e-TeX的擴展,在2009年的時候,日本的TeX年會才有人提出「我們的pTeX是不是該直接生成pdf呢?」。結果,也沒起太大作用,倒好在2010年的時候,LuaTeX-ja項目開始,將pTeX的很多特性都以宏包的形式移植到LuaTeX下了。

生成pdf呢,需要使用dvipdfmx這個工具,我們下文會有介紹。這裡先說個pTeX與生成的pdf相關的問題,字體嵌入性。pdf這種格式和PostScript格式一樣都支持不嵌入字體,簡單說,就是在生成的文件中只寫入字體的名字,而不讀取這個字體的數據,這種做好處和壞處都不少:好處呢,就是生成pdf的時候不需要你再本地安裝這個字體且生成的文件也比較小(這種pdf拿去印刷的時候才會在印表機驅動中調用字體,在印刷方面無需擔心,在Linux/Mac OS X下面對付這種非嵌入字體比較簡單,如果安裝了就會渲染成這種字體,如果沒安裝就基本上顯示黑體);壞處呢,就是不同的閱讀器對待非嵌入字體的策略不同,很多閱讀器直接顯示方塊或者乾脆亂碼掉。pdf的字體的嵌入問題,請區分對待:送去印刷廠能直接輸出的還是非嵌入好些,其他情況建議嵌入字體,只是dvipdfmx一個參數的事情。

接下來介紹一下pTeX本身的字體處理方式:

  • jfm。這個和tfm相對應,但是和tfm(細節見http://en.wikipedia.org/wiki/TeX_font_metric)有些不同,jfm管的更多的是標點壓縮。tfm和jfm的擴展名都是tfm,所以在處理的時候需要相當小心,西文字體的tfm文件、pTeX的jfm文件和upTeX的jfm文件互相不兼容,這個是有點讓人抓狂。如果想要轉換成可讀的文件,請分別使用tftopl、ptftopl和uptftopl。相反,想生成二進位文件需要分別使用pltotf、ppltotf和uppltotf。嗯,你是不是要瘋了?我還要指出一點,jfm分為橫排和豎排的兩種,如upschrm-h.tfm用於橫排而upschrm-v.tfm用於豎排。
  • jvf。這個和vf文件對應,實現的是虛擬字體機制(見http://www.tex.ac.uk/cgi-bin/texfaq2html?label=virtualfonts)。vf文件是處理dvi文件的程序需要調用到的文件。西文字體需要用vptovf處理(需要相應擴展名為.vpl的文件),而在pTeX系列中就容易多了,直接上makejvf處理pTeX的tfm就可以了。實際上vf文件在生成PostScript文件的時候用到的比較多,而對於生成pdf,作用已經不是那麼明顯了,例行公事。

強調一遍,我們下面開始全部使用的是upTeX。

下面我們跳過上面這些東西,給出一個簡單的例子(我給出的是修改版,詳情見http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?upTeX%2CupLaTeX):

documentclass{utarticle}

% CJK語言字體設定

DeclareFontFamily{JT2}{schrm}{}

DeclareFontFamily{JY2}{schrm}{}

DeclareFontShape{JT2}{schrm}{m}{n}{&<-&>s*[0.962216]upschrm-v}{}

DeclareFontShape{JY2}{schrm}{m}{n}{&<-&>s*[0.962216]upschrm-h}{}

DeclareFontShape{JT2}{schrm}{bx}{n}{&<-&>s*[0.962216]upschgt-v}{}

DeclareFontShape{JY2}{schrm}{bx}{n}{&<-&>s*[0.962216]upschgt-h}{}

DeclareRobustCommandschrm{kanjifamily{schrm}selectfont}

egin{document}

parindent2zw

section{中國語?簡體字 {schrm 簡體中文}}

{schrm

我第二次到仙岩的時候,我驚詫於梅雨潭的綠了。

梅雨潭是一個瀑布潭。仙瀑有三個瀑布,梅雨瀑最低。走到山邊,便聽見花花花花的聲音;抬起頭,鑲在兩條濕濕的黑邊兒里的,一帶白而發亮的水便呈現於眼前了。

我們先到梅雨亭。梅雨亭正對著那條瀑布;坐在亭邊,不必仰頭,便可見它的全體了。亭下深深的便是梅雨潭。這個亭踞在突出的一角的岩石上,上下都空空兒的;彷彿一隻蒼鷹展著翼翅浮在天宇中一般。三面都是山,像半個環兒擁著;人如在井底了。這是一個秋季的薄陰的天氣。微微的雲在我們頂上流著;岩面與草叢都從潤濕中透出幾分油油的綠意。而瀑布也似乎分外的響了。那瀑布從上面衝下,彷彿已被扯成大小的幾綹;不復是一幅整齊而平滑的布。岩上有許多稜角;瀑流經過時,作急劇的撞擊,便飛花碎玉般亂濺著了。那濺著的水花,晶瑩而多芒;遠望去,像一朵朵小小的白梅,微雨似的紛紛落著。據說,這就是梅雨潭之所以得名了。但我覺得像楊花,格外確切些。輕風起來時,點點隨風飄散,那更是楊花了。——這時偶然有幾點送入我們溫暖的懷裡,便倏的鑽了進去,再也尋它不著。

}

end{document}

將上面的文字保存到一個文件中,比如zh-test.tex,之後使用cmd或者終端:

uplatex zh-test dvipdfmx zh-test

之後就是生成了一個zh-test.pdf的文件,這個文件約為5kb。這個文件之中並沒有嵌入字體,Win下建議使用Adobe Reader閱讀(現在的版本為XI,在讀這個文件的時候會提示要下載字體包,你盡量去下吧,沒問題的,XI版本的簡體繁體日文韓語的字體全在一個文件中,全部安裝上吧),Linux/Mac OS X下都可以閱讀的。效果如下:

對於中文而言,這種豎排效果已經很好了。進一步的處理是配置大量的jfm及jvf文件,dvipdfmx字體映射配置,生成fmt文件:

  • jfm和jvf配置。上面的那個例子用到了upschrm-h.tfm和upschrm-v.tfm等文件,一般情況下將這些文件改名,在使用的時候能分清是橫排用還是豎排用即可。我說過,jfm是配置標點壓縮的東西,upTeX帶的jfm文件有幾種是符合日本JIS標準的,對於國內來說也適用,但是國內的開明式標點等標點樣式需要自己寫好jfm文件。我這裡建議:標點的樣式應固定。這樣每個漢字字體對應只有兩個jfm文件,方便維護。
  • dvipdfmx的配置。dvipdfmx的配置文件名為cid-x.map(可通過執行kpsewhich cid-x.map進行查找),cid-x.map的格式如下:

%% 下面指定的字體是方正書版中的

%% 格式: jfm名字 編碼 字體名

%% 簡體中文的編碼是UniGB-UTF16-H以及UniGB-UTF16-V

%% 其他詳情請仔細查看cid-x.map文件

upfzss-h UniGB-UTF16-H FZSSK.TTF

upfzss-v UniGB-UTF16-V FZSSK.TTF

upfzxbs-h UniGB-UTF16-H FZXBSK.TTF

upfzxbs-v UniGB-UTF16-V FZXBSK.TTF

upfzfs-h UniGB-UTF16-H FZFSK.TTF

upfzfs-v UniGB-UTF16-V FZFSK.TTF

upfzk-h UniGB-UTF16-H FZKTK.TTF

upfzk-v UniGB-UTF16-V FZKTK.TTF

upfzh-h UniGB-UTF16-H FZHTK.TTF

upfzh-v UniGB-UTF16-V FZHTK.TTF

  • 生成fmt文件。這個有意思有一點。來先看看Linux下的情況,你會發現pdftex是一個二進位的程序,而pdflatex是一個指向pdftex的鏈接。這個在Win下也一樣的,pdftex.exe遠比pdflatex.exe要大(前提是不存在pdftex.dll的發行版)。來做一個實驗,把pdflatex.exe複製一下,重命名為zhlatex.exe,接下來在cmd中執行zhlatex "end",那麼會出現「I can"t find the format file `zhlatex.fmt"!」的提示。這個有什麼啟示?這個啟示就是:你可以自己做一個fmt文件之後通過修改相關程序名字的方式調用這個格式。舉個例子,如果你吧upLaTeX格式裡面的字體全部更換成中文字體並重命名為zhLaTeX生成zhlatex.fmt文件,那麼直接把uplatex.exe改名為zhlatex.exe就可以調用你生成的格式。修改字體的相關命令對用戶的要求比較高,得用過很長時間的才可以。如果有人有興趣,可以先了解一下NFSS的工作原理:http://makingtexwork.sourceforge.net/mtw/ch05.html。

題外話:upTeX對於ConTeXt的支持。ConTeXt和LaTeX的設計哲學不同,前者也是在後者之後的很長一段時間才出現的。在科技界還是LaTeX用的比較多,而ConTeXt給人的效果耳目一新,讓人感覺是做文檔的工具(其實ConTeXt的數學包也不錯,但是相對於LaTeX就少許多了)。ConTeXt對中文的支持不佳,不是這個格式差,而是底層的引擎的問題。現在的情況是,XeTeX支持,LuaTeX支持,upTeX支持。XeTeX版本的ConTeXt中文支持有,但是國人用的不多。LuaTeX的ConTeXt中文支持是LiYanrui做的(我自己用的不多,因為速度有些慢)。upTeX版本的ConTeXt中文支持不錯,因為pTeX下面的虛擬字體機制可以讓人輕鬆不少。TeXLive下面是沒有upTeX版本的ConTeXt的,用戶可以選擇W32TeX。在W32TeX下面有下列文件:

  • context-w32.txt,這個是相關說明。
  • line-breaking-jtxt-mkiv.pdf,斷行測試。
  • test-eptex.pdf,這個是個測試文件。

我們可以看看upTeX版本的ConTeXt的相關文件,cont-up.tex:

definebodyfont [12pt] [jisfont]

[tf=upjisr-h at 11.53pt,

bf=upjisg-h at 11.53pt,

it=upjisr-h at 11.53pt,

sl=upjisr-h at 11.53pt,

bi=upjisg-h at 11.53pt,

bs=upjisg-h at 11.53pt,

tfa=upjisr-h at 13.84pt,

tfb=upjisr-h at 16.61pt,

tfc=upjisr-h at 19.93pt,

tfd=upjisr-h at 23.91pt,

sc=upjisr-h at 11.53pt]

definefont[jistfx][upjisr-h at 9.23pt]

definefont[jistfxx][upjisr-h at 6.92pt]

definefont[jisgtfx][upjisg-h at 9.23pt]

definefont[jisgtfxx][upjisg-h at 6.92pt]

要想有好的中文支持,以及快的速度,upTeX版本的ConTeXt是個很好的選擇,只需要更改上述文件中的字體配置。各位,我只能幫你到這兒了。

順帶提一下pTeX中擴展出來的命令(請先看文章,見http://ajt.ktug.kr/2008/0201okumura.pdf):

  • yato和 ate。這兩個命令是讓你確定橫排還是豎排。實際上還有一個dtou命令,也是豎排,但是是從下到上,這個命令只有在一些開發文檔上才能看到。
  • jfont和 font。這兩個命令和TeX原始的font命令一樣,但是分別指定的是橫排和豎排的字體。在pLaTeX擴展的NFSS編碼中,橫排和豎排的字體編碼為JY1和JT1,upLaTeX中相應的編碼為JY2和JT2,LuaTeX-ja中對應的編碼為JY3和JT3。
  • jfam。這個命令是用來定義字體族的,請參考TeX中的fam用法。
  • zh和zw。這兩個是相對單位,類似於tfm中定義的ex和em,指的是一個漢字的高度和寬度,定義來源於jfm中的相關部分。
  • ybaselineshift和 baselineshift。這兩個命令是用來對齊漢字和西文之間的基線的,通常情況下都需要進行調整,讓漢字與西文對齊。
  • kanjiskip和xkanjiskip。有點像TeX中spaceskip,兩個命令分別對應的是:漢字-漢字之間距離,漢字-西文距離。
  • kansuji和kansujichar。前者將阿拉伯數字轉換成漢字,如kansuji 12轉換成「一二」。後者給數字指定漢字,如kansujichar1=`壱。
  • euc,jis和sjis。這個命令相當於char,就是限定了編碼。
  • prebreakpenalty和postbreakpenalty。這兩個命令分別在某個字元前或者字元後添加penalty,以達到避頭尾的效果。如prebreakpenalty`あ=1000。
  • jcharwidowpenalty。這是控制孤行的。
  • xspcode。控制xkanjiskip插入的命令,對象是西文字元,如xspcode`A=0。可選的值為:0,1,2,3。0的情況:禁止在左側插入。1的情況:允許在左側插入。2的情況:允許在右側插入。3的情況:允許兩側插入。
  • inhibitglue。禁止glue插入。
  • autospacing和
    oautospacing
    。允許/禁止漢字-漢字之間插入glue。
  • autoxspacing
    oautoxspacing
    。允許/禁止漢字-西文之間插入glue。
  • inhibitxspcode。和xspcode類似,但是這個命令對象是漢字字元。
  • kcatcode。類似於TeX的catcode。

更新:http://bbs.ctex.org/forum.php?mod=viewthreadtid=74899


使用uplatex zh-test dvipdfmx zh-test報錯,是什麼原因呢

C: exlive&>uplatex zh-test dvipdfmx zh-test

This is e-upTeX, Version 3.14159265-p3.5-u1.11-130605-2.6 (utf8.uptex) (TeX Live

2014/W32TeX) (preloaded format=uplatex)

restricted write18 enabled.

entering extended mode

(./zh-test.tex(guessed encoding: UTF-8 = utf8)

pLaTeX2e &<2011/05/07u00&>+0 (based on LaTeX2e &<2014/05/01&> patch level 0)

Babel &<3.9k&> and hyphenation patterns for 78 languages loaded.

(c:/texlive/2014/texmf-dist/tex/uplatex/base/utarticle.cls(guessed encoding: UTF

-8 = utf8)

Document Class: utarticle 2011/05/07 v1.6_u00 Standard upLaTeX class

(c:/texlive/2014/texmf-dist/tex/uplatex/base/utsize10.clo)

(c:/texlive/2014/texmf-dist/tex/platex/base/plext.sty)) (./zh-test.aux(guessed e

ncoding: UTF-8 = utf8))

銆婄甫緄勩儮銉箋儔銆?[1] (./zh-test.aux(guessed encoding: UTF-8 = utf8)) )

Output written on zh-test.dvi (1 page, 2380 bytes).

Transcript written on zh-test.log.

zh-test -&> zh-test.pdf

[1

dvipdfmx:warning: CMap has higher supplement number than CIDFont: GothicBBB-Medi

um

dvipdfmx:warning: Some chracters may not be displayed or printed.

kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+231/600 --dpi 831 upstht

-v

The command name is C: exlive2014inwin32mktexpk

kpathsea: Running mktexmf upstht-v.mf

The command name is C: exlive2014inwin32mktexmf

name = upstht-v, rootname = upstht-v, pointsize =

mktexmf: empty or non-existent rootfile!

Cannot find upstht-v.mf .

I try ps2pk --&> gsftopk --&> ttf2pk --&> hbf2gf.

Current font seems to be a Japanese one.

I give up to create a PK font.

kpathsea: Appending font creation commands to missfont.log.

dvipdfmx:warning: Could not locate a virtual/physical font for TFM "upstht-v".

dvipdfmx:warning: &>&> There are no valid font mapping entry for this font.

dvipdfmx:warning: &>&> Font file name "upstht-v" was assumed but failed to locate

that font.

dvipdfmx:fatal: Cannot proceed without .vf or "physical" font for PDF output...

Output file removed.


推薦閱讀:

中日韓的漢字字體中哪個比較優秀?電子雜誌的正文用宋體還是黑體好?
設計一款襯線字體的步驟是什麼?需要注意哪些細節?
英文句號後是應該空一格還是空兩格?
使用冬青黑體簡體中文作 Mac OS X 的默認字體時,為什麼在部分軟體的某些顯示狀態下,字體下方出現了較大的空白?
為什麼電腦在處理西文長單詞換行時會出現如下圖示的現象?

TAG:字體排印 | LaTeX |