Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

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

はじめに

大学に入学してから2か月が経ち、様々な講義の課題でレポートを課されることが多くなってきた。最も使い慣れている文書編集ツールと言えばお馴染みの Microsoft Word なのだが、理系学生がレポートを書くうえで大きな問題となるのは、数式の入力が非常に面倒くさいところである。

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


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

ただ、この LaTeX 、一種のプログラミング言語のようなもので、環境構築やソースコードの記述方法などに癖があり、初心者にはなかなかとっつきにくい代物ではないかと思う。私もこの LaTeX を使い始めてある程度慣れるまでに1か月要した。クラウド上の実行環境も用意されているが、どうせならローカルに実行環境を整備したい。ということで今回は、 LaTeX の環境構築のやり方について、私の備忘録もかねて書くことにする。

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

texwiki.texjp.org

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

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

qiita.com

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

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

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

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

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

LaTeX にも種類がある

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

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

lualatexlab.blog.fc2.com

texwiki.texjp.org

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

前提条件

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

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

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

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

yuulis.hatenablog.com

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

$ 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...

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

qiita.com

結論から言うと、 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」というやつもあるので、間違えないように注意。

marketplace.visualstudio.com

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

拡張機能のインストールが終わったら、settings.jsonを開き、以下の記事を参考に次の内容を追記する。拡張機能インストールの時点で既にデフォルトの内容が追記されている場合があるが、そのときは適宜書き換えること。

qiita.com

{
...
    // 追記ここから
    
    // インテリセンスを有効化
    "latex-workshop.intellisense.package.enabled": true,
    // VSCode ウィンドウ内で PDF プレビューをタブとして表示
    "latex-workshop.view.pdf.viewer": "tab",
    // 自動でタイプセットされて編集中に PC が重くなるのを防ぐ
    "latex-workshop.latex.autoBuild.run": "never",
    // 日本語文書で単語移動を使うため、助詞や読点、括弧などを区切り文字として指定する
    "editor.wordSeparators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~? 、。「」【】『』()!?てにをはがのともへでや",
    // タイプセット後の生成ファイルを出力するディレクトリ名を指定する
    "latex-workshop.latex.outDir": "out",
    // タイプセット失敗時に生成されたファイルを削除する
    "latex-workshop.latex.autoClean.run": "onFailed",
    // 削除する補助ファイルの拡張子を指定
    "latex-workshop.latex.clean.fileTypes": [
        "*.aux",
        "*.blg",
        "*.idx",
        "*.ind",
        "*.lof",
        "*.lot",
        "*.out",
        "*.toc",
        "*.acn",
        "*.acr",
        "*.alg",
        "*.glg",
        "*.glo",
        "*.gls",
        "*.ist",
        "*.fls",
        "*.log",
        "*.fdb_latexmk",
        "*.snm",
        "*.nav",
        "*.dvi",
        "*.synctex.gz"
    ],
    // タイプセットのレシピ
    "latex-workshop.latex.recipes": [
        // 2回繰り返す
        {
            "name": "lualatex*2",
            "tools": [
                "lualatex",
                "lualatex"
            ]
        },
        // 1回のみ
        {
            "name": "lualatex*1",
            "tools": [
                "lualatex"
            ]
        }
    ],
    // タイプセットのツール
    "latex-workshop.latex.tools": [
        {
            "name": "lualatex",
            "command": "lualatex",
            "args": [
                "-synctex=1",  // SyncTeX を利用して LaTeX - PDF 間の相互参照を可能にする
                "-interaction=nonstopmode",  // エラーや警告をある程度スキップしてからタイプセットを終了する
                "-file-line-error",  // エラー部分を破線で表示
                "-output-directory=%OUTDIR%",
                "%DOC%"
            ],
            "env": {}
        },
    ],

    // 追記ここまで
...
}

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

github.com

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

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

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

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

PDF プレビューについて

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

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

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

LaTeX Workshop では、タイプセットの方法をプリセットとして保存し、実行時に保存したものの中から選択することができる。プリセットを保存しておく配列を「レシピ」、各レシピで使用できるタイプセットの方式を「ツール」と呼び、それぞれlatex-workshop.recipeslatex-workshop.latex.toolsで定義できる。

私の場合は専ら LuaLaTeX を使うことにしているので、 LuaLaTeX のみを使ったレシピを登録している。今後の講義でエンジンが明確に指定されたらその都度加えるつもりである。

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

"latex-workshop.latex.tools": [
        {
            "name": "lualatex",
            "command": "lualatex",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-output-directory=%OUTDIR%",
                "%DOC%"
            ],
            "env": {}
        },
    ]

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

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

$ latex --help

としてやると表示されるので、カスタマイズしたい場合はググりつつやってみると良い。


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

"latex-workshop.latex.recipes": [
        {
            "name": "lualatex*2",
            "tools": [
                "lualatex",
                "lualatex"
            ]
        },
        {
            "name": "lualatex*1",
            "tools": [
                "lualatex"
            ]
        }
    ],

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

《補足》.latexmkrcについて

他の LaTeX 環境構築記事を見ていると、しばしばホームディレクトリ直下に.latexmkrcというファイルを作成して、前述のレシピやツールをそのファイルにまとめて書くというような事例がある。長ったらしい LaTeX のタイプセットコマンドを一つにまとめておけるのは確かに優れていると思うのだが、 VSCodeLaTeX Workshop を入れて使用するのであれば、そこまでの魅力はないように思える。.latexmkrcを使用したとしても、結局レシピとツールのところにその.latexmkrcを指定する必要があるからだ。

したがって、この記事では.latexmkrcを使わずにsettings.jsonにそのまま実行するコマンドの内容を書くスタイルを取っている。

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

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

  1. Ctrl + K, -> Ctrl + Sでキーボードショートカットの設定タブを開く。
  2. 検索窓にlatexと入力し、任意のコマンドに対してキーボードショートカットの割り当てをする。
拡張機能の設定によってデフォルトで設定されているものもあるが、ユーザ側で変更したものは一番右の「ソース」の欄が「ユーザー」と表示される。

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

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

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


1. Remote 環境に接続した VSCodeコマンドプロンプト上で WSL のホームディレクトリ直下に移動して、以下のコマンドで任意のディレクトリを作成し、そのディレクトリに移動する。このディレクトリが今後 LaTeX 文書を書いていく作業ディレクトリとなる。ここでは便宜上latexとした。

$ mkdir latex
$ cd latex

2. 新規にtest.texというファイルを作成し、以下の内容を記述する。ここに書かれている内容については今は解説しない。気になる場合は各自で調べてみよう。

\documentclass[lualatex]{jlreq}

\title{初めての \LaTeX}
\author{(あなたの名前)}
\date{\today}

\begin{document}
\maketitle

\section{これは見出し}
\subsection{これは小見出し}
\subsubsection{これはさらに小見出し}
数式は $y = ax^2 + bx + c$ のように行内に書くこともできるし,
\begin{equation}
    y = ax^2 + bx + c
\end{equation}
のように式番号を振ることもできる.

\end{document}

3. 記述が終わったら、Ctrl + Shift + Bでタイプセットする。

上の「lualatex*2」を選択。

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

こんな感じに表示されただろうか。

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


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

おわりに

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

工程が多いので、予期せぬエラーなどで途中で詰まってしまうことは十分あり得るだろう。エラーが出てきたら自分で調べてみるのはもちろんだが、それでもなかなか解決しないかもしれない。行き詰ったら最初からやり直してみるのも一つの手であろう。 WSL という仮想環境上で環境構築を行う大きなメリットは、このような時に簡単にリセットすることができる点だ。詳細は次の《おまけ》の項を参照してほしい。

今回は LaTeXVSCode の WSL 上で動かす最低限の環境を構築した。 LaTeX を使って様々な数式を書いていくには、独特な仕様や文法を理解する必要がある。今後はこのブログでも少しずつ紹介していくつもりである。

《おまけ》WSL のディストリビューションを削除してやり直す場合

注意 : ディストリビューションを削除すると、既存のデータはすべて失われる。 LaTeX 環境以外の環境がすでにある場合は、バックアップを取っておくか、新規のディストリビューションを作成することをおススメする。


次の記事を参考に、WSL のディストリビューションを削除して、「WSLターゲット」>「ディストリビューションを追加する」を選択するところからやり直すことができる。

zenn.dev

1. 既存のディストリビューションを確認。

$ wsl -l -v

2. 削除したいディストリビューションNAMEを指定して削除。

$ wsl --unregister (削除したいディストリビューション名)

3. 削除されたことを確認。

$ wsl -l -v