乳胶文件维修| 用于 Java 的 Aspose.TeX
如何检查和维修乳胶文件
如果您不确定文本文件是否是乳胶文件并希望它是排版,则可以使用Aspose.TeX API为Java提供的检查和修复乳胶功能。在下面的示例中,我们将从java示例项目的aspose.tex中检查和修复示例文件nivalid-latex.tex
。
首先,重要的是要注意,示例文件似乎采用了Tex语法,但缺乏乳胶所需的结构。如您所知,乳胶文件必须包括一个从\ documentClass命令开始的序言,以及文档环境中包含的正文,特别是在\begin {document}和\ end {document {document}之间。
现在让我们看一下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();
与常规的TEX作业类似,我们首先创建一个对象,该对象拥有我们将要运行的过程的选项。这些选项中的大多数与定期Tex工作的选项相同。实际上,调用 setInputworkingDirectory()方法,我们指定了应读取输入文件的空间。但是,在此示例中,我们不在此处使用它,因为我们提供了文件系统中主要输入文件的完整路径,并且主要输入文件中不包含自定义文件。接下来,我们调用 setOutputworkingDirectory()方法来指定应编写输出文件的空间。如果调用,则 setRequiredInputDirectory()方法将选项指向您可以存储未嵌入Aspose.TeX库中的乳胶软件包的空间。最后, SetGuessPackageCallback()方法将在稍后讨论。
一旦分配了选项,我们就可以继续运行该过程。
那么,检查和维修过程是什么样的?它始于输入文件中的API搜索\documentclass
的出现。如果找不到它,则API假定应在文件开始时插入\documentclass{article}
。此信息记录在维修报告文件(.log)中。
接下来,该过程从一开始就开始扫描调整后的输入文件。配备乳胶格式的Tex引擎可能在某个时候会丢弃一个错误,表明\begin {document}
尚未在应该已经存在时找到。这样,必须在报告中定义并反映了必须插入\begin {document}
的位置。
在进一步扫描文件时,引擎可能会遇到未定义的命令或环境。在这种情况下,对于某些最常见的命令和环境,API可以在
嵌入式所需软件包上做出假设(5)(5)(5)。但是,可以通过实现
IguessPackageCallback接口的类在外部进行此类假设。一旦开发了这样的类,应通过调用setGuessPackageCallback()
方法将其实例传递给该过程。
这是一个基本示例,只需将\head
命令映射到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}
对于示例文件,引擎首先遇到 \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
接口的更高级实现。