LaTeX Lint
VS Code拡張機能 "LaTeX Lint" を作成しました。
本記事はその紹介となります。
GitHub レポジトリはこちらです。
Abstract
この拡張機能は、.tex
および .md
ファイル用のLaTeX Linter、及び学術論文執筆に役立つコマンドを提供します。
この拡張機能によって、一般的なミスを検出し、さらに独自の正規表現ルールを定義して検出出来ます。
また、\begin{name}
や \end{name}
上で F2
を押してコマンド名を変更したり、選択した数式をWolfram Alphaに解かせたり出来ます。
Features
コマンドパレット(Ctrl
+Shift
+P
)を開き、コマンドを入力することで、以下の機能を使用できます。
LaTeX Lint: Diagnose Current File
現在編集しているLaTeXまたはMarkdownファイルを診断します。このコマンドは、ファイル保存時に自動的に実行されます。
検出ルールは以下の通りで、詳細は Rules に記載されています。
-
LLAlignAnd (
=&
,\leq&
,\geq&
などを検出) -
LLAlignEnd (
\\
で終わるalign
環境を検出) -
LLAlignSingleLine (
\\
なしのalign
環境を検出) -
LLBig (
\cap_
,\cup_
などを検出) -
LLBracketCurly (
\max{
,\min{
を検出) -
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
を検出) -
LLTitle (
\title{}
,\section{}
などでの疑わしいタイトルケースを検出) -
LLUserDefined (
latexlint.userDefinedRules
で定義された正規表現を検出)
必要であればsample/lint.pdf と 日本語解説記事 もご参照ください。
検出するルールは、コマンド LaTeX Lint: Select Rule to Detect
で簡単に選択できます。
LaTeX Lint: Enable/Disable LaTeX Lint
LaTeX Lintを有効化または無効化します。このコマンドは、エディターのツールバーのアイコンをクリックして実行できます。
LaTeX Lint: Add Rule to Detect
独自のルールを追加します。
例えば、以下の手順で $f^a$
を検出できます。
手順を表示
1. 検出したい文字列を選択(オプション)
2. コマンドを実行 (Add Rule to Detect)
コマンドパレット(Ctrl
+Shift
+P
)を開き、LaTeX Lint: Add Rule to Detect
と入力します。
3. 指示に従う
string
を選択すると入力そのものを検出します。
Regex
を選択すると正規表現パターンを使用して検出します。
これで独自のルールを定義できます。
LaTeX Lint: Select Rule to Detect
検出するルールを選択します。検出したいルールのみをチェックできます。
LaTeX Lint: Rename \begin{} or \end{}
追加機能として、\begin{name}
または \end{name}
上で F2
を押してコマンドをリネームできます。
LaTeX Lint: Ask Wolfram Alpha
追加機能として、選択した数式をWolfram Alphaに解かせることができます。
手順を表示
1. 解きたい数式を選択
2. コマンドを実行 (Ask Wolfram Alpha)
コマンドパレット(Ctrl
+Shift
+P
)を開き、LaTeX Lint: Ask Wolfram Alpha
と入力します。
3. Wolfram Alphaのページで確認
Wolfram Alphaページで結果を確認できます。
送信時に不要なコマンドは自動的に削除されます。
Rules
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{}でコマンド名を変更できます。
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
の後に明示的にスペースを追加して下さい。
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さんによるこちらのページも参照下さい。
\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}
を使うことも出来ます。
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に問題がある為、非推奨です。
LLLlGg
.tex
または .md
ファイル内の、<<
と >>
を検出します。
代わりに \ll
と \gg
を使うべきです。
次のようなものは検出しません。
I like human $<<<$ cat $<<<<<<<$ dog.
LLRefEq
.tex
ファイル内の、\ref{eq:
を検出します。
代わりに \eqref{eq:
を使うべきです。
このコマンドは参照に括弧を自動的に追加します。
LLSharp
.tex
または .md
ファイル内の、\sharp
を検出します。
代わりにnumber signを示す \#
を使うべきです。
\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バイト)など。
接頭辞 | コマンド | 記号 | 指数 | 接頭辞 | コマンド | 記号 | 指数 |
---|---|---|---|---|---|---|---|
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
の冪乗との区別がつきません。
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
ファイル内の、独自に定義された正規表現を検出します。
例えば、数式モードで説明のために英文字を使う場合、 \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
いくつかの点で、私たちの拡張機能は次のものに類似しています。
- LaTeX パッケージ chktex
- VS Code 拡張機能 Markdownlint
- VS Code 拡張機能 LaTeX Begin End Auto Rename
これらのツールを開発してくださった方々に心から感謝申し上げます。