Ремонт файлів 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}.
Задайте в 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.