
Para linguagens de programação como C
, C++
, e assim por diante C#
, Java
sempre existe algum tipo de analisador estático, ferramentas que verificam o código-fonte em busca de código inacessível, variáveis não utilizadas, vazamentos de memória e outros tipos de coisas que não são relevantes para compilação (e então os compiladores não não relate ou perceba nada).
Existem ferramentas semelhantes para LaTeX?
Claro, existem alguns pacotes, como onlyamsmath
ou nag
que verificam macros ou pacotes desatualizados e refcheck
que verificam rótulos não utilizados. Mas existem pacotes e/ou ferramentas que verificam ou sugerem
- código inacessível:
\if\else\fi
construções onde um ou mais caminhos nunca podem ser alcançados? - loops ineficientes, como
\foreach
os que poderiam ser simplificados? - definições de macro não utilizadas?
- sugerindo o uso de
\newcommand*
em vez de\newcommand
quando apropriado? - falta suspeita de possíveis colchetes ou espaços em branco? Como:
a^b c
- claroa^{bc}
- claroa^bc
- suspeito: renderiza como 1. mas talvez 2. fosse pretendido?
- linhas vazias suspeitas (parágrafos)? Por exemplo, entre texto e equação?
- suspeito ou desaparecidocomentários de linha final?
- qualquer outra coisa que você possa pensar que muitas vezes é errada, ineficiente ou pouco clara para o olho humano?
Responder1
A resposta curta é que não é possível.
Existem algumas ferramentas que fazem algumas coisas, mas elas não conseguem realmente analisar o documento de látex e, portanto, qualquer conselho que elas derem deve ser interpretado apenas como dicas, pois podem estar errados.
A grande diferença entre o LaTeX e as linguagens que você menciona, como C e Java, é que a sintaxe do LaTeX não pode ser analisada, mesmo a análise lexical básica e a tokenização da entrada dependem do comportamento do tempo de execução.
\section[abc}
Parece que pode ser um erro de sintaxe que você esperaria que uma análise estática detectasse, mas o documento pode estar
\documentclass{article}
\ifodd\time\catcode`[1\fi
\begin{document}
\section[abc}
aa
\end{document}
o que significa que é ou não um documento válido dependendo do número de minutos desde a meia-noite. Este é obviamente um caso extremo, mas não tão extremo quanto você pode imaginar. Muitos pacotes fazem coisas semelhantes que alteram a análise do documento, pense nas taquigrafias do babel, por exemplo. O fato de o babel ter sido carregado pode ser detectado estaticamente inspecionando o preâmbulo, mas determinar qual linguagem está em vigor a qualquer momento realmente requer a execução de um interpretador LaTeX completo.
Mesmo se fosse possível, eu questionaria se alguns de seus itens realmente deveriam ser sinalizados.
- código inacessível:
\if\else\fi
construções onde um ou mais caminhos nunca podem ser alcançados?
A dificuldade aqui é determinar quais tokens são de fato testes, principalmente você não vê primitivos Tex, como \if
tokens But definidos por meio \newif
dos quais são mais difíceis de reconhecer por um verificador. Talvez pudesse assumir que todo token inicial \if..
é um token if nesse sentido, mas, por exemplo, o LaTeX \ifthenelse
começa com, \if....
mas tem uma sintaxe muito diferente.
- loops ineficientes, como
\foreach
os que poderiam ser simplificados?
\foreach
é simplesmente uma macro, então quase por definição qualquer uso específico dela pode ser simplificado expandindo a macro. Mas isso pode não ser visto como simplificação...
- definições de macro não utilizadas?
LaTeX e todos os seus pacotes são definições de macro e a maioria dos documentos não usa a maioria dos comandos definidos, portanto, normalmente existem milhares de macros não utilizadas em qualquer documento.
- sugerindo o uso de
\newcommand*
em vez de\newcommand
quando apropriado?
Não tenho certeza de como isso poderia ser feito, a menos que você registre todos os usos da macro em um determinado documento e observe que isso nunca ocorre nesse caso,
- falta suspeita de possíveis colchetes ou espaços em branco? Como:
a^b c
- claroa^{bc}
- claroa^bc
- suspeito: renderiza como 1. mas talvez 2. fosse pretendido?
Eu discordaria dessa verificação. 2. é a sintaxe padrão do látex. Se você decidir permitir 1. então você também deve permitir 3 sem comentários. É uma parte central do design da sintaxe do modo matemático do TeX que o espaço em branco não seja significativo além de encerrar nomes de comandos.
- linhas vazias suspeitas (parágrafos)? Por exemplo, entre texto e equação?
O TeX se esforça para distinguir o caso de o texto após uma exibição ser ou não um novo parágrafo, e o LaTeX emula esse comportamento para todos os seus ambientes de lista. Portanto, a menos que o analisador estático esteja interpretando as frases e sugerindo que não deveria ser o início de um parágrafo, ele não deveria comentar as linhas em branco.
- suspeito ou ausente [comentários finais] [1]?
Sim, desde que possa reconhecer o início da sintaxe latex3 ou pacotes similares que alteram as regras e o significado %
não é necessário.
- qualquer outra coisa que você possa pensar que muitas vezes é errada, ineficiente ou pouco clara para o olho humano?
conseguir que um ser humano revise o documento é uma boa ideia, os olhos humanos ainda são melhores nisso do que as máquinas :-)
Responder2
Embora a resposta aceita apresente vários pontos positivos, existe software para realizar análises estáticas do LaTeX. Como esperado, eles não são tão abrangentes quanto os linters para uma linguagem como Python.
O linter mais notável éChkTeX. Também está ligadoCTANe faz parteTeX ao vivo(desde2010).