LaTeX のマイプリアンブル解説

## はじめに
こんにちは，工学部計数工学科３年生の実数（[@rityo_math](https://twitter.com/rityo_math)）です．
これは[物工/計数Advent Calendar 2020](https://adventar.org/calendars/4940)の12日目の記事です．

さて，この記事は作成者がプリアンブルで使っている設定について解説しています．この記事を書いた理由は，

- LaTeX のパッケージ布教
- ついでに LaTeX 初級者に基礎知識を与えることのできる記事があるといいなあ，と思った
- ~~アドベントカレンダーを10日以上滞納しているため~~

といったところです．この記事が「程よい」難易度設定になっているかは読者の意見を待ちたいところですが……．あと，比較的最近の TeXLive を使っていることを仮定して説明している箇所が多いので注意してください．一応 TeXLive 限定のところはその都度補足したつもりです．

## プリアンブル
まず自分が使っているプリアンブルから貼りましょう．

```latex:preamble.tex
\documentclass[uplatex,dvipdfmx,a4paper]{bxjsarticle}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{shadows}
\usepackage{otf}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{comment}
\usepackage{amsmath,amssymb,amsthm}
\usepackage{amsfonts}
\usepackage{mathtools}
\usepackage{bbm,bm}
\usepackage{hyperref}
\usepackage{pxjahyper}
\usepackage{physics}
\usepackage{float}
\usepackage{cancel}
\DeclareMathOperator{\Ker}{Ker}
\DeclareMathOperator{\res}{Res}
\let\Im\relax
\DeclareMathOperator{\Im}{Im}
\newcommand{\define}{\overset{\triangle}{\Leftrightarrow}}
\newcommand{\C}{\mathbb{C}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\N}{\mathbb{N}}
\newcommand{\Q}{\mathbb{Q}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\F}{\mathcal{F}}
% \middle の代わりに \relmiddle を付ける
\newcommand{\relmiddle}[1]{\mathrel{}\middle#1\mathrel{}}
\renewcommand{\thesubsection}{(\alph{subsection})}
\DeclareMathOperator{\llog}{\mathrm{Log}}
\allowdisplaybreaks[4]
\begin{document}
```
長いですが，一通り説明していきます．

#### １行目
　本当はここはちゃんと本腰を入れて説明したいんですが，処理系の説明をし始めると記事がいくつあっても足らないので，外部サイトに丸投げしながら概略を説明していきます． 
　texファイルをコンパイルするとき，実はどの処理系でコンパイルするか，という選択肢があります．そしてこれによって Unicode に対応しているかや，組版の制御能力などが変わってきます．どういう処理系があるかは[TeXWiki/LaTeX入門/発展編](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E7%99%BA%E5%B1%95%E7%B7%A8)あたりを参考にしてください．Unicode なんてどうでもいいと思う人もいるかもしれませんが，「①」のような特殊文字が何の工夫も無しにそのまま入れられると考えれば割と魅力的だと思います．これができる処理系の１つが upLaTeX です． upLaTeX の良さについては @zr_tex8r さんの[記事](https://qiita.com/zr_tex8r/items/297154ca924749e62471)も参考にしてください．ここでは upLaTeX を使うために `\documentclass` のオプション（`[]`の中身）に `uplatex` を含めています．ただし， upLaTeX を使うためにはコンパイル時に使用する処理系も upLaTeX に切り替える必要があることに注意してください．
　`dvipdfmx` は画像出力まわりのためのおまじないのようなもので，ここで一度書いておけば後は書いておく必要はありません[^dvipdfmx]．
[^dvipdfmx]: 他のパッケージを読み込むときに `\usepackage[dvipdfmx]{graphicx}` とかするとエラーが起きます．詳しくは[この記事](https://qiita.com/zr_tex8r/items/442b75b452b11bee8049)を参考にしてください．また，XeLaTeX や LuaLaTeX のような処理系はそもそも dvipdfmx を書く必要がありません．
　`a4paper` は出力するファイルの印刷サイズ指定で，A4 の紙で印刷するように書いてあります．そのままですね．
　ここのオプションは他にも画像のサイズだけ確保して画像本体を読み込まないことでコンパイルを高速化する `draft` とかがあるので，暇な人は調べてみてください[^exa]．
[^exa]: 調べるなら[『LaTeX2e 美文書作成入門』](https://gihyo.jp/book/2020/978-4-297-11712-2)が良いと思います．ネット記事はドキュメントクラス（後述）による違いに言及しているものが少ないので……．
　最後にドキュメントクラスについても解説します．ドキュメントクラスは一言でいえば，tex ファイルの種類を指定するためのものです．例えばこれまで使われてきたクラスでは，`jsarticle` は論文やレポート向け（章を持たない），`jsreport` は長めのレポート向け（章を持つ），`jsbook` は書籍向け（ページの偶奇によってレイアウトを変えられる），といった感じです．詳しくは [`jsclasses` のドキュメント](https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/macros/latex/contrib/jsclasses/jsclasses.pdf)を参照してください．これらは広く使われているのですが，pLaTeX，あるいは upLaTeX に依存しているという欠点を抱えていました．そこで最近になって [Bxjscls](https://texwiki.texjp.org/?BXjscls)という，どの処理系にも対応できるドキュメントクラスが開発されました．処理系の切り替えが簡単に行えることがメリットの１つです．そのため，ここではその１つである `bxjsarticle` クラスを用いたコードを示しました．もちろん`jsarticle` クラスなどを用いても良いのですが，このプリアンブルのように同時に `otf` パッケージを読み込んでいる場合はフォントメトリックの設定上，うるさい警告が大量に出るのが難点です[^declarefont]．
[^declarefont]: もちろん Warning を表示しないように設定することもできます．`\DeclareFontShape`というコマンドをプリアンブルに書き連ねることになるのですが，詳細は[TeXWiki/よくある質問#bf583189](https://texwiki.texjp.org/?%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%B3%AA%E5%95%8F#bf583189)を参照してください．

## 本題

　以下，本題であるパッケージの説明（布教）を始めます．が，その前にパッケージのドキュメント（英語）の探し方について説明しておきます．方法は２つあって，１つが[CTAN](https://ctan.org/)で検索し，出てきたパッケージのページのPackage documentを見る．もう１つは TeXLive 限定で，ターミナル（Windows は PowerShell）で `texdoc (探したいパッケージの名前)`を打つ，というものです[^pack]．基本的に後者の方が楽なので後者を推奨します．
[^pack]: これで何も出なかったら使っているディストリビューションが TeXLive ではないか， PATH が通っていないか，あるいはそのパッケージがインストールされていない，あたりを疑うと良いと思います．

#### `graphicx` パッケージ
　画像や図を挿入するために必要なパッケージです．すぐ下の`tikz`パッケージを読み込む場合はそのときに自動で読み込まれるので要らなかったりしますが，一応紹介しておきます．ところで画像を挿入する場合は PDF 形式で挿入すると，縮小によって画質が落ちるのを防げて便利だったりします．
#### `tikz` パッケージ，付属ライブラリ
　一言でいえば図や絵を描くためのパッケージです．あまりに多機能なので１つのパッケージに納めず，メインとなる `tikz` パッケージといくつかの付属するライブラリに機能を分散させるという方法が取られています．詳細は[公式ドキュメント](http://ftp.jaist.ac.jp/pub/CTAN/graphics/pgf/base/doc/pgfmanual.pdf)（1320ページあるので容量注意）を参照してください．ここでは，ライブラリの１つ `shadows` ライブラリを `\usetikzlibrary{shadows}` によって読み込んでいます．自分が実際に絵を描くときは一旦[mathcha.io](https://www.mathcha.io/)の Drawing Area 機能で描いてからそれを TikZ 出力したものをコピペしてくる，といった使い方をすることが多いです[^ketten]．容量が巨大すぎて読み込みに時間がかかるので，絵を描くときだけ読み込むようにするのが良いかもしれません．

[^ketten]: 欠点として，TikZ コードに変換する段階でテキストの位置がズレやすいことが挙げられます．仕様を理解していれば自力で調整できるレベルではありますが……．
#### `otf` パッケージ，`fontenc` パッケージ，`lmodern` パッケージ
　先ほどの @zr_tex8r さんの[記事](https://qiita.com/zr_tex8r/items/297154ca924749e62471)の通りです．フォントメトリックとフォントエンコーディングがいい感じになります．`lmodern`は欧文フォント限定の話なので，日本語でしか使わない人は入れなくてもいいかもしれません．
#### `comment` パッケージ
　コメント環境を定義してくれる．LaTeX では行中に `%` を入れることでそれ以降をコメントアウトしてくれるが，実は複数行のコメントアウト機能はデフォルトでは実装されていません．これを可能にしてくれるのがこのパッケージで，`\begin{comment}`～`\end{comment}`の中身がすべて無視されます．素敵ですね．「それくらいデフォルトで実装しろ」とか言ってはいけません．
#### ams系パッケージ
　非常によく使われるので詳しくは説明しません．LaTeX のデフォルトに入っていない二項演算子もだいたい `amsmath`，`amssymb` に入っていたり，あとは `align` だとか `cases` といった数式環境も全部 `amsmath` によるものです．[amsmathの数式環境まとめ](https://qiita.com/t_kemmochi/items/a4c390b4967b13f3afb7)は一度目を通しておくと良いでしょう．
#### `mathtools` パッケージ
　あまり知名度は無く，マニアックなコマンドが多いパッケージです．例えば，矢印の上下に文字列を置きたく，さらに文字列の長さに応じて矢印が伸縮してほしいときに使う
#### `bbm`，`bm`パッケージ
　`bm`は太字ベクトルを書きたいときに便利なパッケージです．単純に `\textit{\textbf{a}}` などどするよりもスペーシングがいい感じになるので素敵です．`bbm` は `\textbb{1}` にあたるものが欲しくなったときに１度だけ使いました．
#### `hyperref`パッケージ，`pxjahyper`
　ハイパーリンクを挿入したいときとか単に URL を貼りたいときに使います．これも詳細な説明は[公式ドキュメント](https://www.ctan.org/pkg/hyperref)を読んでください，ということになるんですが，日本語の場合はちょっと特殊な扱いが必要になります．
　これまた詳しくは[外部サイト](https://www.isc.meiji.ac.jp/~mizutani/tex/link_slide/hyperlink.html)に丸投げするんですが，一言でいえば日本語が文字化けを起こすのを防ぐために `pxjahyper` パッケージも読み込んでください，ということになります．また，URL に特殊文字（`&`や`%`など）が含まれている場合の対応方法のところも合わせて読んでおくと良いと思います．
#### `physics`パッケージ
　「たまにTwitterで便利パッケージとして流れてくるパッケージ第１位」であるところの`physics`パッケージです．詳細な説明は分かりやすい[公式ドキュメント](https://www.ctan.org/pkg/physics)に丸投げしてしまいますが，特に便利なのはやはり偏微分でしょう．本来は`\frac{\partial}{\partial x}`などと書く必要があるのが`\pdv{x}`だけで済むようになります．後はブラケット記法なんかも充実しています．公式ドキュメントに一度目を通しておくと良いでしょう．
#### `float`パッケージ
　画像を「何が何でもこの場所に置きたい！」というときに使うパッケージです．デフォルトでは`\begin{table}[h]`や`\begin{figure}[h]`とオプションを指定すると，「可能ならこの場所に入れる」くらいの意味合いしか持ちませんが，このパッケージを読み込んで`h`を`H`に変えると「かならず」その場所に配置されるようになります．ちなみにかつてはこれと同機能を持つ`here`というパッケージがあったのですが，実態が変わったようです．
#### `cancel`パッケージ
　このパッケージ名は「この項がキャンセルする」の cancel です，つまり打消し線です．これは実物を出した方が分かりやすいと思うので貼っておきます．`\cancel`，`\bcancel`，`\xcancel` だけの組み合わせですがこれくらいのことが可能になります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498769/bfd902a0-400c-ea97-be8b-e1396da524bc.png)
#### `\DeclareMathOperator，\newcommand`
　まず，新しいコマンドを定義したい場合は`\newcommand{(定義したいコマンド)}{(そのコマンドの内容)}`という構文で定義することができます．
　ただし，引数が入る場合や定義したい名前のコマンドがすでに存在する場合，定義したいコマンドの前後に「ちょうどよい」空白が欲しいときはこの限りではありません．引数が入る場合については`\relmiddle`のものを参考にしてください[^relmid]．その他の話は学科の先輩が[blogで](https://tobetakoyaki.hatenablog.com/entry/2019/07/14/190000)分かりやすく解説してくださっていたので，そちらを参照してください．

[^relmid]: ちなみにこの`\relmiddle`は集合の内包的記法（例：$\\{x\in\mathbb{R}|0\leq x\leq 1\\}$）に出てくる縦棒のためだけに定義されたものです．といっても[このページ](https://zrbabbler.hatenablog.com/entry/20120411/1334151482)のものをそのまま持ってきただけです．演算子の扱いに関する解説は面白いと思うので TeX 使い（を目指す人）にはオススメです．
#### `\allowdisplaybreaks[4]`
　`align`環境は非常に便利なのですが，デフォルトでは式の途中で改ページを許さないというちょっと困った性質があります．つまり，半ページほど残った状態で１ページ近くある数式を連続して書くと，半ページ分が丸々飛ばされて次のページから数式が始まります．この`\allowdisplaybreaks[i]`の`i`（$0\leq i\leq 4,\ i\in\mathbb{Z}$）が改ページのしやすさを表していて，デフォルトが０です．先ほどの「困った性質」を避けるために上のプリアンブルではもっとも改ページが起きやすくなるように，すなわち４に設定しています．

## 定理環境が欲しいとき
　スペースの関係でコードの説明が難しいので[自分が１年前に書いた記事](https://qiita.com/rityo_math/items/5ef248024b294d72799a)に丸投げします．（ごめんなさい）（実際は TeX コマンドを使ってもっと複雑なことになっているが，本質的にはこの記事及びその参考文献と同じです）．

## ソースコードを貼りたいとき
　アルファベットだけのコードならば `listing` パッケージを使えば大丈夫です．しかし，コメント等で日本語が入ってる場合は `jlisting` パッケージを使う必要があり，こいつは 2020 年現在 TeXLive には含まれていません．
　
なのでこのパッケージを[こういった場所](https://osdn.net/projects/mytexpert/downloads/26068/jlisting.sty.bz2/)から落としてくる必要があります．ググればいろいろ出てくるんですが，一番安直な設定方法はダウンロードした jlisting.sty を tex ファイルと同じ場所に置くことです．ちゃんとやりたいなら[TeXWiki/LaTeX入門/各種パッケージの利用](https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E5%90%84%E7%A8%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%88%A9%E7%94%A8)あたりを参考にしてよしなに設定してください．

　後日，TeXLive にも`jvlistings`パッケージがあるということを知りました．基本的にはこちらで代替できると思います（2022年4月7日追記）．

## フォント埋め込みをするといい話
　前々から「１つ記事を書くほどでもないけどどっかには書いておきたいなあ」，くらいの気持ちでいたのでついでにここで書いておきます．LaTeX では最終的に PDF を生成するわけですが，このときに PDF にフォントを埋め込むようにすると良いという話があります．理由は単純で，埋め込みを行わないと PDF を開くビューワーの設定のフォントで読み込まれるために見栄えがかなり違って見える，ということが往々にして起こるためです．
　設定自体は[このあたり](https://texwiki.texjp.org/?cmd=read&page=TeX%E3%81%A8%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88&word=mac%20%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%20%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%20ipa#q1b5e62f)に詳しく記載されています．なお，この設定による副作用として生成される PDF ファイルの容量が大きくなることがあります．そこだけは注意してください．

## 最後に
　自分が使っているパッケージを説明（布教）するという目標は達成できましたが，処理系の違いにまで突っ込んで説明ができなかったのが悔やまれるところです．まあ『LaTeX2e 美文書作成入門』に軽く書いてあると言ってしまえばそれまでなんですが……．

## 更新履歴

2022年4月7日　hyperref, physics パッケージの公式ドキュメントのリンクが切れているという指摘をいただいたので修正．さらにjvlistingsパッケージについて追記．

<!--
## LaTeX のコンパイル via ターミナル

## VSCode の LaTeXWorkShop について
最後になりましたがこれも説明しておきたかったことではあるので，急ぎ足で説明しておきましょう．VSCode は最近流行りのエディタ[^editor]で，この VSCode に LaTeXWorkShop という拡張機能を入れると LaTeX が簡単に書ける！みたいなやつがありますね．設定方法の記事自体は Qiita だけでもたくさんヒットするので設定方法は説明しません[^itsuka]．
こいつが何をしているかについてざっくりとだけ説明しておきます．英語が読める人は[ LaTeXWorkShop の公式ドキュメント](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)を読みに行ってください．ここではとりあえず`settings.json`のお手本を貼っておきます．

```java:settings.json
      "latex-workshop.latex.tools": [
        {
          "command": "ptex2pdf",
          "args": ["-interaction=nonstopmode", "-u", "-l", "-ot", "-kanji=utf8 -synctex=1", "%DOC%"],
          "name": "ptex2pdf-jikkou"
        }
    ],
    "latex-workshop.latex.recipes": [
        {
          "name": "uplatex*2",
          "tools": ["ptex2pdf-jikkou", "ptex2pdf-jikkou"]
        }
        {
          "name": "platex*2",
          "tools": ["ptex2pdf-jikkou", "ptex2pdf-jikkou"]
        }
    ],    
```

とりあえず適切な場所にある`settings.json`に以上の内容を書いた状態で，Ctrl+Shift+P を押して `Build with recipe`を選ぶと uplatex*2 が選択肢として出ます．これを選んだときに実行される処理は`latex-workshop.latex.recipes`にて定義されています．`uplatex*2`を`name`に持つ要素がそれです．ここでは，`ptex2pdf-jikkou`という処理を２回繰り返すように指定されています．さらにこの処理は`latex-workshop.latex.tools`の中身で定義されていて，
-->


[^editor]: エディタは本来は単に「プログラムを書くためのアプリケーション」のことです．まあ最近のエディタは本文に出てきた VSCode のようにやたら高機能になっていてこの定義には収まっていないところはありますが……．
[^itsuka]: いつか補足的な記事が書けるといいなあ，とは思っていますが，身の回りに TeXShop にこだわり続ける~~逆張り~~人がそこそこいるのであまり必要性を感じることができていないんですよね……．