LaTeX ドキュメントの静的分析?

LaTeX ドキュメントの静的分析?

C、、などC++のプログラミング言語では、何らかの静的アナライザー、つまりソースコードにアクセスできないコード、未使用の変数、メモリ リーク、およびコンパイルに関係のないその他の内容 (そのためコンパイラはそれをまったく報告または認識しません) をチェックするツールが常に存在します。C#Java

LaTeX用の同様のツールはありますか?

もちろん、古いマクロやパッケージをチェックしonlyamsmathたりnagrefcheck未使用のラベルをチェックしたりするパッケージやツールもあります。しかし、

  • 到達不能コード: \if\else\fi1 つ以上のパスに到達できない構造ですか?
  • 'sのような非効率的なループは\foreach簡略化できるでしょうか?
  • 未使用のマクロ定義ですか?
  • \newcommand*適切な場合には の代わりにを使用することを提案しています\newcommandか?
  • 括弧や空白が不足している疑いがありますか? たとえば、次のようになります:
    1. a^b c- クリア
    2. a^{bc}- クリア
    3. a^bc- 疑わしい: 1. のように表示されますが、おそらく 2. が意図されていたのでしょうか?
  • 疑わしい空行(段落)がありますか?たとえば、テキストと数式の間などですか?
  • 疑わしいまたは行方不明行末コメント?
  • 他にも、人間の目には間違っている、非効率的である、または不明瞭であることがよくあることを思いつきますか?

答え1

簡単に答えると、それは不可能です。

いくつかの機能を実行するツールはありますが、それらは実際に LaTeX ドキュメントを分析することはできないため、それらが提供するアドバイスはヒントとしてのみ受け止めるべきであり、間違っている可能性があります。

LaTeX と、あなたが言及した C や Java などの言語との大きな違いは、LaTeX の構文は解析できず、入力の基本的な字句解析やトークン化でさえ実行時の動作に依存することです。

\section[abc}

静的解析で検出されると思われる構文エラーのようですが、ドキュメントが

\documentclass{article}

\ifodd\time\catcode`[1\fi
\begin{document}

\section[abc}

aa
\end{document}

つまり、真夜中からの経過分数に応じて、有効な文書であるかそうでないかが決まります。これは明らかに極端なケースですが、あなたが考えるほど極端ではありません。多くのパッケージが、文書の分析を変更する同様のことを行います。たとえば、babel のショートカットを考えてみてください。babel がロードされたという事実は、プリアンブルを調べることで静的に検出できますが、どの言語がどの時点で有効であるかを判断するには、実際には完全な LaTeX インタープリタを実行する必要があります。

たとえ可能だとしても、一部のアイテムにフラグを立てるべきかどうか疑問に思います。

  • 到達不能コード: \if\else\fi1 つ以上のパスに到達できない構造ですか?

ここで難しいのは、どのトークンが実際にテストであるかを判断することです。ほとんどの場合、\if But トークンなどの Tex プリミティブは表示されません。But トークンは\newifチェッカーによって認識されにくくなります。この意味では、すべてのトークンが if トークンで始まると想定できるかもしれません\if..が、たとえば LaTeX はbut\ifthenelseで始まり\if....、構文が非常に異なります。

  • 'sのような非効率的なループは\foreach簡略化できるでしょうか?

\foreachは単なるマクロなので、ほぼ定義上、マクロを拡張することで特定の使用を簡略化できます。ただし、これは簡略化とは見なされない可能性があります...

  • 未使用のマクロ定義ですか?

LaTeX とそのすべてのパッケージはマクロ定義であり、ほとんどのドキュメントでは定義されているコマンドのほとんどが使用されないため、通常、特定のドキュメントには何千もの未使用のマクロが存在します。

  • \newcommand*適切な場合には の代わりにを使用することを提案しています\newcommandか?

特定の文書でマクロの使用をすべて記録し、その場合にマクロが決して実行されないことを記録しない限り、これをどのように実行できるかわかりません。

  • 括弧や空白が不足している疑いがありますか? たとえば、次のようになります:
    1. a^b c- クリア
    2. a^{bc}- クリア
    3. a^bc- 疑わしい: 1. のように表示されますが、おそらく 2. が意図されていたのでしょうか?

私はこのチェックには同意しません。2. は標準の LaTeX 構文です。1. を許可することに決めた場合は、3. もコメントなしで許可する必要があります。空白はコマンド名を終了する以外は重要ではないというのが、TeX 数式モード構文の設計の中心的な部分です。

  • 疑わしい空行(段落)がありますか?たとえば、テキストと数式の間などですか?

TeX は、表示に続くテキストが新しい段落であるかどうかを区別するのに多少手間をかけますが、LaTeX はすべてのリスト環境でこの動作をエミュレートします。したがって、静的アナライザーが文を解釈して段落の始まりではないことを示唆しない限り、空白行にコメントするべきではありません。

  • [行末コメント][1]が疑わしいか欠落していますか?

はい、latex3 構文の開始や、ルールや意味を変更する同様のパッケージを認識できる限り、%必要ありません。

  • 他にも、人間の目には間違っている、非効率的である、または不明瞭であることがよくあることを思いつきますか?

人間に文書を校正してもらうのは良い考えです。人間の目は機械よりも優れています:-)

答え2

受け入れられた回答には多くの良い点が挙げられていますが、LaTeX の静的解析を実行するソフトウェアは存在します。予想どおり、それらは Python のような言語のリンターほど包括的ではありません。

最も注目すべきリンターはチェクテックス。また、CTANそして、TeXライブ(以来2010)。

関連情報