3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

"LaTeX Lint" LaTeXのよくあるミスを検出するVS Code拡張機能

Last updated at Posted at 2025-01-05

LaTeX Lint

VS Code拡張機能 "LaTeX Lint" を作成しました。
本記事はその紹介となります。

mainIcon

GitHub レポジトリはこちらです。

Abstract

この拡張機能は、.tex および .md ファイル用のLaTeX Linter、及び学術論文執筆に役立つコマンドを提供します。

abstract

この拡張機能によって、一般的なミスを検出し、さらに独自の正規表現ルールを定義して検出出来ます。

また、\begin{name}\end{name} 上で F2 を押してコマンド名を変更したり、選択した数式をWolfram Alphaに解かせたり出来ます。

Features

コマンドパレット(Ctrl+Shift+P)を開き、コマンドを入力することで、以下の機能を使用できます。

LaTeX Lint: Diagnose Current File

現在編集しているLaTeXまたはMarkdownファイルを診断します。このコマンドは、ファイル保存時に自動的に実行されます。

検出ルールは以下の通りで、詳細は Rules に記載されています。

  1. LLAlignAnd (=&, \leq&, \geq& などを検出)
  2. LLAlignEnd (\\で終わるalign環境を検出)
  3. LLAlignSingleLine (\\なしのalign環境を検出)
  4. LLBig (\cap_, \cup_ などを検出)
  5. LLBracketCurly (\max{, \min{ を検出)
  6. LLBracketRound (\sqrt(, ^(, _( を検出)
  7. LLColonEqq (:=, =: ,::=, =:: を検出)
  8. LLColonForMapping (写像で使われる : を検出)
  9. LLCref (\ref を検出、デフォルトで無効)
  10. LLDoubleQuotes (, , " を検出)
  11. LLENDash (疑わしい - の使用を検出)
  12. LLEqnarray (eqnarray環境を検出)
  13. LLNonASCII (全角のASCII文字を検出)
  14. LLLlGg (<<>> を検出)
  15. LLRefEq (\ref{eq: を検出)
  16. LLSharp (\sharp を検出)
  17. LLSI (\SI なしのKB, MB, GB などを検出)
  18. LLT (^T を検出)
  19. LLTitle (\title{}, \section{} などでの疑わしいタイトルケースを検出)
  20. LLUserDefined (latexlint.userDefinedRules で定義された正規表現を検出)

必要であればsample/lint.pdf日本語解説記事 もご参照ください。

検出するルールは、コマンド LaTeX Lint: Select Rule to Detect で簡単に選択できます。

LaTeX Lint: Enable/Disable LaTeX Lint

LaTeX Lintを有効化または無効化します。このコマンドは、エディターのツールバーのアイコンをクリックして実行できます。

enableDisableButton

LaTeX Lint: Add Rule to Detect

独自のルールを追加します。
例えば、以下の手順で $f^a$ を検出できます。

手順を表示

1. 検出したい文字列を選択(オプション)

addRule1

2. コマンドを実行 (Add Rule to Detect)

コマンドパレット(Ctrl+Shift+P)を開き、LaTeX Lint: Add Rule to Detect と入力します。

addRule2

3. 指示に従う

string を選択すると入力そのものを検出します。
Regex を選択すると正規表現パターンを使用して検出します。

これで独自のルールを定義できます。

LaTeX Lint: Select Rule to Detect

検出するルールを選択します。検出したいルールのみをチェックできます。

selectRule

LaTeX Lint: Rename \begin{} or \end{}

追加機能として、\begin{name} または \end{name} 上で F2 を押してコマンドをリネームできます。

renameCommand

LaTeX Lint: Ask Wolfram Alpha

追加機能として、選択した数式をWolfram Alphaに解かせることができます。

askWolframAlpha3

手順を表示

1. 解きたい数式を選択

askWolframAlpha1

2. コマンドを実行 (Ask Wolfram Alpha)

コマンドパレット(Ctrl+Shift+P)を開き、LaTeX Lint: Ask Wolfram Alpha と入力します。

askWolframAlpha2

3. Wolfram Alphaのページで確認

Wolfram Alphaページで結果を確認できます。
送信時に不要なコマンドは自動的に削除されます。

Rules

LLAlignAnd

.tex または .md ファイル内の、=&を検出します。
align環境では={}&と書くのが望ましいです。

doc/LLAlignAnd

また、\neq&, \leq&, \geq&, \le&, \ge&, <&, >& なども検出します。

本拡張機能の制限として、table環境内の&=などの偽陽性がいくつかあります。

参考 Stack Exchange

LLAlignEnd

.tex または .md ファイル内の、\\で終わるalign環境やgather環境を検出します。
この改行は不要であると考えられます。

LLAlignSingleLine

.tex または .md ファイル内の、\\なしのalign環境を検出します。
1つの数式だけの場合、equation環境を使用するのが望ましいです。

doc/LLAlignSingleLine

align環境のspacingはequation環境とそれと、1つの数式の場合に異なります

どちらを使うかは使用者次第ですが、amsmath 公式ドキュメントでは、1つの数式にはequation環境を使うことが想定されています。

LaTeX Lint: Rename \begin{} or \end{}でコマンド名を変更できます。

LLBig

.tex または .md ファイル内の、\cap_, \cup_, \odot_, \oplus_, \otimes_, \sqcup_, uplus_, \vee_, \wedge_ を検出します。
代わりに \bigcap, \bigcup, \bigodot, \bigoplus, \bigotimes, \bigsqcup, \biguplus, \bigvee, \bigwedge を使うのが望ましいです。

doc/LLBig

参考 Stack Exchange.

LLBracketCurly

.tex または .md ファイル内の、\max{, \min{ を検出します。
代わりに \max(, \min( を使うのが望ましいです。
あるいは、\max, \min の後に明示的にスペースを追加して下さい。

doc/LLBracketCurly

LLBracketRound

.tex または .md ファイル内の、\sqrt(, ^(, _(を検出します。
代わりに \sqrt{, ^{, _{を使うのが望ましいです。

doc/LLBracketRound

LLColonEqq

.texファイル内の、:=, =:, ::=, =::を検出します。
mathtoolsパッケージの\coloneqq, \eqqcolon, \Coloneqq, \Eqqcolonを使用するのが望ましいです。

doc/LLColonEqq

:=のコロンは少し低いですが、\coloneqqのコロンは中央に配置されることが知られています

参考 Stack Exchange

LLColonForMapping

.tex または .md ファイル内の、写像に使われていると思わしき : を検出します。
\colon を使用するのが望ましいです。

doc/LLColonForMapping

\colon が写像においては推奨されています: は比率(例えば 1:2)に使われます。

このパターンを検出するために、: の後に\to\mapsto\rightarrowがあるかどうかを確認します。: の後10語以内でこれらのコマンドがあり、かつエスケープされていない $ の前の場合、: は写像用の記号として認識されます。いくつかの偽陽性と偽陰性があります。

LLCref

.tex ファイル内の、\ref を検出します。
代わりに、cleverefパッケージの \cref\Cref を使用するのが望ましいです。
デフォルトでこのルールは settings.jsonlatexlint.disabledRules にて無効化されています。

このパッケージは、"Sec."や"Fig."のような接頭辞を自動的に追加することができ、参照フォーマットの一貫性を保つのに役立ちます。

cleverefパッケージについては、opt-cpさんによるこちらのページも参照下さい。

\usepackage{amsmath,mathtools}
\usepackage{amsthm,thmtools}
\declaretheorem{theorem}
\usepackage{cleveref}
\newcommand{\crefrangeconjunction}{--}
\crefname{equation}{}{}
\Crefname{equation}{Eq.}{Eqs.}
\crefname{theorem}{Theorem}{Theorems}

LLDoubleQuotes

.tex ファイル内で, , "を検出します。
これらは "XXX" や “XXX” のように使われていることがあります。

ダブルクォーテーションには ``XXX'' を使うべきです。

“XXX” に関しては、殆どの場合問題ありませんが、一貫性を保つために ``XXX'' を使う方が好ましいです。

csquotesパッケージを使って \enquote{XXX} を使うことも出来ます。

参考 Stack Exchange

LLENDash

.tex または .md ファイル内の、疑わしいハイフンの使用を検出します。
-- をenダッシュ、--- をemダッシュとして使うべきです。

doc/LLENDash

このルールはnot inherent orthographic "correctness"とは言われますが、多くの場合、enダッシュの使用が推奨されています

例えば、以下のようなものを検出します。

  • Erdos-Renyi(ランダムグラフ、Erd\H{o}s--R\'enyi)
  • Einstein-Podolsky-Rosen(量子物理学、Einstein--Podolsky--Rosen)
  • Fruchterman-Reingold(グラフ描画、Fruchterman--Reingold)
  • Gauss-Legendre(数値積分、Gauss--Legendre)
  • Gibbs-Helmholtz(熱力学、Gibbs--Helmholtz)
  • Karush-Kuhn-Tucker(最適化、Karush--Kuhn--Tucker)

ただし、以下のものは例外として検出しません。

  • Fritz-John(最適化、単一の人物名)

偽陽性が発生する場合もあります(例えば Wrong-Example など、人名でない場合)。

補足として、範囲を示すためにページ番号では --- の代わりに使うべきです。例えば、123-456 の代わりに 123--456 を使うのが正しいです。多くのbibtexファイルはこの形式で書かれています。この場合、単に引き算である可能性があるため、私たちは検出しません。

我々は正規表現 [A-Z][a-zA-Z]*[a-z] を使用しています。
大文字で始まり、0文字以上の英文字が続き、小文字で終わる単語を人物名と仮定しています。

LLEqnarray

.tex または .md ファイル内の、eqnarray環境を検出します。
代わりにalign環境を使うべきです。

eqnarray環境はspacingに問題がある為、非推奨です

LLLlGg

.tex または .md ファイル内の、<<>> を検出します。
代わりに \ll\gg を使うべきです。

doc/LLLlGg

次のようなものは検出しません。

I like human $<<<$ cat $<<<<<<<$ dog.

LLRefEq

.tex ファイル内の、\ref{eq: を検出します。
代わりに \eqref{eq: を使うべきです。

このコマンドは参照に括弧を自動的に追加します。

LLSharp

.tex または .md ファイル内の、\sharpを検出します。
代わりにnumber signを示す \# を使うべきです。

doc/LLSharp

\sharp は音楽記号として使われます。

LLNonASCII

.tex または .md ファイル内の、全角ASCII文字を検出します。

以下の文字を検出します。

 !"#$%&'()*+,-./01234567
89:;<=>?@ABCDEFGHIJKLMNO
PQRSTUVWXYZ[\]^_`abcdefg
hijklmnopqrstuvwxyz{|}~

我々は以下の正規表現を使用します。

[\u3000\uFF01-\uFF5E]

Range U+FF01–FF5E reproduces the characters of ASCII 21 to 7E as fullwidth forms. U+FF00 does not correspond to a fullwidth ASCII 20 (space character), since that role is already fulfilled by U+3000 "ideographic space".
Wikipedia

すべての非ASCII文字を検出したい場合は、以下の正規表現を使用します。

[^\x00-\x7F]

\x00 から \x7F はASCII文字です。

例えば、以下の日本語の文字を検出できます。

あア亜、。

LLSI

.tex ファイル内で、\SI なしで使われているKB, MB, GB, TB, PB, EB, ZB, YB, KiB, MiB, GiB, TiB, PiB, EiB, ZiB, YiBを検出します。
代わりに \SI を使用するのが望ましいです。例えば、\SI{1}{\kilo\byte}(10^3バイト)や \SI{1}{\kibi\byte}(2^10バイト)など。

doc/LLSI

接頭辞   コマンド   記号   指数 接頭辞   コマンド   記号   指数
 kilo    \kilo      k       3    kibi    \kibi     Ki      10  
 mega    \mega      M       6    mebi    \mebi     Mi      20  
 giga    \giga      G       9    gibi    \gibi     Gi      30  
 tera    \tera      T      12    tebi    \tebi     Ti      40  
 peta    \peta      P      15    pebi    \pebi     Pi      50  
 exa      \exa        E      18    exbi    \exbi     Ei      60  
 zetta    \zetta      Z      21    zebi    \zebi     Zi      70  
 yotta    \yotta      Y      24    yobi    \yobi     Yi      80  

m, s, kg, A, K, mol, rad などの単位でも \SI を使用するのが望ましいです。

CTAN: siunitx

LLT

.tex または .md ファイル内の、^T を検出します。
行列やベクトルの転置を表す場合は、^\top^\mathsf{T} を使用するのが望ましいです。

doc/LLT

そうでない場合、変数 T の冪乗との区別がつきません。

参考 BrownieAlice

LLTitle

.texファイル内の、\title{}, \section{}, \subsection{}, \subsubsection{}, \paragraph{}, \subparagraph{} 内で、疑わしいタイトルケースを検出します。

例えば、

The quick brown fox jumps over the lazy dog

は、

The Quick Brown Fox Jumps Over the Lazy Dog

のようにタイトルケースにするのが望ましく、そのような場合に検出します。

すべての非タイトルケースを検出するのは非常に困難です。多くの例外やスタイルがあるためです。好みのスタイルに合わせてタイトルを変換するには、Title Case ConverterまたはCapitalize My Titleの使用を強く推奨します。

{} 内の文字列は、to-title-caseというJavaScriptライブラリをベースにした toTitleCase 関数によって不変であるかどうかがテストされます。ただし、偽陽性や偽陰性が発生する可能性があります。

APA Style

参考 WORDVICE

LLUserDefined

.tex または .md ファイル内の、独自に定義された正規表現を検出します。

例えば、数式モードで説明のために英文字を使う場合、 \mathrm を使うべきです。
$\mathrm{a}$ が変数ではなく、atractive forceのような意味を表す場合、$f^a(x)$ は $f^{\mathrm{a}}(x)$ と記述するべきです。

ただし、文脈無しでは検出が難しいです。そこで、以下の正規表現を定義してこのパターンを検出できます。

f\^a

詳細はLaTex Lint: Add Rule to Detectを参照して下さい。

Note

Rulesでも述べた通り、偽陽性や偽陰性が発生する可能性があります。申し訳ありません。誤りがあった場合はGitHub Issuesでお知らせ下さい。

また、論文執筆に際して学会や出版社側から指定されたスタイルに従うようにして下さい。

この拡張機能がお役に立てば幸いです。

Change Log

CHANGELOG.md を参照してください。

License

当プロジェクトでは MIT License を使用しています。

(ライブラリ to-title-case も MIT License に基づいています。)

Acknowledgement

いくつかの点で、私たちの拡張機能は次のものに類似しています。

これらのツールを開発してくださった方々に心から感謝申し上げます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?