
Для таких языков программирования, как 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-документ, поэтому любые советы, которые они дают, следует воспринимать только как подсказки, они могут быть неверными.
Главное различие между 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
конструкции, в которых один или несколько путей никогда не могут быть достигнуты?
Трудность здесь в определении того, какие токены на самом деле являются тестами, в основном вы не видите примитивов Tex, таких как \if
Но токены, определенные через \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 или подобных пакетов, которые изменяют правила и означают, %
что это не обязательно.
- Что еще вы можете придумать, что очень часто оказывается неправильным, неэффективным или непонятным для человеческого глаза?
Хорошая идея — поручить человеку вычитать документ. Человеческие глаза справляются с этим лучше машин:-)
решение2
Хотя принятый ответ содержит ряд хороших моментов, программное обеспечение для выполнения статического анализа LaTeX существует. Как и ожидалось, они не столь всеобъемлющи, как линтеры для такого языка, как Python.
Наиболее заметным таким линтером являетсяChkTeX. Он также находится наКТАНи является частьюТеХ в прямом эфире(с2010).