
C
對於諸如、C++
、C#
等程式語言,Java
總是存在某種靜態分析器、工具來檢查原始程式碼中是否存在無法存取的程式碼、未使用的變數、記憶體洩漏和其他與編譯無關的東西(因此編譯器不這樣做)根本不報告或註意到它)。
LaTeX 有類似的工具嗎?
當然,有一些包,例如onlyamsmath
或nag
檢查過時的巨集或包,並refcheck
檢查未使用的標籤。但是否有軟體包和/或工具可以檢查或提示
- 無法到達的程式碼:
\if\else\fi
一條或多條路徑永遠無法到達的結構? - 低效率循環,例如
\foreach
可以簡化嗎? - 未使用的巨集定義?
\newcommand*
建議在適當的地方使用代替\newcommand
?- 懷疑缺少可能的括號或空格?喜歡:
a^b c
- 清除a^{bc}
- 清除a^bc
- 可疑:呈現為 1. 但也許 2. 是有意為之?
- 可疑的空白行(段落)?例如文字和方程式之間?
- 可疑或失踪結束行註釋?
- 您能想到的其他任何東西通常是錯誤的、低效的或肉眼看不清楚的嗎?
答案1
簡短的回答是這是不可能的。
有一些工具可以做一些事情,但它們不能真正分析乳膠文檔,因此它們給出的任何建議只能作為提示,可能是錯誤的。
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\fi
一條或多條路徑永遠無法到達的結構?
這裡的困難在於確定哪些標記實際上是測試,大多數情況下您看不到諸如\if
But 之類的 Tex 原語,透過\newif
這些標記定義的標記更難被檢查器識別。也許可以假設每個令牌開頭\if..
都是一個 if 令牌,但例如 LaTeX\ifthenelse
開頭\if....
但具有非常不同的語法。
- 低效率循環,例如
\foreach
可以簡化嗎?
\foreach
只是一個宏,因此幾乎根據定義,它的任何特定使用都可以透過擴展宏來簡化。但這可能不被視為簡化......
- 未使用的巨集定義?
LaTeX 及其所有套件都是巨集定義,大多數文件不使用定義的大部分命令,因此任何給定文件中通常有數千個未使用的巨集。
\newcommand*
建議在適當的地方使用代替\newcommand
?
我不確定如何做到這一點,除非您在給定文件中記錄巨集的每次使用,並注意在這種情況下它永遠不會達到標準,
- 懷疑缺少可能的括號或空格?喜歡:
a^b c
- 清除a^{bc}
- 清除a^bc
- 可疑:呈現為 1. 但也許 2. 是有意為之?
我不同意這項檢查。 2.是標準的latex語法。如果您決定允許 1.,那麼您也應該允許 3,且不加評論。 TeX 數學模式語法設計的核心部分是,除了終止命令名稱之外,空格並不重要。
- 可疑的空白行(段落)?例如文字和方程式之間?
TeX 在區分顯示後面的文字是否是新段落時遇到了一些麻煩,而 LaTeX 在其所有清單環境中模擬了這種行為。因此,除非靜態分析器正在解釋句子並建議它不應該是段落的開頭,否則它不應該對空白行進行評論。
- 可疑或缺失[結束行註解][1]?
是的,只要它能夠識別 Latex3 語法的開頭或類似的改變規則的包,%
就沒有必要。
- 您能想到的其他任何東西通常是錯誤的、低效的或肉眼看不清楚的嗎?
讓人類校對文件是個好主意,人眼在這方面仍然比機器更好:-)