乳胶文件维修| .NET的Aspose.TeX
如何检查和维修乳胶文件
如果您认为您认为是乳胶文件,并且希望它是排版的文本文件,但是您不确定它是否真的是乳胶文件(也许您是乳胶世界的新手),则可以尝试使用Aspose.TeX.net提供的aspose.tex api提供的检查和修复乳胶功能。在下面的示例中,我们将从aspose.tex for .NET示例项目中检查和修复示例文件nivalid-latex.tex
。
首先,值得一提的是,虽然示例文件看似使用了 TeX 语法,但它并不具备 LaTeX 所需的结构。您可能知道,LaTeX 文件必须包含一个以 \documentclass
命令开头的序言,以及一个位于 document
环境中的正文,即 \begin{document}
和 \end{document}
之间。
现在让我们看一下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();
与常规TEX作业一样,我们首先创建一个对象,其中包含我们将要运行的过程的选项。他们中的大多数与常规Tex工作的选项相同。实际上, InputWorkingDirectory是应读取输入文件的空间。我们在这里不使用它,因为我们提供了文件系统中主要输入文件的完整路径,并且不应在主输入文件中包含自定义文件。然后, outputWorkingDirectory是应编写输出文件的空间。 esultiNputDirectory,如果分配,则指向您可以存储未嵌入Aspose.TeX库中的乳胶软件包的空间。 GuesspackageCallback属性将在稍后讨论。
分配选项后,我们简单地运行该过程!
那么,检查和维修过程是什么样的?首先,API搜索输入文件以查看\ documentClass
的出现。如果失败,则假定必须在文件的开始时插入\documentclass{article}
。此事实反映在维修报告文件(.log
)中。
然后,从一开始就开始扫描调整后的输入文件。带有乳胶格式的Tex引擎可能会在某个时候丢失错误,表明到目前为止未找到\begin {document}
,尽管应该已经发生了。因此,在报告中定义和反映了必须插入\begin {document}
的位置。
随着引擎进一步扫描文件,它可能会发现未定义的命令或环境。 API可以在 嵌入式所需软件包上做出假设(在包括这些软件包的命令和环境中定义了这些命令和环境的命令和环境的假设)。但是,有一种方法可以通过实现 IguessPackageCallback接口来进行外部做出此类假设。此类类的实例应分配给“ upectpackagecallback”选项。
这是一个非常简单的示例,只需将\ head
命令映射到fancyhdr
package:
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}
对于示例文件,引擎首先遇到 \chapter
命令,该命令未在 article
文档类中定义,但在 book
文档类中定义。API 会调整文档类,使修复文件的最终版本以 \documentclass{book}
开头。然后,引擎找到前面提到的 \lhead
命令,并决定必须在前言中插入 \usepackage{fancyhdr}
。随后出现的 \href
和 \includegraphics
命令分别使修复程序在前言中插入 \usepackage{hyperref}
和 \usepackage{graphics}
。这些决定基于 API 的内部映射。同样,所有此类修复都会记录在报告文件中。
最后,由于缺少乳胶文档的正常结尾,因此发动机异常终止。这使得修理器将\end{document}
附加到文件的末尾,并在报告中反映了这一事实。
构建原始文件的固定版本后,维修器将在其上运行Tex作业以进行最终检查。在我们的示例中,此运行没有发现任何关键错误,因此固定版本可能是预期的或多或少的排版。
这是完整的报告:
1正在尝试修复原始文件……
2--------------------------------------------------------------------------------
3原始文件中缺少 \documentclass。已将其插入到开头。
4原始文件中缺少 \begin{document}。已将其插入到第 3 行第 0 位置。
5第 3 行第 0 位置的命令 \chapter 未定义。请考虑在前言中使用 \usepackage{package_name},
6其中“package_name”是定义此命令的包的名称。
7第 5 行第 0 位置的命令 \lhead 未定义。\usepackage{fancyhdr} 已插入到前言中,
8因为“fancyhdr”包应该定义了该命令。
9第 8 行第 0 位置的命令 \href 未定义。\usepackage{hyperref} 已插入到前言中,
10因为“hyperref”包应该定义了该命令。
11第 17 行第 0 位置的命令 \href 未定义。 \usepackage{hyperref} 插入到序言中,
12因为 'hyperref' 包应该定义了该命令。
13第 20 行第 0 位置的命令 \href 未定义。\usepackage{hyperref} 插入到序言中,
14因为 'hyperref' 包应该定义了该命令。
15第 27 行第 0 位置的命令 \href 未定义。\usepackage{hyperref} 插入到序言中,
16因为 'hyperref' 包应该定义了该命令。
17第 32 行第 0 位置的命令 \href 未定义。\usepackage{hyperref} 插入到序言中,
18因为 'hyperref' 包应该定义了该命令。
19第 54 行第 2 位置的命令 \includegraphics 未定义。 \usepackage{graphicx} 插入到序言中,
20因为 'graphicx' 包应该定义了该命令。
21第 67 行第 0 位置的命令 \href 未定义。\usepackage{hyperref} 插入到序言中,
22因为 'hyperref' 包应该定义了该命令。
23第 95 行第 57 位置的命令 \href 未定义。\usepackage{hyperref} 插入到序言中,
24因为 'hyperref' 包应该定义了该命令。
25第 96 行第 0 位置的命令 \href 未定义。\usepackage{hyperref} 插入到序言中,
26因为 'hyperref' 包应该定义了该命令。
27第 98 行第 100 位置的命令 \href 未定义。 \usepackage{hyperref} 已插入到前言中
28因为 'hyperref' 包应该定义了该命令。
29\end{document} 在原始文件中缺失。已插入到末尾。
30
31正在检查修复后的文件……
32--------------------------------------------------------------------------------
33修复后的文件中没有严重错误。
您还可以查看我们免费的
AI LaTeX Repairer Web 应用程序,该应用程序基于
Aspose.TeX for .NET API 中实现的功能构建,并涉及 IGuessPackageCallback
接口的更高级实现。