Ubuntu18.04LTS/latexmk/docker-compose/zathuraを使って薄い本を書く

# ゴール
- Docker内でTex Live/latexmkを動かして（ホスト環境に変更を加えずにtexファイルを自動でコンパイルするため），
- ホスト側でzathuraを動かしながら（vimのキーバインドで出来上がりのpdfを確認するため），
- vimを使って薄い本を作成する．

# 使用するもの
- Docker（仮想環境を簡単/便利に扱えるツール）
- docker-compose（複数の仮想環境を簡単に扱えるツール）
- TeX Live（$\TeX$関連のもろもろのファイルが入ったディストリビューション）
- zathura（vimのキーバインドが使える軽量PDFビューアー）

# 手順
## 1. 必要なファイルを作成/ダウンロードする
```bash:bash
$ cd
$ mkdir techbook
$ cd techbook
$ touch main.tex # メインのtexファイル
$ touch test01.tex # 第1章のtexファイル
$ touch test02.tex # 第2章のtexファイル
$ touch Dockerfile # 既に作られているのを拝借．感謝！
$ touch docker-compose.yml # Dockerコマンド打つのがめんどいのでdocker-composeを使用
$ touch .latexmkrc # 自動コンパイル用の設定ファイル
$ curl -O https://raw.githubusercontent.com/h-kitagawa/plistings/master/plistings.sty # コード内で日本語をきちんと表示する
```
```tex:main.tex
\documentclass[dvipdfmx, uplatex, b5paper, papersize, 11pt]{jsbook}
\usepackage{amsmath,amssymb} % 数式の機能を拡張
\usepackage{layout} % レイアウトを表示する.
\usepackage{ascmac} % 囲み線を入れる.
\usepackage{makeidx} % 索引を使う.
\makeindex % 索引の元ファイルを作成する.
\usepackage[dvipdfmx]{hyperref} % PDF内で外部リンクや文書内リンクを生成する.
\usepackage[dvipdfmx]{pxjahyper} % 日本語のしおりを出力する.
\usepackage[dvipdfmx]{graphicx} % .png画像を表示する.
\usepackage{float} % figure, tableの位置をコントロールする.
\usepackage{color} % 色を使用する.
\usepackage{listings} % コードを表示する.
\usepackage{plistings} % コード表示時に日本語をきちんと表示する.
\def\lstlistingname{コード} % コードのタイトルを"コード"にする.
\usepackage{tcolorbox} % 色付きのboxを使用する.
\usepackage{fancybox} % 囲み文字を表示する.
\setcounter{tocdepth}{2} % 目次にsubsubsectionまで入れる.

\title{{\Huge LaTeXを使った薄い本の書き方}}
\author{山田太郎\footnotemark[1] taro@example.com}
\date{\today}

\begin{document}
\pagenumbering{roman} % 目次までをローマ数字でナンバリングする.
\maketitle % タイトルを出力する.
\input{introduction/main.tex}

\renewcommand{\thefootnote}{\fnsymbol{footnote}}
\footnotetext[1]{\url{https://example.com}}
\renewcommand{\thefootnote}{\arabic{footnote}}

\tableofcontents % 目次を出力する.

% \layout

\pagenumbering{arabic} % 目次よりあとをアラビア数字でナンバリングする.
\input{test01.tex} % 第1章のファイルをインプットする．
\input{test02.tex} % 第2章のファイルをインプットする．
\printindex % 索引を出力する.
\end{document}
```
```tex:test01.tex
\chapter{\LaTeX の使用例}
\section{数式}
\begin{equation}
y=ax+b
\end{equation}

\section{コード}

\begin{lstlisting}[caption=hoge,label=fuga]
#include<stdio.h>
int main(){
  printf("Hello world!");
}
\end{lstlisting}

\section{索引}
免疫\index{めんえき@免疫}とは，体内に病原菌\index{びょうげんたい@病原体}や毒素その他の異物が侵入しても、それに抵抗して打ちかつ能力．
```
```tex:test02.tex
\chapter{LaTeXをインストールする}
\section{ほげ}
```
```dockerfile:Dockerfile
FROM paperist/alpine-texlive-ja
```
```yaml:docker-compose.yml
version: '3'
services:
  texlive:
    image: paperist/alpine-texlive-ja
    build: .
    volumes:
      - .:/workdir
    command: sh -c "latexmk --pvc main.tex"
```
```perl:.latexmkrc
#!/usr/bin/env perl
$latex      = 'uplatex -halt-on-error -file-line-error %O %S';
$out_dir    = '/workdir';
$bibtex     = 'upbibtex';
$dvipdf     = 'dvipdfmx %O -o %D %S';
$makeindex  = 'upmendex %O -o %D %S';
$max_repeat = 5; # 最大コンパイル回数
$pdf_mode   = 3; # 0：pdf化しない, 1：pdflatexを使用, 2：ps2pdfを使用, 3：dviファイルからpdfを作成する
# %O：実行時オプション
# %S：入力ファイル名
# %D：出力ファイル名
# %B：処理するファイル名の拡張子を除いた文字列

# 古い出力ファイルの保存数
# pdfビューアーにevinceを使用したときに差分を見るために使用
$pvc_view_file_via_temporary = 0;

# 好きなビューアーを指定する
# $pdf_previewer = "evince";
$pdf_previewer = "ls"; # コンテナ内で動かすのでlsを使用
```

## 2. docker-composeを使って，コンテナ内でtexファイルを自動コンパイルする
1つ目のターミナルで以下を実行してログを確認する．

```bash:bash
$ sudo docker-compose up --build
# Ctrl+C で終了
```

## 3. zathuraを使って，コンパイルされたpdfファイルを確認する
```bash:bash
# --forkオプションを付けてバックグラウンドでzathuraを実行する
$ zathura --fork main.pdf
# Ctrl+Q で終了
```

## 4. 好きなエディタとドキュメントを見ながら薄い本を作成していく．

# 参考文献
- [Paperist/docker-alpine-texlive-ja](https://github.com/Paperist/docker-alpine-texlive-ja)
- [モダンなLaTexで書いたレポートを簡単にdockerでPDFに変換してCIで配布する方法](https://qiita.com/eisoku9618/items/423a3638a727ea2846d5)
- [Latexmkから学ぶPDF化までの処理の流れ](https://qiita.com/Rumisbern/items/d9de41823aa46d5f05a8)