Análise estática de documentos LaTeX?

Análise estática de documentos LaTeX?

Para linguagens de programação como C, C++, e assim por diante C#, Javasempre 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 onlyamsmathou nagque verificam macros ou pacotes desatualizados e refcheckque verificam rótulos não utilizados. Mas existem pacotes e/ou ferramentas que verificam ou sugerem

  • código inacessível: \if\else\ficonstruções onde um ou mais caminhos nunca podem ser alcançados?
  • loops ineficientes, como \foreachos que poderiam ser simplificados?
  • definições de macro não utilizadas?
  • sugerindo o uso de \newcommand*em vez de \newcommandquando apropriado?
  • falta suspeita de possíveis colchetes ou espaços em branco? Como:
    1. a^b c- claro
    2. a^{bc}- claro
    3. a^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\ficonstruçõ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 \newifdos 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 \ifthenelsecomeça com, \if....mas tem uma sintaxe muito diferente.

  • loops ineficientes, como \foreachos 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 \newcommandquando 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:
    1. a^b c- claro
    2. a^{bc}- claro
    3. a^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).

informação relacionada