Ремонт файлів LaTeX | Aspose.TeX для Java
Як перевірити та відновити файл LaTeX
Якщо ви не впевнені, чи є текстовий файл файлом LaTeX, і хочете, щоб він був набраний, ви можете скористатися функцією перевірки та відновлення LaTeX, яку пропонує Aspose.TeX API для 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}
у кінець файлу та включає цю інформацію у звіт.
Після створення фіксованої версії оригінального файлу Ремонтник запускає над ним завдання 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
.