feature image

2026年3月16日 | ブログ記事

LaTeX in VSCode 快適執筆編

これは新歓ブログリレー2026 10日目(?)の記事です。

また、この記事は LaTeX in VSCode第二弾です。第一弾はこちら->LaTeX in VSCode 環境構築編

はじめに

こんにちは! 23Bの@Hueterです。

LaTeX in VSCode第二弾です。前回は環境構築編としてLaTeXの環境をVSCodeを用いて手元に用意してみました。今回は快適執筆編ということで、LaTeXを快適・便利に使えるようになる情報を紹介しようかなと思います。内容としては、パッケージ・スニペット・フォーマッターの大きく分けて三つについて扱います。
書いているうちにだんだんと内容が多くなってしまい、個々の内容について詳しく書けなかった部分もありますが、概念を知る機会として役立ててもらえたらなと思います。

それでは、より良いLaTeXライフを目指して。

パッケージ

LaTeXのデフォルト状態だとセクションや図表の挿入等、基礎的な機能しか入っていません。ただ、LaTeXには様々なパッケージが存在しており、これを入れることで機能を追加することができます。動作確認で記述した、\begin{align}...(数式をより綺麗に位置を調節して書くためのコマンド)も\usepackage{amsmath,amsfonts}によりパッケージを入れることで初めて使えるコマンドです。
パッケージは\usepackage{パッケージ名}を冒頭(動作確認で書いたコード参照)に書くことで入れることができます。
ということで、ここでは私が使っているものを主にいくつか紹介しようと思います。

graphicx (図の挿入)

先ほど軽く取り上げましたが、LaTeXで画像を入れる際に用いるパッケージです。
画像の入れ方は、画像データを用意してから以下のように書けば良いです。画像の指定は、TeXファイルから見た画像ファイルの相対パスを書くことで行うので、画像ファイルがたくさんある場合はフォルダ分けをしても良いですね。

\begin{figure}[htbp]
  \centering
  \includegraphics{image.png} % 画像の相対パス
  \caption{<caption>}
  \label{<label>}
\end{figure}

ただし、上のような書き方だと挿入する画像サイズそのままでPDF出力されるため入れる画像によって画像が大きかったり小さかったりするかもしれません。そこで、オプションから画像サイズ等を指定していきます。上記のコードの\includegraphics{}の行を以下のようにしてみましょう。

  \includegraphics[width=.70\columnwidth]{image.png}

そうすると、画像の横幅がPDFの幅の70%になります。width=...には数字でpxを指定することもできますが、PDFの横幅が何pxなのか考える手間があるので私は.70\columnwidthの方をよく用いています。

here 図表の位置指定

図表の位置を特定の図や文の間に挟みたい、という場面で使えます。
本来は図表の位置を[htbp]と指定すると、その場所(h)→ページ上部(t)→ページ下部(p)→最後のページ(p)という順番に場所を見て、図表を置けるスペースが一番最初にあった場所に図表が置かれます。そのため、変な場所に図表が置かれるということがよく起こるのですが、hereパッケージを入れて[htbp][H]に置き換えることで文章と図表の順番が書いたとおりの順に完全に固定されます。ただし、順番が完全固定されることから不自然な空白がよくできるのでPDFにビルドした後に図表を入れる位置の調整が必要になるのが欠点です。

amsmath等 数式

数式の記述を簡単にして、数式出力の品質を向上させるさまざまな機能を提供してくれるパッケージの一つです。これはアメリカ数学会が開発したもののひとつで、他にもamsfontsamssymbなど数式関連のパッケージがあります。私は今出した三つぐらいしか使ってませんでしたが、気になる人は調べてみてください。(参考リンク)

amsmathでよく使っていたものとしてはalignという数式環境です。というかこれぐらいしかよく使ってなかった気がします。amsmathの数式環境では&を使うことで複数の数式の位置を縦でそろえることができます。式変形などで数行にわたって式を書く際に見た目をきれいにできるのでおすすめです。

mhchem 化学式

化学式を書く際に、上付き文字や下付き文字をいい感じに変換してくれるパッケージです。\usepackage[version=3]{mhchem}で入れられます。例えば硫酸では\ce{H2SO4}と入力するだけで数字はすべて下付き文字に変えてくれるうえ、水の電気分解は\ce{2H2O -> 2H2 + O2}とすれば添え字と係数の判別もしてくれます。ただし、添え字に変数が入ったり、大文字小文字を間違えるとうまくいかないので注意です。

siunitx 単位

「数値と単位との間にスペースを空けること」、「単位は必ず立体にすること」など国際単位系として数字・単位の表記にはいろいろなルールがあります。適当なレポートではそこまで気にする必要はないですが、後々論文を書く際に必要になるかもしれないので、これらを楽にできるパッケージの紹介です。
ざっくりいうと\qty[オプション]{数値}{単位}とすることで数字と単位のセットを出力できます。(例:\qty{550}{\degreeCelsius})詳しくはこちらのsiunitxの使い方という記事を参考にどうぞ。単位などのマクロも追加されるので、変換で出した単位だとエラーが出てビルドができないというときは使ってみてください。SI単位(国際単位系) - siunitxパッケージのマクロ

スニペット

スニペットとは簡単に言うとプログラミング版の辞書登録機能です。頻繁に使う一定の語句を少ない文字を打つだけで変換するというようなものです。
ここでは3つのスニペット機能について紹介します。

スニペット ① LaTeX Workshop

環境構築編でVSCodeに入れたLaTeX Workshopですが、これ入れると一部のスニペットがすぐ使えるようになります。例えば、SSEと入力してEnterを押すと\section{}に変わったり、BALと入力してEnterを押すと、

\begin{align}
  
\end{align}

に変わったりします。
他にもたくさんありますが、詳しくは以下の記事を参考にしてください。
LaTeX Workshop をもう少し使いこなす

スニペット ② ユーザースニペット

①で紹介したのはLaTeX Workshopが提供しているものですが、VSCodeの機能を使うことで自分でもスニペットを作成することができます。
まず、VSCode左下の管理(歯車アイコン)からスニペットを選択し、latex.jsonを選択します。そうするとlatex.jsonというファイルが開けて、そこに自分のスニペットを定義できます。
最初の方にあるコメント部分は記述方法ですが、ざっくり以下の通りです。

{
  "辞書の名前": {
    "prefix": "変換元",
    "body": [
      "変換後",
      "複数行のものについてはカンマ区切りで記述する"
    ],
    "description": "授業レポート用テンプレート"
  },
  "次の辞書": {
      ...
  }
}

こうすることで「変換元」の文字を入力して変換候補から選択するとbodyに記述した変換後の文字が入力されます。変換後に関しては複数行でも問題ないので、最初に書くLaTeXの雛形をスニペットに登録しておくと楽です。
また、変換後の部分に${1}というものを記述すると変換後に${1}を書いた場所に入力のバーを移動させることもできます。さらに、${2}のように中の数字を増やしていけば、タブキーを押すと数字の順にまた入力のバーを移動できます。スニペットの中で変更を加えるところが決まっているなら設定するとマウスを触らなくていいので少し楽できます。ただし、矢印キーで移動をするとタブの移動ができなくなるので注意です。

スニペットを作るうえで気を付けることとしては、LaTeXのコードをそのまま上のbody部分に入れることはできず、①各行を""で囲み、②最後の行以外の末尾に,を入れ、③\\\に書き換える必要があります。特に最後のバックスラッシュについては書き換え漏れをしやすいので忘れずに。面倒ならGeminiにでも変換を任せちゃいましょう。

私が今使っているユーザースニペットは記事の一番下に張り付けているので見てみてください。

スニペット③  HyperSnips Extension

先ほどまでのは、VSCodeのユーザースニペットを利用したものでしたが今度は HyperSnips Extension を用いたスニペットですスニペットの紹介です。
HyperSnips Extensionのスニペットの特徴としてはユーザースニペットとは違いVSCodeの変換に出てこない代わりに、指定した文字が入力されると即刻変換後の文字に変わることです。
分かりにくい人は参考にしたブログにデモ動画があるので見てみてください(動的スニペットデモ動画)
導入方法・使い方としては、まずHyperSnips ExtensionをVSCodeに入れ、latex.hsnipsというファイルを所定の場所に作成するとできます。場所は以下の通りです。今回はLaTeXなので(language)latexになっていますが名前を変更すれば別の言語でもできるはずです。(試したことないのでわかりません。)

Windows: %APPDATA%\Code\User\globalStorage\draivin.hsnips\hsnips\(language).hsnips
Mac: $HOME/Library/Application Support/Code/User/globalStorage/draivin.hsnips/hsnips/(language).hsnips
Linux: $HOME/.config/Code/User/globalStorage/draivin.hsnips/hsnips/(language).hsnips

latex.hsnipsの中身については一から書くのは難しいので既存のものを使うといいです。私はこちらの中身をコピペして多少書き加える形で使っています。書き加えは数式爆速入力のための LaTeX 動的スニペット in VSCodeという記事を見ながらしてみてください。

フォーマッター latexindent

フォーマッターはファイルのフォーマットを指定したとおりに整えてくれるものです。整えるのは.texファイルの中身なので出力されるPDFの見た目は一切変わりませんが、整った.texファイルは後で見返しやすいので余力があるなら環境を整えてもいいでしょう。

LaTeXのフォーマッターには latexindent というものを使います。VSCodeのsetting.jsonに以下の二行を追加すると動きます。

"latex-workshop.formatting.latex": "latexindent",
"latex-workshop.formatting.latexindent.path": "latexindent",

これでCtrl + sで保存する際にフォーマッターが動く...かもしれません。
実は、latexindent はPerlという言語で書かれておりPerlの実行環境がないと動きませんが、TeX Liveにバイナリが同梱されているのでWindowsではPerlが不要となっています。ただし、バイナリがうまくダウンロードできてない場合はPerl環境を入れる必要があります。Perlのインストール方法はPerlのダウンロードとインストールという記事を参考にしてみてください。

これで、latexindentを使えるようになりましたがデフォルトの設定で不満がある場合は各自で設定を変えることができます。
詳しい方法は latexindentの設定をカスタマイズして使うという記事を見てみてください。

おわりに

いかがでしたか?内容が多いのもあり後半は参考にしたサイトの紹介みたいなことになりましたが、「こんな機能欲しかった!」というものが見つけられていれば幸いです。

次回は@o_oさんの記事です。お楽しみに。

参考資料

siunitxの使い方
数式爆速入力のための LaTeX 動的スニペット in VSCode
Windows環境での LaTeX in Vscode

付録

参考までに私が使っているユーザースニペットを張り付けておきます。
すぐ使いたい、という人はコピペで使ってみてください。

{
    // Place your snippets for latex here. Each snippet is defined under a snippet name and has a prefix, body and 
    // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
    // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
    // same ids are connected.
    // Example:
    // "Print to console": {
    // 	"prefix": "log",
    // 	"body": [
    // 		"console.log('$1');",
    // 		"$2"
    // 	],
    // 	"description": "Log output to console"
    // }
    "report": {
        "prefix": "report",
        "body": [
            "\\documentclass[${1:a4paper,11pt}]{${2:jsarticle}}",
            "",
            "",
            "% 数式",
            "\\usepackage{amsmath,amsfonts}",
            "\\usepackage{bm}",
            "",
            "% 画像",
            "\\usepackage[dvipdfmx]{graphicx}",
            "${3}",
            "",
            "\\newcommand{\\unit}[1]{\\,\\mathrm{ #1 }}",
            "",
            "\\begin{document}",
            "",
            "\\title{${4}}",
            "\\author{${5}}",
            "\\date{${6}}",
            "\\maketitle",
            "",
            "$0",
            "\\end{document}"
        ],
        "description": "授業レポート用テンプレート"
    },
    "experiment": {
        "prefix": "experiment",
        "body": [
            "% \\documentclass[a4paper,dvipdfmx,twocolumn]{jsarticle}",
            "\\documentclass[a4paper,dvipdfmx]{jsarticle}",
            "",
            "",
            "% 数式",
            "\\usepackage{amssymb,amsmath,amsfonts}",
            "\\usepackage{bm}",
            "\\usepackage{siunitx}",
            "",
            "% 画像",
            "\\usepackage[dvipdfmx]{graphicx}",
            "\\usepackage[hang]{caption}",
            "\\usepackage{here}",
            "\\usepackage{subcaption}",
            "",
            "%PDF挿入用",
            "\\usepackage{pdfpages}",
            "",
            "%化学式",
            "\\usepackage[version=3]{mhchem}",
            "",
            "%URL",
            "\\usepackage{url}",
            "",
            "%表中の罫線",
            "\\usepackage{booktabs}",
            "\\usepackage{multirow}",
            "",
            "% sectionの前に空行",
            "\\usepackage{titlesec}",
            "",
            "",
            "% 諸々の設定",
            "% 二段組の線追加",
            "% \\setlength{\\columnseprule}{0.4pt}",
            "",
            "% sectionの前に空行",
            "\\titlespacing*{\\subsection}{0pt}{.5\\baselineskip}{0.0\\baselineskip}",
            "",
            "\\newcommand{\\unit}[1]{\\,\\mathrm{ #1 }}",
            "",
            "\\newcommand{\\two}{I\\hspace{-1.2pt}I}",
            "\\newcommand{\\three}{I\\hspace{-1.2pt}I\\hspace{-1.2pt}I}",
            "\\newcommand{\\ctext}[1]{\\raise0.2ex\\hbox{\\textcircled{\\scriptsize{#1}}}}",
            "",
            "\\begin{document}",
            "",
            "",
            "\\begin{titlepage}",
            "  \\huge",
            "  \\begin{center}",
            "    実験レポート",
            "  \\end{center}",
            "  \\vskip3 \\baselineskip",
            "  \\begin{center}",
            "    \\underline{実験題目\\qquad }",
            "  \\end{center}",
            "  ",
            "  ",
            "  \\vskip4 \\baselineskip",
            "  \\LARGE",
            "  \\hspace{4em}実験日\\hspace{3em}202年月日\\,-\\,202年月日",
            "  \\vskip0.5 \\baselineskip",
            "  \\hspace{4em}提出日\\hspace{3em}202年月日",
            "  \\vskip2 \\baselineskip",
            "  \\hspace{4em}学籍番号\\hspace{2em}",
            "  \\vskip0.5 \\baselineskip",
            "  \\hspace{4em}実験班名\\hspace{2em}班",
            "  \\vskip0.5 \\baselineskip",
            "  \\hspace{4em}氏名\\hspace{4em}\\,",
            "  \\vskip0.5 \\baselineskip",
            "  ",
            "  \\normalsize",
            "  % タイトルページにもページ数を割り当てたい場合は下をコメントアウトする",
            "  \\thispagestyle{empty}",
            "\\end{titlepage}",
            "% タイトルページにもページ数を割り当てたい場合は下のコメントを消す",
            "% \\addtocounter{page}{1}",
            "",
            "",
            "\\tableofcontents",
            "\\clearpage",
            "",
            "",
            "\\section{目的}",
            "",
            "",
            "\\section{実験方法}",
            "\\subsection{1}",
            "\\subsection{2}",
            "\\subsection{3}",
            "\\subsection{4}",
            "\\subsection{5}",
            "",
            "",
            "\\section{実験結果}",
            "\\subsection{1}",
            "\\subsection{2}",
            "\\subsection{3}",
            "\\subsection{4}",
            "\\subsection{5}",
            "",
            "",
            "\\section{考察}",
            "\\subsection{1}",
            "\\subsection{2}",
            "\\subsection{3}",
            "",
            "",
            "\\section{問題}",
            "",
            "",
            "\\section{結論}",
            "",
            "",
            "\\begin{thebibliography}{99}",
            "  \\bibitem{01}",
            "\\end{thebibliography}",
            "",
            "",
            "\\end{document}"
        ],
        "description": "実験レポート用テンプレート"
    },
    "beginFigure": {
        "prefix": "BEGINFIG",
        "body": [
            "\\begin{figure}[H]",
            "  \\centering",
            "  \\includegraphics[width=.${1:90}\\columnwidth]{${2}}",
            "  \\caption{${3:<caption>}}",
            "  \\label{${4:<label>}}",
            "\\end{figure}",
        ],
        "description": "画像挿入"
    },
    "beginTable": {
        "prefix": "BEGINTAB",
        "body": [
            "\\begin{table}[H]",
            "  \\centering",
            "  \\caption{${1:<caption>}}",
            "  \\label{${2:<label>}}",
            "  \\begin{tabular}{${3:<columns>}} \\hline",
            "  ${4}",
            "  \\hline",
            "  \\end{tabular}",
            "\\end{table}",
        ],
        "description": "表挿入"
    },
    "beginMiniPageFigure": {
        "prefix": "BEGINMINIFIG",
        "body": [
            "\\begin{figure}[H]",
            "  \\centering",
            "  \\begin{minipage}[c]{.${1:48}\\columnwidth}",
            "    \\centering",
            "    \\includegraphics[width=.90\\columnwidth]{${2}}",
            "    \\caption{${3:<caption1>}}",
            "    \\label{${4:<label1>}}",
            "  \\end{minipage}",
            "  \\begin{minipage}[c]{.${1:48}\\columnwidth}",
            "    \\centering",
            "    \\includegraphics[width=.90\\columnwidth]{${5}}",
            "    \\caption{${6:<caption2>}}",
            "    \\label{${7:<label2>}}",
            "  \\end{minipage}",
            "\\end{figure}",
        ],
        "description": "minipage画像挿入"
    }
}
Hueter icon
この記事を書いた人
Hueter

23B game班とSysAd班メインで活動中 まだまだ分からないことだらけ

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2025年4月25日
1週間でゲームを作った #Charon
Komichi icon Komichi
2025年4月6日
グラフィック班の活動紹介 2025
madara16877 icon madara16877
2025年4月15日
新歓コンピ楽曲解説!!!
vPhos icon vPhos
2022年3月29日
課題・レポートの作成、何使う?【新歓ブログリレー2022 21日目】
aya_se icon aya_se
2025年4月16日
大岡山キャンパス 節約飯 n選
enari_K icon enari_K
2025年3月31日
NORMAL END「俺たちの戦いはこれからだ!」
otima icon otima
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記