TeXstudio

TeXstudio の変更履歴を末尾までたどると、まだ TeXstudio ですらない項目——Texmaker の記録が現れます。TeXstudio はもともと Texmaker の拡張セットとして「TexMakerX」の名で始まり、バージョン 2.2 で改名した派生版で、いまも親の履歴を引き継いだままです。この出自が、この LaTeX エディタの性格をよく説明します。すなわち executable を一つも持たないのに、書き手に必要なものは全部ひとつの窓に入っている——エディタ、ビルドの連鎖、PDF ビューア、綴りと文法の検査、文書構造の一覧。LaTeX 本体だけは入っていません。このページでは、多くの人が詰まるビルド設定、.cwl に支えられた補完、構造表示、そして SyncTeX を扱います。

LaTeX を同梱しない LaTeX 統合環境

TeXstudio は Windows・macOS・Linux・BSD で動く GPL v2 のオープンソースエディタで、コンパイルは pdflatexlatexmk外部コマンドとして起動することで行います。つまり順番が決まっています——先に TeX ディストリビューション(TeX Live や MiKTeX)を入れ、それから TeXstudio。逆にすると、起動はするのにビルドだけが動かない、という分かりにくい状態になります。公式が挙げる特徴は「1000 を超える数学記号」のパレット、対話的な綴り検査と文法検査、コード折りたたみ、構造表示、そして「(ほぼ)語単位で同期する」統合 PDF ビューア——最後の一つは後述の SyncTeX の話につながります。

Build タブと Commands タブ——txs:/// の読み方

設定はすべて Options → Configure TeXstudio にあり、ビルドに関わるのは二つのタブです。Commands タブは「それぞれの外部コマンドが実際に何なのか」——実行ファイルのパスと引数——を書く場所。Build タブはそれらを組み合わせた「メタコマンド」を定義する場所です。左下の Show Advanced Options にチェックを入れないと、後者の中身はほとんど見えません。詰まる人の多くはここで、pdflatex の引数を直したいのに Build タブを眺めている、あるいはその逆をやっています。

日々触るのは四つの操作だけです。Build & View(F5 はコンパイルして PDF を開き、Compile(F6 は PDF を作るところまで。View(F7 はすでにある PDF を開き、Clean.aux.toc といった中間ファイルを掃除します(できあがった PDF には手を付けません)。

メタコマンドの中身は txs:/// で始まる名前の並びで、縦棒 | でつなぎます。「Build & View」は要するに「既定のコンパイラ、そのあと既定のビューア」という 2 語の式です。Commands タブに登録したコマンドはどれも同じ流儀で参照できるので、自作の変換ツールを挟むこともできます。

名前中身結びついている操作
txs:///quickビルドとプレビューの連鎖Build & View(F5
txs:///compile既定のコンパイラ(初期値は pdfLaTeX)Compile(F6
txs:///view既定のビューアView(F7
txs:///pdflatexCommands タブの pdflatex の行そのもの既定のコンパイラに指定できる
txs:///latexDVI を作る latex の行DVI 経由の連鎖で使う
txs:///view-pdfPDF を開く行。内蔵ビューアか外部かを選べるSyncTeX を使うなら内蔵に

初期状態の既定コンパイラは pdfLaTeX ですが、これを latexmk に替えるのが定番の一手です。latexmk は依存関係を見て、文献・索引・相互参照のために必要な回数だけ自動で回してくれるので、「何回コンパイルすればいいのか」を人間が数えずに済みます。Commands タブに次のように書きます。ここで %ルート(マスター)文書の絶対パスから拡張子を除いたもの に展開されます——いま編集しているファイルではなく、ルートです。この一点が、複数ファイル構成での挙動を決めています。

terminal
latexmk -pdf -synctex=1 -interaction=nonstopmode -file-line-error %.tex

文書ごとにエンジンを変えたいときは、1 行目の マジックコメント が効きます。TeXstudio は % !TeX program% !TeX root% !TeX encoding% !TeX spellcheck などを読みます。下の一行を書いた文書だけが LuaLaTeX でコンパイルされ、設定画面は触らずに済みます。% !TEX 行の書式そのものは TeXShop のページで詳しく扱っています。

latex
% !TeX program = lualatex
% !TeX root = ../thesis.tex
% !TeX spellcheck = en_GB

最初に固めるのは三つだけでよい

設定項目は多いので、既定のコンパイラ・Build & View の連鎖・SyncTeX の有無の三つだけを先に決めるのが現実的です。この三つが定まると、F5 を押したときに毎回同じ道を通ることになり、うまくいかないときの切り分けも一本道になります。

  • 欧文中心の文書なら latexmk で PDF を直接作る。受け継いだ日本語テンプレートなら upLaTeX + dvipdfmx を選ぶ。
  • Build & View を「毎日押す F5 の中身」として定義する。コンパイルと内蔵ビューアで開くところまでを含める。
  • コマンドに -synctex=1-file-line-error を必ず入れる。前者は PDF からソースへ戻るため、後者はエラーをファイル名と行番号で読むため。
  • 本論を開く前に、10 行の .tex で設定を試す。ログと PDF の両方を見て、想定どおりのエンジンが走っているか確かめる。

日本語のビルドをどう構成するか

広く使われている道は二つです。一つは LuaLaTeX——Build タブで Build & View を「Compile & View」に、既定のコンパイラを「LuaLaTeX」にすれば、F5 一発で PDF まで届きます。新規に始めるならこちらが素直です。もう一つは日本語の定番だった upLaTeX + dvipdfmx で、こちらは PDF の前に DVI を挟むため、Build & View を「DVI->PDF chain」に、既定のコンパイラを「LaTeX」にします。

いちばん見通しがよいのは、エンジンの組み合わせを .latexmkrc に書き、TeXstudio には latexmk を呼ばせるだけにする形です。.tex と同じフォルダに次のファイルを置けば、upLaTeX → dvipdfmx の流れも、文献(upbibtex)も、索引(upmendex)も、繰り返し回数も latexmk が面倒を見ます。$latex-synctex=1 が入っているので SyncTeX も生きます。

latex
$latex = 'uplatex %O -synctex=1 -interaction=nonstopmode %S';
$bibtex = 'upbibtex %O %B';
$makeindex = 'upmendex %O -o %D %S';
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3;

$pdf_mode = 3 は「DVI を作り、それを $dvipdf で PDF にする」というモードの指定です。%O(追加オプション)、%S(ソースファイル)、%B(拡張子なしのベース名)、%D(出力先)は latexmk 側のプレースホルダで、TeXstudio の % とは別物です。この形にしておくと、TeXstudio から呼んでも、コマンドラインから叩いても、別のエディタから起動しても同じ結果になります——設定が一か所にあるからです。

ログは最初のエラーから読む

設定をやみくもに変える前に、どのコマンドが起動されたのかログの最初のエラーは何かを見てください。LaTeX のエラーは連鎖するので、赤い行の一つ目が二つ目以降を生んでいることがほとんどです。TeXstudio のログパネルはこの読み方を助けるように作られていて、生のログ表示と、エラー(赤)・警告(黄)・オーバーフルボックス(青)に分類した一覧表を切り替えられます。エラー間の移動は Ctrl+Shift+↑Ctrl+Shift+↓、警告とボックスは Alt+Shift+↑Alt+Shift+↓ です。

  • Could not start the command が出たら、疑うのは TeXstudio ではなく PATH と TeX Live/MiKTeX の導入状態です。Commands タブの実行ファイルのパスを確認します。
  • File not found はルートファイル・相対パス・図版のファイル名のいずれかです。拡張子まで書いてあるかも見ます。
  • パッケージが足りないときは、TeX Live なら tlmgr install、MiKTeX なら MiKTeX Console で入れます。エディタ側では解決しません。
  • ログの行番号をクリックして最初のエラーだけ直し、再ビルドしてから続きを読みます。連鎖の後半を先に読むのは時間の無駄になりがちです。

補完が \label を知っている理由——.cwl ファイル

TeXstudio は LaTeX を解釈しているのではなく、.cwl(completion word list)というファイルを読んでいます。 この形式はもともと別の LaTeX エディタ Kile のもので、TeXstudio はそこに「この引数はラベルである」「ここはカーソルを置く場所である」といった意味情報を足して拡張しました。だから \ref{ まで打つと文書内のラベルが、\cite{ まで打つと文献のキー(bibID)が候補に出てきます。\usepackage で読み込んだパッケージに対応する cwl があればそれが使われ、無ければ TeXstudio が .sty から自動生成しますが、その場合はコマンド名だけで引数の意味は付きません。自作パッケージは \usepackage{./myPackage} のように相対パスで書くと ./myPackage.cwl を探しにいきます。

打鍵を減らす仕掛けも三つ覚えておくと効きます。候補一覧が共通の接頭辞を持つとき、Tab を押すとその共通部分までが一気に入ります。環境を書き始めれば——たとえば \begin{itemize} と打てば——対応する \end{itemize} が自動で挿入されます。そして環境名の上にしばらくカーソルを置くと ミラーカーソル が現れ、\begin\end の名前を同時に書き換えられます(itemizeenumerate にするのが一手で済む)。開いたままの環境や括弧を閉じたいときは Alt+Return。閉じ忘れは LaTeX でもっとも多い事故の一つなので、この一手は覚える価値があります。

構造表示と、打ちながら走る綴り・文法検査

左側の 構造表示(Structure view) は文書の地図になります。載るのは見出し(\section の類)、ラベル(\label)、\input\include で取り込まれたファイル、beamer のブロック、そして TODO——\todo{} コマンドと % TODO%todo コメントの両方が拾われます。項目をクリックすればその位置へ飛びます。長い原稿でも複数ファイル構成でも、いま自分がどこにいるのかを見失わずに済むのはこの一覧のおかげです。

綴り検査は打っている最中に走り、疑わしい語を右クリックすれば候補が出ます。辞書は hunspell 形式——LibreOffice や Firefox と同じ仕組みなので、追加の辞書は流用できます。言語をファイルごとに固定したいときは 1 行目に % !TeX spellcheck = de_DE のように書いておくと、そのファイルを開くたびに自動でその言語になります。多言語の論文集を編むときに効きます。

文法検査のほうは、TeXstudio 自身が判定しているわけではありません。オープンソースの校正エンジン LanguageTool をローカルにサーバーとして立て、TeXstudio が起動時にそこへ接続し、打ち終わった段落を送って結果を受け取っています(Options → Configure TeXstudio → Language Checking でサーバー URL と jar のパスを指定します)。文章が外に出ないのはこの構成のおかげで、投稿前の原稿を扱うときの安心材料になります。

SyncTeX——Ctrl+クリックで前方にも後方にも

条件は二つだけです。第一に、コンパイルのコマンドに -synctex=1 を渡すこと。 SyncTeX はエディタの機能ではなく TeX エンジンの機能で、このスイッチが同期ファイル .synctex.gz を書かせます(上の latexmk の行と .latexmkrc にはすでに入っています。忘れているとき、TeXstudio はコマンドを直そうかと申し出てくれます)。第二に、PDF を内蔵ビューアで開くこと。 両方向のジャンプを可能にしているのは、この内蔵ビューアの SyncTeX 対応です。

操作は覚えやすく、どちらの向きも Ctrl + 左クリック です。ソース側でそうすればカーソル位置に対応する PDF の場所へ(前方検索)、PDF 側でそうすれば対応するソース行へ(逆方向検索)。右クリックメニューの「Go To PDF」「jump to source」でも同じことができます。ビューアを開いた時点でも、現在のカーソル位置に向けて前方検索が自動的に走ります。さらに「scrolling follows cursor」と「cursor follows scrolling」を有効にすると、書いている間じゅう両者が連動し、校正のときの「この段落はどの行から出たのか」という探しものが消えます。