LuaLaTeX でコードを書いてみる
(なんか,すっかりシリーズ化しちゃったなぁ。別 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}
と書いてみる。 結果はこんな感じ。
悪かないけど,キーワードの強調表示くらい欲しいよね。
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}
結果はこんな感じ。
おっとお。 原色は派手すぎたか。 まぁ,ここでは分かりやすさ優先ってことで。
実は 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 では,欧文フォントと和文フォントが干渉するので,指定の順番とかうるさかったが,エラく簡単になったものである。
結果はこんな感じ。
数字のゼロに斜線が入っているのがお分かりだろうか。 以前はゼロやバッククォート等の表示で苦労してた気がするが,最近のものなら問題ないようだ。
ちなみに,フォント指定にある AutoFakeSlant
や BoldItalicFeatures={FakeSlant}
といった記述は斜体の定義である。
Inconsolata フォントには斜体やイタリック体はないので $\mathrm{Lua\LaTeX}$ 内部で擬似的な斜体を作るよう指示しているのだ。
ブックマーク
- LaTeXでソースコードを書く - しがないプログラマ(仮)のブログ
- listings.sty: LaTeX パッケージ :
\lstset
について簡単な解説
参考図書
- [改訂第8版]LaTeX2ε美文書作成入門
- 奥村晴彦 (著), 黒木裕介 (著)
- 技術評論社 2020-11-14
- 大型本
- 4297117126 (ASIN), 9784297117122 (EAN), 4297117126 (ISBN)
- 評価
2020年末に第8版が出てたのに気付かなかったよ。可能なら紙の本も買って常に側に置いておくのが吉。版元には PDF 版もある。
-
listings-golang
パッケージは\RequirePackage
コマンドでlistings
パッケージを内部で呼び出しているため,記述上はlistings
パッケージを置き換えることができる。のだが,今回は README にしたがっている。 ↩︎ -
厳密に言うと,今回使うのはオリジナルの Inconsolata を改良した zi4 版である。 ↩︎