Восстановление файлов LaTeX | Java
Как проверить и восстановить файл LaTeX
Если вы не уверены, является ли текстовый файл файлом LaTeX, и хотите, чтобы он был набран, вы можете использовать функцию проверки и восстановления LaTeX, предлагаемую API Aspose.TeX для Java. В приведенном ниже примере мы проверим и исправим образец файла invalid-latex.tex из примера проекта Aspose.TeX для Java.
Для начала важно отметить, что в примере файла используется синтаксис TeX, но ему не хватает структуры, требуемой LaTeX. Как вы, возможно, знаете, файл LaTeX должен включать преамбулу, которая начинается с команды \documentclass, а также тело, заключенное в среду документа, в частности, между \begin{document} и \end{document}.
Задайте в inputFile полный путь к invalid-latex.tex, в outputDirectory — существующую папку вывода, а в packagesDirectory — папку с fancyhdr.sty и его зависимостями. Сохраните приведённый ниже callback вместе с импортом как PackageGuesser.java и перед восстановлением создайте PackageGuesser packageGuesser = new PackageGuesser(). Импортируйте используемые классы Aspose.TeX и обработайте или объявите исключения. Примените лицензию согласно
руководству по лицензированию. Входной и выходной каталоги остаются открытыми до завершения восстановления, затем закрываются.
1// Repair the LaTeX structure and infer packages for undefined commands.
2// inputFile is the full invalid LaTeX path; packagesDirectory contains fancyhdr.sty.
3// outputDirectory is an existing output folder; packageGuesser is a PackageGuesser instance.
4LaTeXRepairerOptions options = new LaTeXRepairerOptions();
5OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
6InputFileSystemDirectory packages = new InputFileSystemDirectory(packagesDirectory);
7options.setOutputWorkingDirectory(output);
8options.setRequiredInputDirectory(packages);
9options.setGuessPackageCallback(packageGuesser);
10TeXJobResult result;
11try {
12 result = new LaTeXRepairer(inputFile, options).run();
13} finally {
14 output.close();
15 packages.close();
16}Как и в обычном задании TeX, мы начинаем с создания объекта, содержащего параметры процесса, который мы собираемся запустить. Большинство этих опций такие же, как и для обычного задания TeX. Действительно, вызывая метод setInputWorkingDirectory(), мы указываем пространство, из которого должны читаться входные файлы. Однако в этом примере мы не используем его, поскольку мы указываем полный путь к основному входному файлу в файловой системе, и никакие пользовательские файлы не должны включаться в основной входной файл. Затем мы вызываем метод setOutputWorkingDirectory(), чтобы указать пространство, в которое должны быть записаны выходные файлы. При вызове метод setRequiredInputDirectory() указывает параметры на пространство, где вы можете хранить пакеты LaTeX, которые не встроены в библиотеку Aspose.TeX. Наконец, метод setGuessPackageCallback() будет обсуждаться позже.
После того, как параметры были назначены, мы можем приступить к запуску процесса.
Итак, каков же процесс проверки и ремонта? Все начинается с того, что API ищет вхождение \documentclass во входном файле. Если он не найден, API предполагает, что \documentclass{article} должен быть вставлен в начало файла. Эта информация записывается в файл отчета о ремонте (.log).
Далее процесс начинает сканирование скорректированного входного файла с самого начала. Движок TeX, оснащенный форматом LaTeX, может в какой-то момент выдать ошибку, указывающую, что \begin{document} еще не найден, хотя он уже должен был быть найден. Таким образом, позиция, в которой необходимо вставить \begin{document}, определяется и отражается в отчете.
При дальнейшем сканировании файла движок может встретить неопределенные команды или среды. В таких случаях API может делать предположения относительно встроенных необходимых пакетов (тех, которые определяют команды и среды, которые не определены до тех пор, пока эти пакеты не будут включены) для некоторых из наиболее распространенных команд и сред. Однако такие предположения можно сделать извне с помощью класса, реализующего интерфейс IGuessPackageCallback. После того как вы разработали такой класс, его экземпляр следует передать процессу, вызвав метод setGuessPackageCallback().
Этот пример сопоставляет команду \lhead с пакетом fancyhdr. Callback получает имя без начальной обратной косой черты и возвращает пустую строку для неизвестных команд и окружений:
1import com.aspose.tex.features.IGuessPackageCallback;
2
3// Save as PackageGuesser.java and assign an instance with setGuessPackageCallback().
4public class PackageGuesser implements IGuessPackageCallback {
5 @Override
6 public String guessPackage(String commandName, boolean isEnvironment) {
7 // The command name has no leading backslash.
8 if (!isEnvironment && "lhead".equals(commandName)) {
9 return "fancyhdr";
10 }
11 // Empty means that this callback cannot identify a package.
12 return "";
13 }
14}Что касается файла примера, движок сначала встречает команду \chapter, которая не определена в классе документа article, но определена в классе документа book. API корректирует класс документа так, чтобы окончательная версия восстановленного файла начиналась с \documentclass{book}. Затем движок находит вышеупомянутую команду \lhead и определяет, что \usepackage{fancyhdr} необходимо вставить в преамбулу. Команды \href и \includegraphics, которые встречаются позже в файле, заставляют Repairer вставлять \usepackage{hyperref} и \usepackage{graphicx} в преамбулу соответственно. Эти решения принимаются на основе внутренних сопоставлений API. Как и прежде, все эти ремонты фиксируются в файле отчета.
Наконец, механизм аварийно завершает работу, поскольку отсутствует правильное заключение документа LaTeX. В результате Repairer добавляет \end{document} в конец файла и включает эту информацию в отчет.
После восстановления Repairer запускает задание TeX для окончательной проверки. В этом примере итоговый отчёт не содержит критических ошибок. Значение, возвращаемое run(), может отражать исходный проход; проверяйте отчёт восстановления и исправленный файл .tex. Восстановление не предоставляет отсутствующие внешние ресурсы. Например, для полного набора нужно отдельно предоставить Figures/uet_logo.pdf, на который ссылается образец.
Вот полный отчет:
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.