いものやま。

雑多な知識の寄せ集め

TeXで同人誌を作ってみた。(ビルド環境構築)

f:id:yamaimo0625:20190918075457j:plain

今日からは \TeXを使って学んだことをまとめていく。

なぜ \TeXを使ったか

文章が主体の同人誌を作る場合、組版に使えるソフトはいくつか候補がある。

特に有力なのがRe:VIEW
実績が多く、また同一ソースから複数のファイル形式に出力できる魅力がある。

ただ、以下のようなことからRe:VIEWではなく \TeX\LaTeX)を使うことにした:

1.  \TeXの勉強がしたい

そう、何だかんだでこれが大きい。
勉強で作っている部分もあったので、いろいろ試したかった。

『哲学散歩道』も \TeXで作ったんだけど、デザイン周りは全然触れてなくて、ほぼ素の出力になっている。
なので、 \TeXで本のデザインってどうやったらいいんだろうという疑問がずっと残ってた。
例えば、以下のようなもの:

  • どうやって目次をデザインするのか
  • どうやって見出しをデザインするのか
  • どうやってページレイアウトをデザインするのか
  • トンボや隠しノンブルはどうやって入れればいいのか
  • 断ち切りまで伸ばすのはどうすればいいのか

これらの疑問を解消したくて、 \TeXでの組版にチャレンジしてみた。
実際、いろいろ学べて、今日からの記事はそこで学んだことを忘れないようにするためのもの。

2.  \TeXにメリットがあった

理系だったので、卒論、修論、あるいはレポートで、何だかんだで \TeXは使ってきた。
こうやってブログを書くときにも数式は \TeX記法を使って書いてるし。
なので、これまでにも \TeXにはけっこう触れていて、慣れている部分が多い。
そういう意味で、まったく知らないRe:VIEWを使うよりも心理的障壁は低かったりする。

また、数学の同人誌なので、数式がそれなりに出てくる。
もちろんRe:VIEWでも数式は書けるけど、数式を書くことが分かっているなら、最初から \TeXを使った方が素直と言える。

3. Re:VIEWに不安があった

これもけっこう大きかった。

Re:VIEWはPDFへの出力のバックエンドとして \TeXを使っているので、何か問題があったときには中間出力された \TeXのソースや、あるいはそのソースを出力したRubyのソースと戦うことになる。
何も問題がなければ杞憂ですむのだけど、何かあったときにはその対処コストがちょっと無視できないレベルで大きいのがかなり気になった。

そして、もし問題が起きて結局 \TeXの勉強をしないといけないのなら、最初から素直に \TeXの勉強をした方がいいよね、と。
 \TeXの勉強をしないといけないかもしれないという不安を抱えながら進めるより、 \TeXの勉強をすることを最初からスケジュールに入れておいた方が心理的に安心できる。

実際、Re:VIEWまわりで謎の挙動をして困ったという話はチラホラ見かけた・・・

まぁ、リスクに対してメリットが遥かに大きいから、普通はRe:VIEWを使った方がいいとは思うけど。

 \TeXのインストール

これはRe:VIEWを使う場合も必要。
TeX Wikiを参考にMac TeX 2019(TeX Live 2019にmacOS用のソフトがバンドルされてる)をインストール。

ビルド環境の構築

以下のような感じでビルド環境を作った:

  • \TeXにはupLaTeXを使用
  • 索引作成にはupmendexを使用
  • PDF出力にはdvipdfmxを使用
  • ビルドツールにMakeとlatexmkを使用
  • ドキュメントクラスにBXjsclsパッケージのbxjsbookを使用

upLaTeXは \TeXに日本語用の拡張が入ったpTeX(Publishing TeX)がUnicode対応したupTeXにさらにe-TeX拡張(レジスタ増加など)の入ったe-upTeXでLaTeXフォーマットを読み込むようにしたもの。
何を言ってるのか分からないと思うけど、自分もそう思う。
 \TeXの違法建築っぷりはヤバい。

upmendexは同様にmendexという索引作成ツールがマルチバイト文字に対応したもの。

参考文献の管理にはBibTeXというツールがあり、それをマルチバイト文字に対応させたupBibTeXというものがあるのだけど、今回は使ってない。
BibTeXを使っても使わなくてもあまり手間が変わらなかったのと、ちょっと凝ったことをしたかったのが理由。

latexmk

 \TeX \LaTeX)では相互参照や目次作成のために複数回コマンドを実行しないといけないのだけど、何度もコマンドを打つのは面倒なので簡易的なビルドツールが使われることが多い。
今まではptex2pdfというツールを使ってたのだけど、調べるとlatexmkというツールを使った方がいいようだった。

上記の記事などを参考に以下の.latexmkrcを用意した:

#!/usr/bin/env perl

# Settings for latexmk.
# See https://konn-san.com/prog/why-not-latexmk.html

$latex          = 'uplatex -halt-on-error';
$bibtex         = 'upbibtex';
$dvipdf         = 'dvipdfmx %O -o %D %S';
$makeindex      = 'upmendex %O -g -s index.ist -o %D %S';
$max_repeat     = 5;
$pdf_mode        = 3; # generates pdf via dvipdfmx

最終的にはupBibTeXは使わなかったのだけど、そのまま残してある。
あと、upmendexのオプションで指定している-s index.istはスタイルファイル(これは \TeXのスタイルファイルとは別物)の指定で、索引の出し方を設定するスタイルファイルとしてindex.istを使うということ指示している。
index.istの内容については後日)

latexmkの使い方は、以下:

$ latexmk <対象のTeXソース>

生成物の削除なども行える:

# 生成物をすべて削除
$ latexmk -C

# 中間生成物をすべて削除
$ latexmk -c

Make

latexmkを直接叩いてもよかったんだけど、コマンドを覚えるのもなんだったのでMakeを使った。
Makeを使えばコマンドを覚えてなくてもいいし、あとでコマンド変更の差分を見たりすることが出来る。

Ω<つまりMakeはいにしえのDevOps, Infrastructure as Codeだったんだよ!
ΩΩΩ<な、なんだってー!?

というわけで、以下のようなMakefileを用意した:

.PHONY: all build book ebook clean clean-mid open eopen

BOOK = book.pdf
EBOOK = ebook.pdf
PDF = $(BOOK) $(EBOOK)

COMMON_SOURCE = <includeされるTeXソース> ...

all: build

build: $(PDF)

book: $(BOOK)

ebook: $(EBOOK)

%.pdf: %.tex
  latexmk $<

$(PDF): $(COMMON_SOURCE)

clean:
  latexmk -C

clean-mid:
  latexmk -c

open: book
  open $(BOOK)

eopen: ebook
  open $(EBOOK)

book.texは印刷用の \TeXソース、ebook.texは電書用の \TeXソース。
入り口を2つ用意することで、同一ソースから印刷用と電書用のPDFを両方とも生成できるようにしている。
(各ファイルから共通ソースをincludeしてる)

そして、latexmk自体は指定されたソースが依存しているソースのタイムスタンプまで調べてくれるようなのだけど、フロントエンドとしてMakeを使うとそこまで感知できないので、COMMON_SOURCEとして列挙して依存関係を追加するようにしている。
$(PDF): $(COMMON_SOURCE)の行がそれで、Makeはターゲットとソースの対のあとにコマンドが続かない場合、依存関係だけを追加する)

あとはcleanで生成物の削除、clean-midで中間生成物の削除、openで印刷用PDFのオープン、eopenで電書用PDFのオープンが出来るようにしてある。
(latexmkでPDFのオープンとか開いたままの更新とかあるようなのだけど、実際に試してみると使い勝手がめちゃくちゃ悪かった(たしか端末が対話状態のような感じになってCtrl-Cを押さないと制御が戻ってこなくなったりしたはず)ので、ビルドだけで終わるのか、PDFを開くところまでやるのかなどをコントロールできるようにした)

.gitignore

生成物はバージョン管理の対象から外したいので、.gitignoreに無視するファイルを追加:

*.fls
*.fdb_latexmk
*.aux
*.out
*.toc
*.idx
*.ilg
*.ind
*.log
*.dvi
*.pdf

*.fls*.fdb_latexmkはたしかlatexmkで出力されるファイル。
*.aux*.log*.dvi*.pdfあたりは \TeX(とdvipdfmx)で出力される典型的なファイル。
*.tocは目次のための出力。
*.idx*.ilg*.indは索引のための出力。
*.outは電書のためにページ内リンクをつけると出力される。

bxjsbookドキュメントクラス

ドキュメントクラスとしては、BXjsclsパッケージのbxjsbookを使った。
昔はjsclassesを使うのが普通だったけど、最近はupLaTeX以外でも使えるようにしたBXjsclsを使った方がいいみたい。

上記の記事などを参考にして、book.texおよびebook.texは次のようにした:

\documentclass[autodetect-engine,dvipdfmx-if-dvi,ja=standard,a5paper]{bxjsbook}

% 設定など

\begin{document}

% 本文など

\end{document}

これで最低限のビルド環境は整った感じ。


宣伝です。
気になった人はチェックをお願いします!

今日はここまで!