2017年1月18日 星期三

以 xeCJK 在 XeLaTeX 處理繁體中英文橫書與直書混排

我們都知道 LaTeX 編譯出來的文件就是比較漂亮。在 MikTeX 中使用 XeLaTeX 編譯,字形部份我沒有設定 family, 以後再來修改。

Update: 如果有需要懶人範本,請參閱這篇文章

\documentclass[12pt,a4paper]{article}
\usepackage{fontspec}
\usepackage{xeCJK}
\setmainfont{Noto Sans} % 英文部份 fontspec 的主字形
\setCJKmainfont{Noto Sans CJK TC DemiLight} % 中文部份 xeCJK 的主字形
\defaultfontfeatures{Ligatures=TeX} % 用 `` 表示英文左雙引號, '' 表示右雙引號
\xeCJKsetup{CJKglue=\hspace{0pt plus .08 \baselineskip }}
\xeCJKsetup{RubberPunctSkip=false}
\xeCJKsetup{PunctStyle=plain} % 標點符號一概全形
\xeCJKsetup{CheckSingle=true} % 首字不放行尾,似乎不太有用
\usepackage{anysize}
\marginsize{.8in}{.8in}{1in}{1in} % 設定邊界
\setlength{\parskip}{.8em} % 段落距 0.8 字
\setlength{\parindent}{2em} % 段落開頭空兩字
\title{埃城記事}
\author{Darren Hsu}
\begin{document}
\maketitle
...
\end{document}

關於在 xeCJK 的 Unicode 原始設定中,沒有包含到注音符號的聲調這件事,需要以修改原始套件的方法改正,二三四輕聲的 Unicode 對應分別是
"02CA, "02C7 , "02CB , "02D9 ,
以工作管理員權限打開 xeCJK.sty, 找尋 "3100 後在下一行貼上上面那行字,存檔重開後編譯即可。


為什麼只用一種字形而不是處理一個 family, 主要是我今天在解決英文為什麼引號都變成全形的問題。後來發現其中的 Noto Sans CJK TC * 這些 Google 出的免費中文黑體字形,我不小心也拿去用來當作英文字形,結果引號就被用簡體中文的方式處理了。英文無襯線字形部份,可以選擇 Noto Sans 的英文字形(就叫做 Noto Sans),這樣就可以完美地以英文引號處理英文,像這樣。




另外如果想要中英直行混排,就會比較複雜。一般的作法是用 glyph rotation 處理,例如說

\documentclass[12pt,a5paper,landscape]{article} %使用 a5 landscape 版面
\usepackage[landscape]{geometry}
\usepackage{fontspec}
\usepackage{xeCJK}
\setmainfont{Noto Sans}
\setCJKmainfont[Vertical=RotatedGlyphs]{Noto Sans CJK TC DemiLight} %旋轉輸出 CJK 字符
%\setCJKmainfont{Noto Sans CJK TC DemiLight} %備用
\setCJKmonofont{Noto Sans CJK TC Regular}
\defaultfontfeatures{Ligatures=TeX}
\xeCJKsetup{CJKglue=\hspace{0.005em plus .08 \baselineskip }} %放鬆字距
\xeCJKsetup{RubberPunctSkip=false}
\xeCJKsetup{PunctStyle=plain}
\xeCJKsetup{CheckSingle=true}
\xeCJKsetup{Verb=false}
\usepackage{anysize}
\marginsize{.5in}{.5in}{.2in}{.2in}
\setlength{\parskip}{0em} %取消段落距
\newcommand*\eng[1]{\raisebox{-.35em}{#1}} %英文環境,降低字的位置
%\newcommand*\eng[1]{{#1}} %備用
\renewcommand{\baselinestretch}{1.5} %改變行距
\setlength{\parindent}{2em} 
\title{埃城記事}
\author{Darren Hsu}
\begin{document}
\maketitle
今日下著雨的埃城讓我想起在台北的冬季,冰冰涼涼的空氣與閃爍的雨滴。ㄘㄜˋㄕˋ
下雨的時候,街上起霧。行人或有撐傘,或有瀟灑淋雨,走在斑馬線上。我開著車緩緩地從 \eng{``Maple's Ave.''} 出發,從 \eng{Noyes St.} 轉上 \eng{Green Bay Rd.} 時,音響放起了\eng{ Loftiðverður skyndilega} \eng{kalt}\eng{ (The air suddenly}\eng{ becomes cold)} ,與間歇作動的雨刷,穩定的引擎聲,一起構成這幅規律而閒適的音聲畫。
\end{document}


出來的成品經過順時針旋轉會像這樣。



在上述 preamble 裡面我調整了紙張為 a5 landscape, 段落距為 0, 並且行距為 1.5 \baselinestretch. 旋轉後似乎因為 depth 的關係英文字會以 0.35 em 的距離浮在中文字上面,不用 raisebox 修正,會長下圖這樣,非常醜,因此自己定義了 \eng wrapping 指令,並且寫到 MikTeX script 裡面,用快捷鍵對每個英文字加入這個環境。另外有兩行被 comment 掉的指令,分別是在想換回去排橫書的時候可以用的。


由於自定義指令 \eng 是把括號裡面的英文字都用 box 包起來,所以沒辦法斷行。只好暫時幾個字幾個字用 \eng 包住,希望 XeLaTeX 夠聰明。你也許可以發現半形括號比較偏左一點,那是因為他們沒有跟著調整位置(未旋轉前是偏下一點),這部份要想一下怎麼改。另外一個問題是頁碼,可能要改絕對座標才行。

沒有留言:

張貼留言