Reparo de arquivo de LaTeX | Aspose.TeX para Java

Como verificar e reparar um arquivo de LaTeX

Se você não tiver certeza se um arquivo de texto é um arquivo de LaTeX e deseja que ele seja digitado, pode utilizar o recurso de verificação e reparo do LaTeX oferecido pela API Aspose.TeX para Java. No exemplo abaixo, verificaremos e repararemos um arquivo de amostra, inválido-latex.tex, do projeto Aspose.TeX for java.

Para começar, é importante observar que o arquivo de amostra parece empregar a sintaxe Tex, mas carece da estrutura exigida pelo LaTeX. Como você deve saber, um arquivo de LaTeX deve incluir um preâmbulo que começa com o comando \documentclass, bem como um corpo envolto no ambiente do documento, especificamente entre \begin{document} e \end{document}.

Defina inputFile como o caminho completo de invalid-latex.tex, outputDirectory como uma pasta de saída existente e packagesDirectory como uma pasta com fancyhdr.sty e suas dependências. Salve o callback abaixo como PackageGuesser.java com sua importação e crie PackageGuesser packageGuesser = new PackageGuesser() antes do reparo. Importe as classes Aspose.TeX utilizadas e trate ou declare as exceções. Aplique uma licença conforme o guia de licenciamento. Os diretórios permanecem abertos até o fim do reparo e depois são fechados.

 1// Repair the LaTeX structure and infer packages for undefined commands.
 2// inputFile is the full invalid LaTeX path; packagesDirectory contains fancyhdr.sty.
 3// outputDirectory is an existing output folder; packageGuesser is a PackageGuesser instance.
 4LaTeXRepairerOptions options = new LaTeXRepairerOptions();
 5OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
 6InputFileSystemDirectory packages = new InputFileSystemDirectory(packagesDirectory);
 7options.setOutputWorkingDirectory(output);
 8options.setRequiredInputDirectory(packages);
 9options.setGuessPackageCallback(packageGuesser);
10TeXJobResult result;
11try {
12    result = new LaTeXRepairer(inputFile, options).run();
13} finally {
14    output.close();
15    packages.close();
16}

Semelhante a um trabalho de TEX regular, começamos criando um objeto que mantém as opções para o processo que estamos prestes a executar. A maioria dessas opções é a mesma que as de um emprego de Tex regular. De fato, chamando o método setInputWorkingDirectory (), especificamos o espaço do qual os arquivos de entrada devem ser lidos. No entanto, neste exemplo, não o usamos aqui porque fornecemos o caminho completo para o arquivo de entrada principal no sistema de arquivos, e nenhum arquivo personalizado deve ser incluído no arquivo de entrada principal. Em seguida, chamamos o método setOutputWorkingDirectory () para especificar o espaço onde os arquivos de saída devem ser gravados. Se chamado, o método setRequiredInputDirectory () faz as opções apontam para o espaço onde você pode armazenar pacotes de LaTeX que não estão incorporados na biblioteca Aspose.TeX. Finalmente, o método setGuessPackageCallback () será discutido posteriormente.

Depois que as opções forem atribuídas, podemos prosseguir com a execução do processo.

Então, como é o processo de verificação e reparo? Começa com a pesquisa de API por uma ocorrência \documentclass no arquivo de entrada. Se não for encontrado, a API assume que \documentclass {Article} deve ser inserida no início do arquivo. Esta informação é registrada no arquivo de relatório de reparo (.log).

Em seguida, o processo começa a digitalizar o arquivo de entrada ajustado desde o início. O mecanismo TEX equipado com o formato do LATEX pode, em algum momento, lançar um erro indicando que \begin{document} ainda não foi encontrado quando deveria já ter. Dessa forma, a posição na qual \begin{document} deve ser inserida é definida e refletida no relatório.

Ao digitalizar ainda mais o arquivo, o mecanismo pode encontrar comandos ou ambientes indefinidos. Nesses casos, a API pode fazer suposições em Pacotes necessários incorporados (aqueles que definem os comandos e ambientes que não são definidos até que esses pacotes estejam incluídos) para alguns dos comandos e ambientes mais comuns. No entanto, é possível fazer essas suposições externamente por uma classe que implementa a interface iguesspackageCallback. Depois de desenvolver essa classe, uma instância deve ser passada para o processo chamando o método setGuessPackageCallback ().

Este exemplo associa o comando \lhead ao pacote fancyhdr. O callback recebe o nome sem a barra invertida inicial e retorna uma string vazia para comandos e ambientes desconhecidos:

 1import com.aspose.tex.features.IGuessPackageCallback;
 2
 3// Save as PackageGuesser.java and assign an instance with setGuessPackageCallback().
 4public class PackageGuesser implements IGuessPackageCallback {
 5    @Override
 6    public String guessPackage(String commandName, boolean isEnvironment) {
 7        // The command name has no leading backslash.
 8        if (!isEnvironment && "lhead".equals(commandName)) {
 9            return "fancyhdr";
10        }
11        // Empty means that this callback cannot identify a package.
12        return "";
13    }
14}

Quanto ao ficheiro de exemplo, o mecanismo encontra primeiro o comando \chapter, que não está definido na classe de documento article, mas sim na classe de documento book. A API ajusta a classe de documento para que a versão final do ficheiro reparado comece por \documentclass{book}. De seguida, o motor encontra o comando \lhead mencionado anteriormente e determina que \usepackage{fancyhdr} deve ser introduzido no preâmbulo. Os comandos \href e \includegraphics, que ocorrem posteriormente no ficheiro, fazem com que o Reparador introduza \usepackage{hyperref} e \usepackage{graphicx} no preâmbulo, respetivamente. Estas decisões são tomadas com base nos mapeamentos internos da API. Como antes, todos estes reparos são registados no ficheiro de relatório.

Finalmente, o motor termina anormalmente porque a conclusão adequada de um documento de LaTeX está faltando. Como resultado, o reparador anexa \end{document} ao final do arquivo e inclui essas informações no relatório.

Após o reparo, o Repairer executa um trabalho TeX para a verificação final. Neste exemplo, o relatório final não contém erros críticos. O valor retornado por run() pode corresponder à análise original; verifique o relatório e o arquivo .tex corrigido. O reparo não fornece recursos externos ausentes. Por exemplo, o arquivo de amostra referencia Figures/uet_logo.pdf, que deve ser fornecido separadamente para completar a composição.

Aqui está o relatório completo:

 1A tentar reparar o ficheiro original...
 2--------------------------------------------------------------------------------
 3\documentclass está em falta no ficheiro original. Inserido no início.
 4\begin{document} está em falta no ficheiro original. Inserido na linha 3, pos. 0.
 5O comando \chapter na linha 3, pos. 0, é indefinido. Considere utilizar \usepackage{nome_do_pacote} no preâmbulo,
 6em que 'nome_do_pacote' é o nome do pacote que define este comando.
 7O comando \lhead na linha 5, pos. 0, é indefinido. \usepackage{fancyhdr} é inserido no preâmbulo
 8uma vez que o pacote 'fancyhdr' supostamente define o comando.
 9O comando \href na linha 8, pos. 0, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
10uma vez que o pacote 'hyperref' supostamente define o comando.
11O comando \href na linha 17, pos. 0, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
12uma vez que o pacote 'hyperref' supostamente define o comando.
13O comando \href na linha 20, pos. 0, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
14uma vez que o pacote 'hyperref' supostamente define o comando.
15O comando \href da linha 27, pos. 0, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
16uma vez que o pacote 'hyperref' supostamente define o comando.
17O comando \href na linha 32, pos. 0, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
18uma vez que o pacote 'hyperref' supostamente define o comando.
19O comando \includegraphics na linha 54, pos. 2, é indefinido. \usepackage{graphicx} é inserido no preâmbulo
20uma vez que o pacote 'graphicx' supostamente define o comando.
21O comando \href da linha 67, pos. 0, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
22uma vez que o pacote 'hyperref' supostamente define o comando.
23O comando \href na linha 95, pos. 57, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
24uma vez que o pacote 'hyperref' supostamente define o comando.
25O comando \href na linha 96, pos. 0, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
26uma vez que o pacote 'hyperref' supostamente define o comando.
27O comando \href na linha 98, pos. 100, é indefinido. \usepackage{hyperref} é inserido no preâmbulo
28uma vez que o pacote 'hyperref' supostamente define o comando.
29\end{document} está em falta no ficheiro original. Inserido no final.
30
31A verificar o ficheiro reparado...
32--------------------------------------------------------------------------------
33Não existem erros críticos no ficheiro corrigido.

Você também pode conferir nosso aplicativo Web GRATUITO ** AI LATEX **, que é construído com base no recurso implementado no Aspose.TeX para .NET API e envolve uma implementação mais avançada da interface iguesspackagecallback.