乳胶文件维修| 用于 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 接口的更高级实现。

Have any questions about Aspose.TeX?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.