1. 程式人生 > >LuaLaTeX的中文支援設定與簡單示例

LuaLaTeX的中文支援設定與簡單示例

  LuaLaTeX編譯方式,為我們在LaTeX編輯排版中提供了執行Lua程式碼的功能,這樣一來,對於程式設計師而言就有了更多的發揮空間,LaTeX也變得更有意思。我原來一直在用xeLaTeX編譯方式,這段時間寫UML圖形繪製巨集包時,總有束手束腳的感覺,於是開始轉用LuaLaTeX編譯方式。現在把使用過程中的一些東西記錄於51CTO部落格中。
  
1、中文支援設定
  我使用的是巨集包ctex,以前用的xecjk不能在LuaLaTeX編譯方式下使用。這個巨集包的說明文件下載地址,我已經放在另一篇部落格中。
  
2、listings巨集包報錯的解決方法
  在Ubuntu 16.04中(據說在早期版本中不會報錯),LuaLaTeX編譯方式下使用listings巨集包會報錯。錯誤原因我現在還不清楚,只是在網上找到一個很簡單的處理辦法,就是在導言區加入以下兩句命令:

\newdimen\cht
\newdimen\cdp

  
3、一個簡單的程式碼示例

\documentclass{article}
\usepackage[UTF8]{ctex}% 提供漢字支援
\usepackage{geometry}% 頁面佈局支援
\usepackage{xcolor}
\usepackage{luacode}
%
% 設定字型。注意順序,第一個定義的就是預設字型
\setCJKfamilyfont{song}{FZShuSong-Z01S}% 方正書宋簡體
\newcommand{\song}{\CJKfamily{song}}%
\setCJKfamilyfont{kaiti}{FZKai-Z03S}% 方正楷體簡體
\newcommand{\kaiti}{\CJKfamily{kaiti}}%
\setCJKfamilyfont{heiti}{FZHei-B01S}% 方正黑體簡體
\renewcommand{\heiti}{\CJKfamily{heiti}}% 因為原命令已被ctex中定義過,所以這裡重定義
\setCJKfamilyfont{fangsong}{FZFangSong-Z02S}% 方正仿宋簡體
\renewcommand{\fangsong}{\CJKfamily{fangsong}}% 因為原命令已被ctex中定義過,所以這裡重定義
%

\begin{document}%
\luaexec{%
  math.randomseed(os.time())
  for i = 1, 8 do
    r1 = i * 30 * math.random()
    g1 = i * 30 * math.random()
    b1 = i * 30 * math.random()
    tex.sprint("\\color{rgb:red," .. r1 ..";green, " .. g1 .. ";blue," .. b1 .. "} ")
    tex.sprint("\\fontsize{" .. i * 5 .. "pt}{" .. i * 10 .. "}\\selectfont 海上升明月\\par")
  end
}%

\end{document}%

效果如下:
LuaLaTeX的中文支援設定與簡單示例
說明:
  1) 在巨集包ctex中預設定義了一些字型呼叫的命令,在Ubuntu下預設是使用文鼎系列的,但我習慣使用方正字型,所以對其重新定義。注意這裡的字型檔名並不是我們在其他文字編輯軟體中看到的字型名稱,應該是先找到字型檔案,然後用字型檢視器觀察,如下圖。有些字型不能編譯成功,具體原因現在還不清楚。
LuaLaTeX的中文支援設定與簡單示例
  2) ctex巨集包的編譯速度有些慢,特別是第一次編譯時要多等一下。
  3) 注意程式碼中的語句tex.sprint中,對於反斜槓要使用轉義字元來表示,是不是有點C的味道。呵呵,Lua本身就是由C開發的。