Восстановление файлов 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.