今日からはを使って学んだことをまとめていく。
なぜを使ったか
文章が主体の同人誌を作る場合、組版に使えるソフトはいくつか候補がある。
特に有力なのがRe:VIEW。
実績が多く、また同一ソースから複数のファイル形式に出力できる魅力がある。
ただ、以下のようなことからRe:VIEWではなく()を使うことにした:
1. の勉強がしたい
そう、何だかんだでこれが大きい。
勉強で作っている部分もあったので、いろいろ試したかった。
『哲学散歩道』もで作ったんだけど、デザイン周りは全然触れてなくて、ほぼ素の出力になっている。
なので、で本のデザインってどうやったらいいんだろうという疑問がずっと残ってた。
例えば、以下のようなもの:
- どうやって目次をデザインするのか
- どうやって見出しをデザインするのか
- どうやってページレイアウトをデザインするのか
- トンボや隠しノンブルはどうやって入れればいいのか
- 断ち切りまで伸ばすのはどうすればいいのか
これらの疑問を解消したくて、での組版にチャレンジしてみた。
実際、いろいろ学べて、今日からの記事はそこで学んだことを忘れないようにするためのもの。
2. にメリットがあった
理系だったので、卒論、修論、あるいはレポートで、何だかんだでは使ってきた。
こうやってブログを書くときにも数式は記法を使って書いてるし。
なので、これまでにもにはけっこう触れていて、慣れている部分が多い。
そういう意味で、まったく知らないRe:VIEWを使うよりも心理的障壁は低かったりする。
また、数学の同人誌なので、数式がそれなりに出てくる。
もちろんRe:VIEWでも数式は書けるけど、数式を書くことが分かっているなら、最初からを使った方が素直と言える。
3. Re:VIEWに不安があった
これもけっこう大きかった。
Re:VIEWはPDFへの出力のバックエンドとしてを使っているので、何か問題があったときには中間出力されたのソースや、あるいはそのソースを出力したRubyのソースと戦うことになる。
何も問題がなければ杞憂ですむのだけど、何かあったときにはその対処コストがちょっと無視できないレベルで大きいのがかなり気になった。
そして、もし問題が起きて結局の勉強をしないといけないのなら、最初から素直にの勉強をした方がいいよね、と。
の勉強をしないといけないかもしれないという不安を抱えながら進めるより、の勉強をすることを最初からスケジュールに入れておいた方が心理的に安心できる。
実際、Re:VIEWまわりで謎の挙動をして困ったという話はチラホラ見かけた・・・
#技術書典
— yagitch(やぎっち)@9/22技術書典7-す24D (@yagitch) 2019年9月17日
助けて〜。Re:VIEWで作ったら挿入画像の一部が消えるの。しかもMac/iPadで表示すると消えて、Win+Acrobatだと消えないの。これこのまま入稿しちゃっていいの〜? 締め切りまであと6時間!
Re:Viewで原稿を書いててPDF出力すると謎の空白スペースが入ってしまう現象に困らされた。もちろん元のテキストには空白は入っていない。//list[][内で@<seqsplit>{}が近くにあると発生しやすい。 pic.twitter.com/E3OymLOxjm
— 齊藤貴義@技術書典7お54C『スクレイピング・ハッキング・ラボ』 (@miraihack) 2019年9月16日
こまったなー
— eisaku.TERAO @技術書典7 い54C (@eterao) 2019年9月16日
Re:Viewで突然最後の数ページ出力しなくなったぞ。。。
HTMLにはなってるから、PDFへの変換の所だな。EPUBも同じようにおかしい
まぁ、リスクに対してメリットが遥かに大きいから、普通はRe:VIEWを使った方がいいとは思うけど。
のインストール
これはRe:VIEWを使う場合も必要。
TeX Wikiを参考にMac TeX 2019(TeX Live 2019にmacOS用のソフトがバンドルされてる)をインストール。
ビルド環境の構築
以下のような感じでビルド環境を作った:
- にはupLaTeXを使用
- 索引作成にはupmendexを使用
- PDF出力にはdvipdfmxを使用
- ビルドツールにMakeとlatexmkを使用
- ドキュメントクラスにBXjsclsパッケージのbxjsbookを使用
upLaTeXはに日本語用の拡張が入ったpTeX(Publishing TeX)がUnicode対応したupTeXにさらにe-TeX拡張(レジスタ増加など)の入ったe-upTeXでLaTeXフォーマットを読み込むようにしたもの。
何を言ってるのか分からないと思うけど、自分もそう思う。
の違法建築っぷりはヤバい。
upmendexは同様にmendexという索引作成ツールがマルチバイト文字に対応したもの。
参考文献の管理にはBibTeXというツールがあり、それをマルチバイト文字に対応させたupBibTeXというものがあるのだけど、今回は使ってない。
BibTeXを使っても使わなくてもあまり手間が変わらなかったのと、ちょっと凝ったことをしたかったのが理由。
latexmk
()では相互参照や目次作成のために複数回コマンドを実行しないといけないのだけど、何度もコマンドを打つのは面倒なので簡易的なビルドツールが使われることが多い。
今までは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
はスタイルファイル(これはのスタイルファイルとは別物)の指定で、索引の出し方を設定するスタイルファイルとして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
は印刷用のソース、ebook.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
あたりは(と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}
これで最低限のビルド環境は整った感じ。
宣伝です。
気になった人はチェックをお願いします!
今日はここまで!