LuaLaTeX でコードを書いてみる

no extension

(なんか,すっかりシリーズ化しちゃったなぁ。別 section にすべきだったか?)

さて,TeX Live 2017 インストール後の「$\mathrm{\TeX}$ で遊ぼう」第三弾は

  • $\mathrm{Lua\LaTeX}$ でコードを書いてみる

である。 といっても $\mathrm{Lua\LaTeX}$ 特有の部分は少ないと思うので,後半のフォント指定以外は $\mathrm{p\LaTeX}$ とかでもいけるだろう。

とりあえず Go 言語による以下のコードを $\mathrm{Lua\LaTeX}$ で書くことを考える。

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println("Hello, world")
    }
}

安直に verbatim 環境を使う手もあるが,世の中には listings パッケージなる便利なものがあるらしい。 これを使ってまずは

\documentclass{ltjsarticle}
\usepackage[no-math,sourcehan]{luatexja-preset} % Japanese fonts

\usepackage{listings}
\lstset{
    frame=single,
    basicstyle=\small\ttfamily,
    tabsize=4
}

\begin{document}

\section{Go 言語による Hello World}

\begin{lstlisting}
package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println("Hello, world")
    }
}
\end{lstlisting}

\end{document}

と書いてみる。 結果はこんな感じ。

code with LuaLaTeX (1)
code with LuaLaTeX (1)

悪かないけど,キーワードの強調表示くらい欲しいよね。 listings パッケージでは language=C++ みたいな感じに言語を指定できるらしい。 じゃあ,ってんで早速 language=Go とかやってみたんだけど「知らんがな」って怒られた。

! Package Listings Error: Couldn't load requested language.

んー。 ってことは誰か Go 言語用の補助パッケージを作ってくれていれば… というわけで探したらありましたよ。

神!!!

というわけで,ここにある listings-golang.sty を取ってきて作業フォルダに置けばいいんだけど,折角なら定常的に使いたいので,以下のフォルダを掘って,そこにリポジトリを git clone してしまった。

  • {$TEXMFLOCAL}/tex/latex/

ちなみに $TEXMFLOCAL の場所は kpsewhich コマンドで調べられる。 いつもの場所だね。

$ kpsewhich -var-value=TEXMFLOCAL
C:/texlive/texmf-local

mktexlsr コマンドで ls-R を更新するのも忘れずに。

では,先程の文書を listings-golang パッケージを使って以下のように書き換える1

\documentclass{ltjsarticle}
\usepackage[no-math,sourcehan]{luatexja-preset} % Japanese fonts

\usepackage{graphicx,xcolor}
\usepackage{listings}
\usepackage{listings-golang} % import this package after listings
\lstset{
    frame=single,
    basicstyle=\small\ttfamily,
    tabsize=4,
    keywordstyle=\color{red},
    stringstyle=\color{blue}
}

\begin{document}

\section{Go 言語による Hello World}

\begin{lstlisting}[language=Golang]
package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println("Hello, world")
    }
}
\end{lstlisting}

\end{document}

結果はこんな感じ。

code with LuaLaTeX (2)
code with LuaLaTeX (2)

おっとお。 原色は派手すぎたか。 まぁ,ここでは分かりやすさ優先ってことで。

実は listings-golang パッケージの中身はそれほど難しくなくて(でも自分でやれって言われたらやっぱり面倒くさいんだけど)

%% Golang definition for listings
%% http://github.io/julienc91/lstlistings-golang
%%
\RequirePackage{listings}

\lstdefinelanguage{Golang}%
  {morekeywords=[1]{package,import,func,type,struct,return,defer,panic,%
     recover,select,var,const,iota,},%
   morekeywords=[2]{string,uint,uint8,uint16,uint32,uint64,int,int8,int16,%
     int32,int64,bool,float32,float64,complex64,complex128,byte,rune,uintptr,%
     error,interface},%
   morekeywords=[3]{map,slice,make,new,nil,len,cap,copy,close,true,false,%
     delete,append,real,imag,complex,chan,},%
   morekeywords=[4]{for,break,continue,range,goto,switch,case,fallthrough,if,%
     else,default,},%
   morekeywords=[5]{Println,Printf,Error,},%
   sensitive=true,%
   morecomment=[l]{//},%
   morecomment=[s]{/*}{*/},%
   morestring=[b]',%
   morestring=[b]",%
   morestring=[s]{`}{`},%
}

という感じでキーワードと文字列とコメントの3つの定義でできている。 このようにして listings パッケージが対応していない言語にも対応できる。

最後に,やっぱタイプライタ文字なら Inconsolata だよね,ってことで,タイプライタ文字を以下のように変更する2

\documentclass{ltjsarticle}
\usepackage[no-math,sourcehan]{luatexja-preset} % Japanese fonts
\setmonofont[AutoFakeSlant,BoldItalicFeatures={FakeSlant},Scale=MatchLowercase]{Inconsolatazi4}

\usepackage{graphicx,xcolor}
\usepackage{listings}
\usepackage{listings-golang} % import this package after listings
\lstset{
    frame=single,
    basicstyle=\small\ttfamily,
    tabsize=4,
    keywordstyle=\color{red},
    stringstyle=\color{blue}
}

\begin{document}

\section{Go 言語による Hello World}

\begin{lstlisting}[language=Golang]
package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println("Hello, world")
    }
}
\end{lstlisting}

\end{document}

昔の $\mathrm{Lua\TeX}$-ja では,欧文フォントと和文フォントが干渉するので,指定の順番とかうるさかったが,エラく簡単になったものである。

結果はこんな感じ。

code with LuaLaTeX (4)
code with LuaLaTeX (4)

数字のゼロに斜線が入っているのがお分かりだろうか。 以前はゼロやバッククォート等の表示で苦労してた気がするが,最近のものなら問題ないようだ。

ちなみに,フォント指定にある AutoFakeSlantBoldItalicFeatures={FakeSlant} といった記述は斜体の定義である。 Inconsolata フォントには斜体やイタリック体はないので $\mathrm{Lua\LaTeX}$ 内部で擬似的な斜体を作るよう指示しているのだ。

ブックマーク


  1. listings-golang パッケージは \RequirePackage コマンドで listings パッケージを内部で呼び出しているため,記述上は listings パッケージを置き換えることができる。のだが,今回は README にしたがっている。 [return]
  2. 厳密に言うと,今回使うのはオリジナルの Inconsolata を改良した zi4 版である。 [return]