【VSCode + WSL】大学のレポート作成のために LaTeX を WSL 上で動かす環境構築をしてみた。 ~ WSL 導入から PDF 出力まで ~

はじめに

この春から大学生になる人はおめでとう。

さて、大学生になると、様々な講義の課題でレポートを課されることが多くなってくる。 レポートの内容は講義によって様々だが、理系のレポートでは数式を多用することになると思う。

高校までは Word を使ってレポートを書いていた人も多いだろうが、Word には数式の入力が非常に面倒くさいという致命的な問題がある。

入力時に重くなるわ、数式を打ち込んで Enter を押したら添字や肩の数字がおかしくなるわ... もう発狂レベル。


そんな悩みを解決するのが、 数式の処理に優れた組版ソフトウェア LaTeX\LaTeX (読み方は「ラテフ」or「ラテック」など)である。

ただ、この LaTeX 、一種のプログラミング言語のようなもので、環境構築やソースコードの記述方法などに癖があり、初心者にはなかなかとっつきにくい代物ではないかと思っている。

Cloud LaTeX のようなクラウド上の実行環境も用意されているが、どうせならローカルに実行環境を整備したい(生成AIツールも使えるしね)。


ということで今回は、 LaTeX の環境構築のやり方について、私の備忘録もかねて書くことにする。

なお、この記事では LaTeX 特有の用語が頻出する。必要に応じて以下の LaTeX 入門用サイトを参照すると良い。

texwiki.texjp.org favicon

環境構築の目標と前提条件

例によって Windows 上に作るともともとの Windows の環境を汚してしまうことになりあまり好きではないので、 WSL を使うことで Linux 仮想環境上に LaTeX のローカル実行環境を構築していく。ちなみに、 WSL 上で行う方が Windows 上で直接実行するよりも早いらしい。

WSL2のLaTeXは速い - Qiitaqiita.com favicon

どのような環境を作るのか

  • 講義の種類・回数ごとにディレクトリを新たに作成し、対応するレポート課題の LaTeX ソースファイルを作成する。
  • LaTeX のコードを書いたら、ショートカットキーから「タイプセット(C++ などで言うコンパイルのようなもの)」をする。ここで用いるドキュメントクラス(後述)は、 LuaLaTeX である。
  • タイプセットが終わったら、 PDF を出力して内容を確認。
  • 必要に応じて、レイアウトの構成や使用する外部のパッケージを指定する「プリアンブル」を外部ファイルから読み込む。

理想的な VScode 上のディレクトリ構成はこんな感じ。

> home/
> └ (LaTeX 実行環境用のディレクトリ名)/ # 名前はなんでもよい

                     ├ (講義名)/
                     |    ├ (講義回)/
                     |       ├ out # ログなどの LaTeX タイプセット時に勝手に出力される様々なファイルの格納場所。 PDF ファイルもここに出力される。
                     |       |   └ (色々なファイル)
                     |       └ report.tex  # レポート用の LaTeX ファイル
                     └ preambles  # プリアンブルを格納するディレクトリ
                          └ preamble.tex  # 機能ごとにプリアンブルを分割する。一つにまとめてもよい。

なお、この記事内ではプリアンブルについては解説しないことにする。

LaTeX にも種類がある

LaTeX を実行するエンジンには、現状大きく分けて3つ存在する。

  • (u)pLaTeX
  • XeLaTeX
  • LuaLaTeX

使用するエンジンによって、若干コマンドの仕様やソースコードの書き方が変わったり、使用できるフォントの種類等が変わってきたりする。 以下の記事を参照するとなんとなくピンと来るかも。

【基本】いろいろあるLaTeXの違いlualatexlab.blog.fc2.com favicon texwiki.texjp.org favicon

今後のことを考えると新規なら LuaLaTeX を使うのが良さそうなので、ひとまずこの記事ではLuaLaTeX をタイプセットのエンジンに使うことを前提として話を進める。

前提条件

今回の環境構築をするにあたって、前提となる条件は以下の通り。

  • OS が Windows である。
  • VScode をインストール済み。

WSL を VScode 上で使えるようにする

以前私が書いた、 AtCoder 用の C++ ローカル実行環境の構築についての記事で同じ内容を触れているので、以下の記事の「WSL を VScode 上で使えるようにする」の項を参照のこと。

【VSCode + WSL】AtCoder 用の C++ 環境構築をしてみた。 ~ WSL 導入から Git によるソースコード管理まで ~yuulisio.com favicon

インストールをすでに終えている場合は、念のため

> $ sudo apt -y update && sudo apt -y upgrade

を実行して、アップデートしておこう。

WSL 環境に TeX Live をインストールする

前項で作成した WSL 環境に、 LaTeX のベースとなる TeX のディストリビューション、「TeX Live」をインストールする。 主に使うのは日本語用のパッケージだけだと思うが、後から足りないパッケージを追加でインストールするのは面倒なので、容量に余裕があるのなら全てのパッケージをインストールするのが良いだろう。

  • Remote 環境に接続した VSCode のターミナル上で次のコマンドを実行する。
> $ sudo apt install texlive-full

fullとあるのでインストールには結構時間がかかる。私の環境では30 ~ 40分ほどかかった。

なお、インストールの途中で

> Pregenerating ConTeXt MarkIV format. This may take some time...

という表示が出たまま処理が止まってしまうかもしれない。 私もこの状況に陥りググってみると、こんな記事がヒットした。

Ubuntu22.04にtexliveをapt installする際にPregenerating ConTeXt MarkIV format. This may take some time...で停止する不具合を回避する方法 - Qiitaqiita.com favicon

結論から言うと、Enter キーを押しっぱにしてゴリ押すことで解決できる。

解決策が予想の斜め上過ぎて笑ってしまうが、とにかくこうすることで無事にインストールは完了。

WSL 環境に LaTeX 用の拡張機能をインストールする

  • 以下の VSCode 拡張機能を好みに応じてインストールする。必ず WSL環境に接続した状態でインストールすること。太字のものは必須の拡張機能である。
    • LaTeX Workshop
    • Japanese Language Pack for Visual Studio Code (VSCode を日本語化するやつ。導入していなければぜひ。)
    • zenkaku
    • Path Autocomplete
    • indent-rainbow

ここでインストールした「LaTeX Workshop」という拡張機能は、 VSCode で簡単に LaTeX の編集やタイプセットを行うことができるものである。 似たような名前の「TeX Workshop」というやつもあるので、間違えないように注意。

VSCode 上での LaTeX のタイプセットの設定をする

  • 拡張機能のインストールが終わったら、 VSCode のsettings.jsonを開き、以下の記事を参考に次の内容を追記する。拡張機能インストールの時点で既にデフォルトの内容が追記されている場合があるが、そのときは適宜書き換えること。
LaTeX Workshop を使いこなす - Qiitaqiita.com favicon
JSON
1.{
2. "[latex]": {
3. "editor.formatOnSave": true,
4. "editor.defaultFormatter": "James-Yu.latex-workshop"
5. },
6. // 自動整形
7. "latex-workshop.formatting.latexindent.args": [
8. "-c",
9. "%DIR%/",
10. "%TMPFILE%",
11. "-y=defaultIndent: '%INDENT%'"
12. ],
13. "latex-workshop.formatting.latex": "latexindent",
14. "latex-workshop.formatting.latexindent.path": "latexindent",
15. "latex-workshop.bibtex-format.align-equal.enabled": true,
16. // インテリセンスを有効化
17. "latex-workshop.intellisense.package.enabled": true,
18. // VSCode ウィンドウ内で PDF プレビューをタブとして表示
19. "latex-workshop.view.pdf.viewer": "tab",
20. // 自動でタイプセットされて編集中に PC が重くなるのを防ぐ
21. "latex-workshop.latex.autoBuild.run": "never",
22. // 日本語文書で単語移動を使うため、助詞や読点、括弧などを区切り文字として指定する
23. "editor.wordSeparators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~? 、。「」【】『』()!?てにをはがのともへでや",
24. // タイプセット後の生成ファイルを出力するディレクトリ名を指定する
25. "latex-workshop.latex.outDir": "out",
26. // タイプセット失敗時に生成されたファイルを削除する
27. "latex-workshop.latex.autoClean.run": "onFailed",
28. // 削除する補助ファイルの拡張子を指定
29. "latex-workshop.latex.clean.fileTypes": [
30. "*.aux",
31. "*.blg",
32. "*.idx",
33. "*.ind",
34. "*.lof",
35. "*.lot",
36. "*.out",
37. "*.toc",
38. "*.acn",
39. "*.acr",
40. "*.alg",
41. "*.glg",
42. "*.glo",
43. "*.gls",
44. "*.ist",
45. "*.fls",
46. "*.log",
47. "*.fdb_latexmk",
48. "*.snm",
49. "*.nav",
50. "*.dvi",
51. "*.synctex.gz"
52. ],
53. // タイプセットのレシピ
54. "latex-workshop.latex.recipes": [
55. // 2回繰り返す
56. {
57. "name": "lualatex*2",
58. "tools": ["lualatex", "lualatex"]
59. },
60. // 1回のみ
61. {
62. "name": "lualatex*1",
63. "tools": ["lualatex"]
64. },
65. // for TUS-report
66. {
67. "name": "latexmk",
68. "tools": ["latexmk"]
69. }
70. ],
71. // タイプセットのツール
72. "latex-workshop.latex.tools": [
73. {
74. "name": "lualatex",
75. "command": "lualatex",
76. "args": [
77. "-synctex=1", // SyncTeX を利用して LaTeX - PDF 間の相互参照を可能にする
78. "-interaction=nonstopmode", // エラーや警告をある程度スキップしてからタイプセットを終了する
79. "-file-line-error", // エラー部分を破線で表示
80. "-output-directory=%OUTDIR%",
81. "%DOC%"
82. ],
83. "env": {}
84. },
85. {
86. "name": "latexmk",
87. "command": "latexmk",
88. "args": [
89. "-synctex=1",
90. "-file-line-error",
91. "-outdir=%OUTDIR%",
92. "%DOCFILE%.tex",
93. "-e", // 環境変数を設定
94. "$ENV{'TEXINPUTS'}='./../../sty/:' . $ENV{'TEXINPUTS'}"
95. ]
96. }
97. ]
98.}

以下、設定内容のいくつかを解説する。 LaTeX Workshop に関する設定の詳細は以下の Github Wiki を参照のこと。

Compilegithub.com favicon

タイプセット後に生成される補助ファイルの扱いについて

LaTeX では、タイプセットを行うと.pdf.logファイルの他にも様々な補助ファイルが生成される。 これを LaTeX ソースファイルと同じ場所に置いておくと邪魔なので、ここでは

JSON
1."latex-workshop.latex.outDir": "out"

として、outディレクトリに入れておくことにしている。

タイプセット正常完了時に不要なファイルが残っているのは少々気持ち悪いが、いちいちすべて削除していると、再度タイプセットを行うときに却って時間がかかってしまうことになる。 これは LaTeX の仕様だと思って割り切るようにしよう。

PDF プレビューについて

JSON
1."latex-workshop.view.pdf.viewer": "tab"

VSCode ウィンドウ内で PDF プレビューをタブとして表示する。 プレビュー表示をするには、タイプセット完了後に LaTeX ソースファイルを選択してCtrl + Alt + Jで可能。 また、 PDF プレビュー内の任意のテキストに対してCtrl + 左クリックで、対応する LaTeX ソースファイルの内容にジャンプすることができる。地味に便利。

タイプセット時に使用するレシピとツールについて

LaTeX Workshop では、タイプセットの方法をプリセットとして保存し、実行時に保存したものの中から選択することができる。

プリセットを保存しておく配列を「レシピ」、各レシピで使用できるタイプセットの方式を「ツール」と呼び、それぞれlatex-workshop.recipeslatex-workshop.latex.toolsで定義できる。

ここではツールを2種類、レシピを3種類登録したが、latexmkについては次項で述べることにする。

まず、ツールの方から見ていく。

JSON
1."latex-workshop.latex.tools": [
2. {
3. "name": "lualatex",
4. "command": "lualatex",
5. "args": [
6. "-synctex=1",
7. "-interaction=nonstopmode",
8. "-file-line-error",
9. "-output-directory=%OUTDIR%",
10. "%DOC%"
11. ],
12. "env": {}
13. },
14.]

nameで指定したツールの名前は、後述するレシピで指定する際に用いることになる。

argsに指定できる引数の一覧と説明は、コマンドラインで

> $ latex --help

としてやると表示されるので、カスタマイズしたい場合は生成AIに聞くなりググるなりするとよい。


次に、レシピの方を見ていく。

JSON
1."latex-workshop.latex.recipes": [
2. {
3. "name": "lualatex*2",
4. "tools": [
5. "lualatex",
6. "lualatex"
7. ]
8. },
9. {
10. "name": "lualatex*1",
11. "tools": [
12. "lualatex"
13. ]
14. }
15.],

toolsには、先ほど作成したツールのnameを書いていく。

ここでlualatex*2のレシピにおいて、"tools": ["lualatex", "lualatex"]と2回同じことをしている理由は、式番号や図表番号、目次の作成など、 LaTeX ソースファイル内で相互参照を行う際に、1回のみのタイプセットだと正しく実行されないからである。

.latexmkrcについて

.latexmkrcは、前述のレシピやツールをそのファイルにまとめて書き、タイプセットの際にそのファイルを指定することで、長ったらしいコマンドを一つにまとめて実行できる便利なファイルである。 ファイルの場所はホームディレクトリ直下が一般的。

実験など、教員側からレポートの体裁を指定される際に.latexmkrcが配布された場合は、ツールとレシピにこれを登録しておこう。

ショートカットキーの設定

タイプセットなどの操作をキーボードから簡単に行えるようにするため、ショートカットキーの設定をする。 ここはお好みの割り当てで構わない。

  • Ctrl + K, -> Ctrl + Sでキーボードショートカットの設定タブを開く。
  • 検索窓にlatexと入力し、任意のコマンドに対してキーボードショートカットの割り当てをする。

拡張機能の設定によってデフォルトで設定されているものもあるが、ユーザ側で変更したものは一番右の「ソース」の欄が「ユーザー」と表示される。

私の場合は、タイプセットにCtrl + Shift + B、 PDF プレビューにCtrl + Shift + V、 LaTeX 文書から PDF プレビューへの参照にCtrl + Shift + Jを割り当てている。

動作確認がてら実際に LaTeX 文書を書いてみる

ここまでで一連の LaTeX 環境構築は完了した。最後に、この環境がきちんと動作するのかの確認を行う。

  • Remote 環境に接続した VSCode のコマンドプロンプト上で WSL のホームディレクトリ直下に移動して、以下のコマンドで任意のディレクトリを作成し、そのディレクトリに移動する。このディレクトリが今後 LaTeX 文書を書いていく作業ディレクトリとなる。ここでは便宜上latexとした。
> $ mkdir latex
> $ cd latex
  • 新規にtest.texというファイルを作成し、以下の内容を記述する。ここに書かれている内容については今は解説しない。気になる場合は各自で調べてみよう。
TEX
1.\documentclass[lualatex]{jlreq}
2.
3.\title{初めての \LaTeX}
4.\author{(あなたの名前)}
5.\date{\today}
6.
7.\begin{document}
8.\maketitle
9.
10.\section{これは見出し}
11.\subsection{これは小見出し}
12.\subsubsection{これはさらに小見出し}
13.数式は $y = ax^2 + bx + c$ のように行内に書くこともできるし,
14.\begin{equation}
15.y = ax^2 + bx + c
16.\end{equation}
17.のように式番号を振ることもできる.
18.
19.\end{document}
  • 記述が終わったら、Ctrl + Shift + Bでタイプセットする。

上の「lualatex*2」を選択。

  • タイプセットが終わったら、Ctrl + Shift + Vで PDF プレビューを表示する。

PDF プレビューの表示

  • LaTeX ソースファイルの10~17行目のいずれかを選択した状態でCtrl + Shift + Jとすると、対応する PDF プレビューの行が赤くハイライトされる。
  • PDF プレビューの任意の行をCtrl + 左クリックすると、対応する LaTeX ソースファイルの行にカーソルがジャンプする。
  • test.texと同じ階層にoutディレクトリが生成されており、その中にtest.pdfが生成されていることを確認する。これが LaTeX ソースコードによって生成された PDF ファイルだ。課題などで PDF ファイルの提出を求められた場合は、これを提出すればよい。

もしこのように動作しない場合、特にタイプセットや PDF プレビューがうまくいかない場合は、前述の設定をもう一度確認してみよう。

おわりに

以上で、冒頭に示した環境を構築することができた。

工程が多いので、予期せぬエラーなどで途中で詰まってしまうことは十分あり得るだろう。

エラーが出てきたら生成AIに聞いたり自分で調べてみたりするのはもちろんだが、それでもなかなか解決しないかもしれない。行き詰ったら最初からやり直してみるのも一つの手であろう。


新学期からのレポート作成で少しでも楽をして、単位取得に集中できるようにしよう。