LaTeX Lint
VS Code拡張機能 "LaTeX Lint" を作成しました。
本記事はその紹介となります。
GitHub レポジトリはこちらです。
Abstract
この拡張機能は、.tex
および .md
ファイル用のLaTeX Linter、及び学術論文執筆に役立つコマンドを提供します。
Rules
検出ルールは以下の通りです。
-
LLAlignAnd (
=&
,\leq&
,\geq&
などを検出) -
LLAlignEnd (
\\
で終わるalign
環境を検出) -
LLAlignSingleLine (
\\
なしのalign
環境を検出) - LLArticle (誤った冠詞を検出)
-
LLBig (
\cap_
,\cup_
などを検出) -
LLBracketCurly (
\max{
,\min{
を検出) -
LLBracketMissing (
x^23
などを検出) -
LLBracketRound (
\sqrt(
,^(
,_(
を検出) -
LLColonEqq (
:=
,=:
,::=
,=::
を検出) -
LLColonForMapping (写像で使われる
:
を検出) -
LLCref (
\ref
を検出、デフォルトで無効) -
LLDoubleQuotes (
“
,”
,"
を検出) -
LLENDash (疑わしい
-
の使用を検出) -
LLEqnarray (
eqnarray
環境を検出) - LLNonASCII (全角のASCII文字を検出)
-
LLLlGg (
<<
と>>
を検出) -
LLRefEq (
\ref{eq:
を検出) -
LLSharp (
\sharp
を検出) -
LLSI (
\SI
なしのKB
,MB
,GB
などを検出) -
LLT (
^T
を検出) -
LLThousands (
1,000
などを検出) -
LLTitle (
\title{}
,\section{}
などでの疑わしいタイトルケースを検出) -
LLUserDefined (
latexlint.userDefinedRules
で定義された正規表現を検出)
必要であればsample/lint.pdf と 日本語解説記事 もご参照ください。
LLAlignAnd
.tex
または .md
ファイル内の、=&
を検出します。
align
環境では={}&
と書くのが望ましいです。
また、\neq&
, \leq&
, \geq&
, \le&
, \ge&
, <&
, >&
なども検出します。
本拡張機能の制限として、table
環境内の&=
などの偽陽性がいくつかあります。
LLAlignEnd
.tex
または .md
ファイル内の、\\
で終わるalign
環境やgather
環境を検出します。
この改行は不要であると考えられます。
LLAlignSingleLine
.tex
または .md
ファイル内の、\\
なしのalign
環境を検出します。
1つの数式だけの場合、equation
環境を使用するのが望ましいです。
align
環境のspacingはequation
環境とそれと、1つの数式の場合に異なります。
どちらを使うかは使用者次第ですが、amsmath
公式ドキュメントでは、1つの数式にはequation
環境を使うことが想定されています。
LaTeX Lint: Rename \begin or end Commandsでコマンド名を変更できます。
LLArticle
.tex
または .md
ファイル内の、誤った冠詞を検出します。
例えば、A $n$-dimensional
は An $n$-dimensional
であるべきです(今後、他のパターンを追加するかもしれません)。
このようなエラーは、数式が含まれている為、Grammarlyなどの文法チェッカーでは検出できません。
LLBig
.tex
または .md
ファイル内の、\cap_
, \cup_
, \odot_
, \oplus_
, \otimes_
, \sqcup_
, uplus_
, \vee_
, \wedge_
を検出します。
代わりに \bigcap
, \bigcup
, \bigodot
, \bigoplus
, \bigotimes
, \bigsqcup
, \biguplus
, \bigvee
, \bigwedge
を使うのが望ましいです。
LLBracketCurly
.tex
または .md
ファイル内の、\max{
, \min{
を検出します。
代わりに \max(
, \min(
を使うのが望ましいです。
あるいは、\max
, \min
の後に明示的にスペースを追加して下さい。
LLBracketMissing
.tex
ファイル内の、^23
, _23
, ^ab
, _ab
などを検出します。
スコープを明確にするために {}
またはスペースを追加してください。

LLBracketRound
.tex
または .md
ファイル内の、\sqrt(
, ^(
, _(
を検出します。
代わりに \sqrt{
, ^{
, _{
を使うのが望ましいです。
LLColonEqq
.tex
ファイル内の、:=
, =:
, ::=
, =::
を検出します。
mathtoolsパッケージの\coloneqq
, \eqqcolon
, \Coloneqq
, \Eqqcolon
を使用するのが望ましいです。
:=
のコロンは少し低いですが、\coloneqq
のコロンは中央に配置されることが知られています。
LLColonForMapping
.tex
または .md
ファイル内の、写像に使われていると思わしき :
を検出します。
\colon
を使用するのが望ましいです。
\colon
が写像においては推奨されています。:
は比率(例えば 1:2
)に使われます。
このパターンを検出するために、:
の後に\to
、\mapsto
、\rightarrow
があるかどうかを確認します。:
の後10語以内でこれらのコマンドがあり、かつエスケープされていない $
の前の場合、:
は写像用の記号として認識されます。いくつかの偽陽性と偽陰性があります。
LLCref
.tex
ファイル内の、\ref
を検出します。
代わりに、cleverefパッケージの \cref
や \Cref
を使用するのが望ましいです。
デフォルトでこのルールは settings.json
の latexlint.disabledRules
にて無効化されています。
このパッケージは、"Sec."や"Fig."のような接頭辞を自動的に追加することができ、参照フォーマットの一貫性を保つのに役立ちます。
cleverefパッケージについては、opt-cpさんによるこちらのページも参照下さい。
LLDoubleQuotes
.tex
ファイル内で“
, ”
, "
を検出します。
これらは "XXX" や “XXX” のように使われていることがあります。
ダブルクォーテーションには ``XXX'' を使うべきです。
“XXX” に関しては、殆どの場合問題ありませんが、一貫性を保つために ``XXX'' を使う方が好ましいです。
csquotesパッケージを使って \enquote{XXX}
を使うことも出来ます。
LLENDash
.tex
または .md
ファイル内の、疑わしいハイフンの使用を検出します。
--
をenダッシュ、---
をemダッシュとして使うべきです。
このルールは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に問題がある為、非推奨です。
LLJapaneseSpace
.tex
または .md
ファイル内の、日本語文字と数式の間にスペースがない箇所を検出します。
デフォルトでこのルールは settings.json
の latexlint.disabledRules
にて無効化されています。
LLLlGg
.tex
または .md
ファイル内の、<<
と >>
を検出します。
代わりに \ll
と \gg
を使うべきです。
次のようなものは検出しません。
I like human $<<<$ cat $<<<<<<<$ dog.
LLNonASCII
.tex
または .md
ファイル内の、全角ASCII文字を検出します。
デフォルトでこのルールは settings.json
の latexlint.disabledRules
にて無効化されています。
以下の文字を検出します。
!"#$%&'*+,-./0123456789
:;<=>?@ABCDEFGHIJKLMNOPQ
RSTUVWXYZ[\]^_`abcdefghi
jklmnopqrstuvwxyz{|}~
我々は以下の正規表現を使用します。
[\u3000\uFF01-\uFF07\uFF0A-\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
また、U+3000は全角スペースとして使われます。
U+FF08とU+FF09はそれぞれ(
と)
に使われます。これらの文字は日本語文書でよく使われるため、検出しません。
すべての非ASCII文字を検出したい場合は、以下の正規表現を使用します。
[^\x00-\x7F]
\x00
から \x7F
はASCII文字です。
例えば、以下の日本語の文字を検出できます。
あア亜、。
LLRefEq
.tex
ファイル内の、\ref{eq:
を検出します。
代わりに \eqref{eq:
を使うべきです。
このコマンドは参照に括弧を自動的に追加します。
LLSharp
.tex
または .md
ファイル内の、\sharp
を検出します。
代わりにnumber signを示す \#
を使うべきです。
\sharp
は音楽記号として使われます。
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バイト)など。
接頭辞 | コマンド | 記号 | 指数 | 接頭辞 | コマンド | 記号 | 指数 |
---|---|---|---|---|---|---|---|
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
を使用するのが望ましいです。
LLT
.tex
または .md
ファイル内の、^T
を検出します。
行列やベクトルの転置を表す場合は、^\top
や ^\mathsf{T}
を使用するのが望ましいです。
そうでない場合、変数 T
の冪乗との区別がつきません。
LLThousands
.tex
ファイル内の、誤った数値のカンマ区切り(例:1,000
)を検出します。
代わりに 1{,}000
を使うか、icommaパッケージを使うのが望ましいです。
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
関数によって不変であるかどうかがテストされます。ただし、偽陽性や偽陰性が発生する可能性があります。
LLUserDefined
.tex
または .md
ファイル内の、独自に定義された正規表現を検出します。
詳細はLaTex Lint: Add Custom Detection Ruleを参照して下さい。
以下にいくつかの例を示します。
例1: 英文字にmathrmを使用する
数式モードで説明のために英文字を使う場合、 \mathrm
を使うべきです。
例えば、a
が変数ではなく、atractive forceのような意味を表す場合、f^a(x)
は f^{\mathrm{a}}(x)
と記述するべきです。
ただし、文脈無しでは検出が難しいです。そこで、以下の正規表現を定義してこのパターンを検出できます。
f\^a
例2: 適切に定義された演算子を使用する
演算子を使用する場合、\DeclareMathOperator
を使用するべきです。
例えば、\Box
をinfimal convolutionとして使用する場合、演算子として定義するべきです。
\DeclareMathOperator{\infConv}{\Box}
その後、\Box
の代わりに \infConv
を使用できます。
その他の機能
以下の機能も使用できます。これらのコマンドはエディターツールバーのアイコンをクリックすることで利用可能です。
LaTeX Lint: Add Custom Detection Rule
独自の検出ルールを追加します。
例えば、以下の手順で f^a
を検出できます。
1. 検出したい文字列を選択する(オプション)
2. コマンドを実行する(Add Custom Detection Rule)
アイコンをクリックするか、コマンドパレット(Ctrl
+Shift
+P
)を開いて LaTeX Lint: Add Custom Detection Rule
と入力してコマンドを実行します。
3. 指示に従う
string
を選択すると、入力自体を検出します。
Regex
を選択すると、正規表現を使用してパターンを検出します。
その後、独自のルールを定義できます。
LaTeX Lint: Choose Detection Rules
検出するルールを選択します。検出したいルールにチェックを入れます。
LaTeX Lint: Rename \begin or \end Commands
\begin{name}
または \end{name}
上で F2
を押してコマンドをリネームします。
LaTeX Lint: Query Wolfram Alpha
Wolfram Alpha に方程式を解かせます。
1. 解きたい方程式を選択する
2. コマンドを実行する(Query Wolfram Alpha)
アイコンをクリックするか、コマンドパレット(Ctrl
+Shift
+P
)を開いて LaTeX Lint: Query Wolfram Alpha
と入力してコマンドを実行します。
3. Wolfram Alpha ページを確認する
Wolfram Alpha ページで結果を確認できます。方程式を送信する際に不要なコマンドを削除します。
注意
Rulesでも述べた通り、偽陽性や偽陰性が発生する可能性があります。申し訳ありません。誤りがあった場合はGitHub Issuesでお知らせ下さい。
いかなるフィードバック、提案、プルリクエストも常に歓迎しています!
論文執筆に際しては、学会や出版社側から指定されたスタイルに従うようにして下さい。
この拡張機能がお役に立てば幸いです。
Change Log
CHANGELOG.md を参照してください。
License
当プロジェクトでは MIT License を使用しています。
(ライブラリ to-title-case も MIT License に基づいています。)
Acknowledgement
いくつかの点で、私たちの拡張機能は次のものに類似しています。
- LaTeX パッケージ chktex
- VS Code 拡張機能 Markdownlint
- VS Code 拡張機能 LaTeX Begin End Auto Rename
これらのツールを開発してくださった方々に心から感謝申し上げます。