Reparo de arquivo de LaTeX | Aspose.TeX para .NET
Como verificar e reparar um arquivo de LaTeX
Se você possui um arquivo de texto que acha que é um arquivo de LaTeX e deseja que ele seja digitado, mas não tem certeza se é realmente um arquivo de LaTeX (talvez você seja novo no mundo do LaTex), pode tentar usar o recurso de verificação e reparo de LaTeX fornecido pela API Aspose.TeX para .NET. No exemplo a seguir, verificaremos e repararemos um arquivo de amostra, inválido-latex.tex
, do projeto Aspose.TeX for .Net Exemplo.
Primeiro de tudo, vale a pena mencionar que, embora o arquivo de amostra pareça usar a sintaxe Tex, ele não possui a estrutura exigida pelo LATEX. Como você deve saber, um arquivo de LaTeX deve ter um preâmbulo que começa com o comando \documentclass
e um corpo dentro do ambientedocument ', ou seja, entre
\begin {document}e
\end {document}`.
Agora vamos olhar para o exemplo de código C#.
1// Create repair options.
2LaTeXRepairerOptions options = new LaTeXRepairerOptions();
3// Specify a file system working directory for the output.
4options.OutputWorkingDirectory = new OutputFileSystemDirectory(RunExamples.OutputDirectory);
5// Specify a file system working directory for the required input.
6// The directory containing packages may be located anywhere.
7options.RequiredInputDirectory = new InputFileSystemDirectory(Path.Combine(RunExamples.InputDirectory, "packages"));
8// Specify the callback class to externally guess packages required for undefined commands or environments.
9options.GuessPackageCallback = new PackageGuesser();
10// Run the repair process.
11new Features.LaTeXRepairer(Path.Combine(RunExamples.InputDirectory, "invalid-latex.tex"), options).Run();
Assim como em um trabalho de TEX regular, primeiro criamos um objeto que contém as opções do processo que estamos prestes a executar. A maioria deles é a mesma que as opções de um trabalho regular de Tex. De fato, o inputworkingDirectory é o espaço do qual os arquivos de entrada devem ser lidos. 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, outputworkingDirectory é o espaço onde os arquivos de saída devem ser gravados. RequeriringInputDirectory, se atribuído, aponta para o espaço onde você pode armazenar pacotes de LaTeX que não estão incorporados na biblioteca Aspose.TeX. A propriedade adivinhepackageCallback será discutida posteriormente.
Depois de atribuir as opções, simplesmente executamos o processo!
Então, como é o processo de verificação e reparo? Em primeiro lugar, a API pesquisa o arquivo de entrada para uma ocorrência \documentclass
. Se falhar, pressupõe que \documentclass {artigo}
deve ser inserido no início do arquivo. Esse fato é refletido no arquivo de relatório de reparo (.log
).
Em seguida, ele começa a digitalizar o arquivo de entrada ajustado desde o início. O mecanismo TEX carregado com o formato do LATEX pode causar um erro em algum momento, sinalizando que nenhum \ Begin {Document}
foi encontrado até agora, embora já deva ter ocorrido. Assim, a posição na qual \begin {document}
deve ser inserida é definida e refletida no relatório.
À medida que o motor verifica o arquivo, ele pode encontrar comandos ou ambientes indefinidos. 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, existe uma maneira de fazer essas suposições externamente, implementando a interface
iguesspackageCallback. Uma instância dessa classe deve ser atribuída à opção adivinhepackageCallback
.
Aqui está um exemplo muito simples que apenas mapeia o comando \head
para o pacote FancyHdr
:
1public class PackageGuesser : IGuessPackageCallback
2{
3 private Dictionary<string, string> _map = new Dictionary<string, string>();
4
5 public PackageGuesser()
6 {
7 _map.Add("lhead", "fancyhdr"); // Defines the mapping between the \lhead command and the fancyhdr package.
8 }
9
10 public string GuessPackage(string commandName, bool isEnvironment)
11 {
12 string packageName;
13 if (!isEnvironment)
14 {
15 _map.TryGetValue(commandName, out packageName);
16 return 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 arquivo de amostra, o mecanismo encontra primeiro o comando \ Capítulo
, que não está definido na classe de documentosartigo
, mas é definido na classe de documentos book
. A API ajusta a classe Document para que a versão final do arquivo fixo seja iniciado com \documentclass {Book}
. Em seguida, o motor encontra o comando \lhead
mencionado acima e decide que\usepackage {FancyHdr}
deve ser inserido no preâmbulo. Os comandos \href
e \incluemGraphics
que ocorrem mais tarde para fazer o reparador inserir \usepackage {hyperref}
e \usepackage {gráficos}
no preâmbulo, respectivamente. Essas decisões são baseadas nos mapeamentos internos da API. Novamente, todas essas correções são registradas no arquivo de relatório.
Finalmente, o motor termina anormalmente, pois falta o final normal de um documento de LaTeX. Isso faz com que o reparador anexe \end {document}
até o final do arquivo e reflita esse fato no relatório.
Depois que a versão fixa do arquivo original é construída, o reparador executa o trabalho Tex nele para a verificação final. Em nosso exemplo, essa execução não encontra erros críticos; portanto, a versão fixa pode ser digita mais ou menos conforme o esperado.
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
.