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}.
Agora vamos olhar para a amostra de código Java.
1// Create repair options.
2LaTeXRepairerOptions options = new LaTeXRepairerOptions();
3// Specify a file system working directory for the output.
4options.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
5// Specify a file system working directory for the required input.
6// The directory containing packages may be located anywhere.
7options.setRequiredInputDirectory(new InputFileSystemDirectory(Utils.getInputDirectory() + "packages"));
8// Specify the callback class to externally guess packages required for undefined commands or environments.
9options.setGuessPackageCallback(new PackageGuesser());
10
11// Run the repair process.
12new LaTeXRepairer(Utils.getInputDirectory() + "invalid-latex.tex", options).run();
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 ()
.
Aqui está um exemplo básico que simplesmente mapeia o comando \head
para o pacote FancyHdr
:
1// The callback class to externally guess packages required for undefined commands or environments.
2public static class PackageGuesser implements IGuessPackageCallback
3{
4 private Map<String, String> _map = new HashMap<String, String>();
5
6 public PackageGuesser()
7 {
8 _map.put("lhead", "fancyhdr"); // Defines the mapping between the \lhead command and the fancyhdr package.
9 }
10
11 public String guessPackage(String commandName, boolean isEnvironment)
12 {
13 if (!isEnvironment)
14 {
15 String packageName = _map.get(commandName);
16 return packageName != null ? packageName : ""; // It's better to return an empty string to avoid consequent calls for the same command name.
17 }
18
19 // Some code for environments
20 // ...
21
22 return "";
23 }
24}
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{graphics}
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.
Depois de criar a versão fixa do arquivo original, o reparador executa um trabalho de Tex nele para a verificação final. Em nosso exemplo, essa execução não detecta erros críticos; portanto, a versão fixa pode ser digita mais ou menos conforme o esperado.
Aqui está o relatório completo:
2,545 / 5,000
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
.