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

Rules

検出ルールは以下の通りです。

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

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

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 Commandsでコマンド名を変更できます。

LLArticle

.tex または .md ファイル内の、誤った冠詞を検出します。
例えば、A $n$-dimensionalAn $n$-dimensional であるべきです(今後、他のパターンを追加するかもしれません)。

このようなエラーは、数式が含まれている為、Grammarlyなどの文法チェッカーでは検出できません。

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

LLBracketMissing

.tex ファイル内の、^23, _23, ^ab, _ab などを検出します。
スコープを明確にするために {} またはスペースを追加してください。

![doc/LLBracketMissing](NO URL!!!)

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さんによるこちらのページも参照下さい。

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に問題がある為、非推奨です

LLJapaneseSpace

.tex または .md ファイル内の、日本語文字と数式の間にスペースがない箇所を検出します。
デフォルトでこのルールは settings.jsonlatexlint.disabledRules にて無効化されています。

LLLlGg

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

doc/LLLlGg

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

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

LLNonASCII

.tex または .md ファイル内の、全角ASCII文字を検出します。
デフォルトでこのルールは settings.jsonlatexlint.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を示す \# を使うべきです。

doc/LLSharp

\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バイト)など。

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

LLThousands

.tex ファイル内の、誤った数値のカンマ区切り(例:1,000)を検出します。
代わりに 1{,}000 を使うか、icommaパッケージを使うのが望ましいです。

doc/LLThousands

参考 Stack Exchange

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 ファイル内の、独自に定義された正規表現を検出します。

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

以下にいくつかの例を示します。

例1: 英文字にmathrmを使用する

数式モードで説明のために英文字を使う場合、 \mathrm を使うべきです。

例えば、a が変数ではなく、atractive forceのような意味を表す場合、f^a(x)f^{\mathrm{a}}(x) と記述するべきです。

doc/LLUserDefined1

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

f\^a

例2: 適切に定義された演算子を使用する

演算子を使用する場合、\DeclareMathOperator を使用するべきです。

例えば、\Boxinfimal convolutionとして使用する場合、演算子として定義するべきです。

\DeclareMathOperator{\infConv}{\Box}

doc/LLUserDefined2

その後、\Box の代わりに \infConv を使用できます。

その他の機能

以下の機能も使用できます。これらのコマンドはエディターツールバーのアイコンをクリックすることで利用可能です。

enableDisableButton

LaTeX Lint: Add Custom Detection Rule

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

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

addRule1

2. コマンドを実行する(Add Custom Detection Rule)

アイコンをクリックするか、コマンドパレット(Ctrl+Shift+P)を開いて LaTeX Lint: Add Custom Detection Rule と入力してコマンドを実行します。

addRule2

3. 指示に従う

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

その後、独自のルールを定義できます。

LaTeX Lint: Choose Detection Rules

検出するルールを選択します。検出したいルールにチェックを入れます。

selectRules

LaTeX Lint: Rename \begin or \end Commands

\begin{name} または \end{name} 上で F2 を押してコマンドをリネームします。

renameCommand

LaTeX Lint: Query Wolfram Alpha

Wolfram Alpha に方程式を解かせます。

1. 解きたい方程式を選択する

askWolframAlpha1

2. コマンドを実行する(Query Wolfram Alpha)

アイコンをクリックするか、コマンドパレット(Ctrl+Shift+P)を開いて LaTeX Lint: Query Wolfram Alpha と入力してコマンドを実行します。

askWolframAlpha2

3. Wolfram Alpha ページを確認する

Wolfram Alpha ページで結果を確認できます。方程式を送信する際に不要なコマンドを削除します。

askWolframAlpha3

注意

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?