はじめに
これまでLaTeXを用いた文書作成ではOverleafを利用しておりましたが、UIに関して次のように個人的に不便に感じる点がありました。
- 複数のファイルを切り替えるためのタブ機能がない
- ファイル間移動が弱い
- プロジェクト全体の検索機能が弱い
- ファイルやフォルダの作成にショートカットキーが割り当てられていない
- GitHubとの連携が有償プランでしか利用できない
- Vim キーバインドがあるけれども物足りない
- AI機能が...
この記事では、これらの点を解消し、より快適な執筆環境を求めて、Windows 環境の WSL (Windows Subsystem for Linux) 上に構築した NeoVim (AstroNvim) で、LaTeX の開発環境をセットアップする手順について解説します。
LuaLaTeX を利用して、日本語を含む文書のコンパイルとプレビューができるようになることを目指します。
対象読者
- Windows + WSL 環境でLaTeXを利用している方
- もちろん Vimmer の方
- Overleaf やその他クラウドサービスのUIに満足していない方
- Gemini CLI や Codex 等とAI連携したい方
環境
本記事の構築手順は、以下の環境を前提としています。
- OS: Windows 11
- WSL: Ubuntu 24.04.2 LTS
- Neovim: v0.12.0-dev
- AstroNvim: v5.3.6-dev
1. TeX Live のインストール
まず、WSL (Ubuntu) に TeX Live をインストールします。TeX Live は LaTeX のディストリビューションの一つで、必要なパッケージがまとめて含まれています。
sudo apt update
sudo apt install texlive-full -y
texlive-full
はサイズが非常に大きい (数GB) です。ディスク容量を節約したい場合は、texlive-base
や texlive-latex-recommended
などがありますが、執筆中にインストール作業をしたくないのでなるべく避けられるように full を入れました。
2. AstroNvim の LaTeX 設定
私は NeoVim の環境は AstroNvim を利用しています。
AstroNvim のセットアップについては以下をご参照ください。
AstroNvim Community には LaTeX のため設定セットが存在するのでそちらを利用させていただきました。
~/.config/nvim/lua/community.lua
に下記を追記します。
-- ~/.config/nvim/lua/community.lua
return {
"AstroNvim/astrocommunity",
:
{ import = "astrocommunity.markdown-and-latex.vimtex" },
:
}
デフォルトのセットアップは下記のコードの通りです。
このコードを ~/.config/nvim/lua/plugins/vimtex.lua
を作成してコピーし、Viewer の設定を行います。
gWSL があり、Linux 上でPDF Viewerをインストールしてもよかったですが、どうしてもウィンドウ操作が思い通りにならなかったり、ボタンの位置がズレたりと不都合が多い場合があるので、Windows上にViewerアプリをインストールすることにしFした。
SyncTeX に対応した Windows の PDF Viewer として今回は SumatraPDF を選択しましたが,他にも Okular が対応しているようです。
では、SumatraPDF を選択した場合の設定方法を記します。上記でコピーしておいた vimtex.lua に viewer の実行アプリとオプションを指定します。
return {
"lervag/vimtex",
lazy = false,
config = function()
-- 以下追加
vim.g.tex_flavor = "lualatex"
if vim.fn.has('win32') == 1 or (vim.fn.has('unix') == 1 and vim.fn.exists('$WSLENV') == 1) then
if vim.fn.executable('SumatraPDF.exe') == 1 then
vim.g.vimtex_view_general_viewer = 'SumatraPDF.exe'
vim.g.vimtex_view_general_options = '-reuse-instance -forward-search @tex @line @pdf'
end
end
-- 以上追加
end,
dependencies = {
"AstroNvim/astrocore",
:
},
}
WSL であるかどうか判定するために (vim.fn.has('unix') == 1 and vim.fn.exists('$WSLENV') == 1)
を追加していますが、他のプラットフォームで NeoVim を扱わない場合はこの判定は不要でしょう。
ここで vimtex のヘルプを確認しながら設定を試行錯誤していましたが、結局そのまま general_viewer と general_options を設定するだけで動作しました。
3. サンプル文書の作成とコンパイル
設定が完了したら、動作確認用の .tex
ファイルを作成します。
\documentclass[a4j,12pt]{ltjsarticle}
\title{LuaLaTeX のテスト}
\author{AstroNvim User}
\date{\today}
\begin{document}
\maketitle
\section{はじめに}
これは LuaLaTeX を使った日本語の文書です。
WSL 上の NeoVim (AstroNvim) で快適な \LaTeX{} 環境を構築します。
\end{document}
NeoVim でこのファイルを開き、VimTeX の VimtexCompile
コマンドを実行するとタイプセットが開始されますが、このままでは LuaLaTeX をエンジンに指定できていないためコンパイルエラーになります。以下の内容の latexmkrc を test.tex と同じ場所に作成し、タイプセットの設定を行います。
ホームディレクトリに .latexmkrc
というドットファイルを作成すると、各プロジェクトごとに作成せずともその設定が利用されるようになります。
$lualatex = 'lualatex -synctex=1';
$pdflualatex = $lualatex;
$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B';
$bibtex = 'bibtex %O %B';
$makeindex = 'mendex %O -o %D %S';
$max_repeat = 5;
$pdf_mode = 4;
$pvc_view_file_via_temporary = 0;
各行の設定について説明文を生成しましたので、内容について理解がしたい方はご確認ください。内容は合っていると思います。
$lualatex = 'lualatex -synctex=1';
- 目的: lualatex コマンドの具体的な実行内容を定義しています。
- 詳細:
- lualatex: LuaLaTeXエンジンを使ってコンパイルします。
- -synctex=1: SyncTeX
を有効にするためのオプションです。これにより、生成されたPDFファイルと元の
.tex ソースコードの間で相互ジャンプが可能になります(PDFの特定の位置をクリ
ックするとエディタの該当箇所に飛ぶ、など)。
$pdflualatex = $lualatex;
- 目的: PDFを生成する際の lualatex コマンドとして、上で定義した $lualatex
の設定をそのまま使うように指定しています。 - 詳細: latexmk は -pdf オプションを付けた際にどのコマンドを使うかを
$pdflualatex で判断するため、このように同じ設定を割り当てています。
$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B';
- 目的: 参考文献処理ツール biber の実行コマンドを定義しています。biblatex
パッケージと組み合わせて使います。 - 詳細:
- biber: biber プログラムを呼び出します。
- %O: latexmk が受け取ったオプションを biber
に渡すためのプレースホルダです。 - --bblencoding=utf8: 出力する .bbl
ファイルのエンコーディングをUTF-8に指定します。 - -u: 入力ファイル(.bib など)のエンコーディングをUTF-8として扱います。
- -U: 出力ファイル(.bbl など)のエンコーディングをUTF-8として扱います。
- --output_safechars:
LaTeXで特殊な意味を持つ文字を安全なマクロに変換して出力します。 - %B: 処理対象となるファイル名(拡張子なし)を指定するプレースホルダです。
$bibtex = 'bibtex %O %B';
- 目的: 従来の参考文献処理ツール bibtex の実行コマンドを定義しています。
- 詳細: biber を使わない場合に備えた、標準的な設定です。
$makeindex = 'mendex %O -o %D %S';
- 目的: 索引作成ツール makeindex の実行コマンドを定義しています。
- 詳細:
- mendex: 標準の makeindex
の代わりに、日本語のソート(五十音順など)に正しく対応した mendex
を使用するよう指定しています。 - %O: オプションを渡すためのプレースホルダ。
- -o %D: 出力ファイル名を指定します。%D は latexmk
が用意した出力ファイル名のプレースホルダです。 - %S: 入力ファイル名を指定します。%S は latexmk
が用意した入力ファイル名のプレースホルダです。
- mendex: 標準の makeindex
$max_repeat = 5;
- 目的: 相互参照(図番号、引用、目次など)を解決するために、最大で何回までコンパ
イルを繰り返すかを設定します。 - 詳細: 通常、LaTeXは一度のコンパイルで全ての参照を解決できないことがあります。
この設定は、無限ループを防ぎつつ、参照が安定するまで最大5回までコンパイルを繰
り返すように指示しています。
$pdf_mode = 4;
- 目的: latexmk がPDFを生成する際のデフォルトのエンジンを指定します。
- 詳細: - 1: pdflatex - 2: ps2pdf - 3: dvipdf - 4: lualatex - 5: xelatex
この設定では 4 を指定しているため、latexmk はデフォルトで LuaLaTeX
を使ってPDFを生成します。
$pvc_view_file_via_temporary = 0;
- 目的: latexmk -pvc
(継続的プレビューモード)でPDFビューワーを更新する際の挙動を設定します。 - 詳細:
- 1(デフォルト): 生成したPDFを一時ファイルにコピーしてからビューワーで開き
ます。これにより、ビューワーがPDFファイルをロックしてしまい、次のコンパイ
ルが失敗するのを防ぎます。 - 0: 生成したPDFファイルを直接ビューワーで開きます。最近のPDFビューワーはフ
ァイルをロックしないものが多いため、0に設定することで若干高速になる場合があります。
- 1(デフォルト): 生成したPDFを一時ファイルにコピーしてからビューワーで開き
4. PDF のプレビュー
ここまでの設定を行えば早速タイプセットしてみましょう。
test.tex を NeoVim で開き、:VimtexCompile
を実行してみてください。そうするとタイプセットが複数回実行され SumatraPDF が開かれたかと思います!
この記事通りに vimtex.lua を作成した場合は、キーマップが設定されていると思います。 はデフォルトでは ',' ですので、test.texファイルを開き ,ll
とノーマルモードでタイプすれば :VimtexCompile
を実行したことになります。
ここで SumatraPDF の表示をダブルクリックするとそのコード部分に飛ぶ、というような SyncTeX の機能を実践したくなるかと思いますが、WSL と Windows を跨いでいるので残念ながらここまでの設定だけでは機能しません。
ですが、NeoVim エディタで執筆ができるようになり、強力な検索機能とマルチタブ等の機能を駆使すれば高速なファイル間の移動が容易になっているので、あまり必要性を感じていません。Vimmer なのでマウスは不要です!
とはいえ、完璧な設定ができていないのは気持ちが悪いので方法があればまた追記するかもしれません。
執筆 With AI
NeoVim 上で LaTeX 執筆ができるようになれば、好みの AI ツールと組み合わせて面倒な作業は AI に任せるということもできます。普段 Gemini CLI を利用している私は広いモニタでは画像のように並べて作業し、ラップトップではターミナルとSumatraPDFをそれぞれ全画面にしてウィンドウを切り替えながら作業をしています。
まとめ
本記事では、WSL 上の AstroNvim を用いて LaTeX 開発環境を構築する方法を解説しました。また、Windows にインストールした SumatraPDF との連携方法についても記載しました。執筆した内容が保存と同時にタイプセット後 Viewer に表示されるようになりました。是非、VimmerでLaTeX執筆をよくなさる方はお試しください。