Восстановление файлов LaTeX | Java

Как проверить и восстановить файл LaTeX

Если вы не уверены, является ли текстовый файл файлом LaTeX, и хотите, чтобы он был набран, вы можете использовать функцию проверки и восстановления LaTeX, предлагаемую API Aspose.TeX для Java. В приведенном ниже примере мы проверим и исправим образец файла invalid-latex.tex из примера проекта Aspose.TeX для Java.

Для начала важно отметить, что в примере файла используется синтаксис TeX, но ему не хватает структуры, требуемой LaTeX. Как вы, возможно, знаете, файл LaTeX должен включать преамбулу, которая начинается с команды \documentclass, а также тело, заключенное в среду документа, в частности, между \begin{document} и \end{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() указывает параметры на пространство, где вы можете хранить пакеты LaTeX, которые не встроены в библиотеку Aspose.TeX. Наконец, метод setGuessPackageCallback() будет обсуждаться позже.

После того, как параметры были назначены, мы можем приступить к запуску процесса.

Итак, каков же процесс проверки и ремонта? Все начинается с того, что API ищет вхождение \documentclass во входном файле. Если он не найден, API предполагает, что \documentclass{article} должен быть вставлен в начало файла. Эта информация записывается в файл отчета о ремонте (.log).

Далее процесс начинает сканирование скорректированного входного файла с самого начала. Движок TeX, оснащенный форматом LaTeX, может в какой-то момент выдать ошибку, указывающую, что \begin{document} еще не найден, хотя он уже должен был быть найден. Таким образом, позиция, в которой необходимо вставить \begin{document}, определяется и отражается в отчете.

При дальнейшем сканировании файла движок может встретить неопределенные команды или среды. В таких случаях API может делать предположения относительно встроенных необходимых пакетов (тех, которые определяют команды и среды, которые не определены до тех пор, пока эти пакеты не будут включены) для некоторых из наиболее распространенных команд и сред. Однако такие предположения можно сделать извне с помощью класса, реализующего интерфейс 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, которые встречаются позже в файле, заставляют Repairer вставлять \usepackage{hyperref} и \usepackage{graphics} в преамбулу соответственно. Эти решения принимаются на основе внутренних сопоставлений API. Как и прежде, все эти ремонты фиксируются в файле отчета.

Наконец, механизм аварийно завершает работу, поскольку отсутствует правильное заключение документа LaTeX. В результате Repairer добавляет \end{document} в конец файла и включает эту информацию в отчет.

После создания исправленной версии исходного файла Repairer запускает для него задание TeX для окончательной проверки. В нашем примере этот прогон не обнаруживает каких-либо критических ошибок, поэтому исправленную версию можно набрать более или менее так, как ожидалось.

Вот полный отчет:

 1Trying to repair the original file...
 2--------------------------------------------------------------------------------
 3\documentclass is missing in the original file. Inserted at the beginning.
 4\begin{document} is missing in the original file. Inserted at line 3, pos. 0.
 5The command \chapter at line 3, pos. 0 is undefined. Consider using \usepackage{package_name} in the preamble,
 6    where 'package_name' is the name of the package which defines this command.
 7The command \lhead at line 5, pos. 0 is undefined. \usepackage{fancyhdr} is inserted in the preamble
 8    since the 'fancyhdr' package supposedly defines the command.
 9The command \href at line 8, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
10    since the 'hyperref' package supposedly defines the command.
11The command \href at line 17, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
12    since the 'hyperref' package supposedly defines the command.
13The command \href at line 20, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
14    since the 'hyperref' package supposedly defines the command.
15The command \href at line 27, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
16    since the 'hyperref' package supposedly defines the command.
17The command \href at line 32, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
18    since the 'hyperref' package supposedly defines the command.
19The command \includegraphics at line 54, pos. 2 is undefined. \usepackage{graphicx} is inserted in the preamble
20    since the 'graphicx' package supposedly defines the command.
21The command \href at line 67, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
22    since the 'hyperref' package supposedly defines the command.
23The command \href at line 95, pos. 57 is undefined. \usepackage{hyperref} is inserted in the preamble
24    since the 'hyperref' package supposedly defines the command.
25The command \href at line 96, pos. 0 is undefined. \usepackage{hyperref} is inserted in the preamble
26    since the 'hyperref' package supposedly defines the command.
27The command \href at line 98, pos. 100 is undefined. \usepackage{hyperref} is inserted in the preamble
28    since the 'hyperref' package supposedly defines the command.
29\end{document} is missing in the original file. Inserted at the end.
30
31Checking the repaired file...
32--------------------------------------------------------------------------------
33There are no critical errors in the fixed file.

Вы также можете воспользоваться нашим бесплатным веб-приложением AI LaTeX Repairer, которое создано на основе функции, реализованной в Aspose.TeX for .NET API и включает в себя более продвинутый реализация интерфейса IGuessPackageCallback.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.