Ремонт файлів LaTeX | .NET

Як перевірити та відновити файл LaTeX

Якщо у вас є текстовий файл, який, на вашу думку, є файлом LaTeX, і ви хочете, щоб він був набраний, але ви не впевнені, чи це справді файл LaTeX (можливо, ви новачок у світі LaTeX), ви можете спробувати використати перевірку і відновлення функції LaTeX, наданої API Aspose.TeX для .NET. У наступному прикладі ми перевіримо та відновимо зразок файлу invalid-latex.tex із прикладу проекту Aspose.TeX для .NET.

Перш за все, варто зазначити, що хоча файл зразка, здається, використовує синтаксис TeX, він не має структури, необхідної для LaTeX. Як ви, можливо, знаєте, файл LaTeX повинен мати преамбулу, яка починається з команди \documentclass, і тіло в середовищі document, тобто між \begin{document} і \end{document}.

Давайте тепер розглянемо зразок коду C#.

 1// Create repair options.
 2LaTeXRepairerOptions options = new LaTeXRepairerOptions();
 3// Specify a file system working directory for the output.
 4options.OutputWorkingDirectory = new OutputFileSystemDirectory(RunExamples.OutputDirectory);
 5// Specify a file system working directory for the required input.
 6// The directory containing packages may be located anywhere.
 7options.RequiredInputDirectory = new InputFileSystemDirectory(Path.Combine(RunExamples.InputDirectory, "packages"));
 8// Specify the callback class to externally guess packages required for undefined commands or environments.
 9options.GuessPackageCallback = new PackageGuesser();
10// Run the repair process.
11new Features.LaTeXRepairer(Path.Combine(RunExamples.InputDirectory, "invalid-latex.tex"), options).Run();

Як і у випадку зі звичайним завданням TeX, ми спочатку створюємо об’єкт, який містить параметри процесу, який ми збираємося запустити. Більшість із них такі самі, як і параметри звичайної роботи TeX. Дійсно, InputWorkingDirectory — це простір, з якого слід читати вхідні файли. Ми не використовуємо його тут, тому що ми надаємо повний шлях до основного вхідного файлу у файловій системі, і жодні спеціальні файли не повинні включатися в головний вхідний файл. Тоді OutputWorkingDirectory — це простір, куди мають бути записані вихідні файли. RequiredInputDirectory, якщо його призначено, вказує на простір, де ви можете зберігати пакети LaTeX, які не вбудовані в бібліотеку Aspose.TeX. Властивість GuessPackageCallback буде обговорено пізніше.

Після призначення параметрів ми просто запускаємо процес!

Отже, як виглядає процес перевірки та ремонту? По-перше, API шукає у вхідному файлі \documentclass. Якщо це не вдається, передбачається, що \documentclass{article} має бути вставлено на самому початку файлу. Цей факт відображається у файлі звіту про ремонт (.log).

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

Під час подальшого сканування файлу механізм може виявити невизначені команди чи середовища. API може зробити припущення щодо вбудованих необхідних пакетів (тих, що визначають команди та середовища, які не визначені, доки ці пакети не включено) для деяких із найпоширеніших команд і середовищ. Однак існує спосіб зробити такі припущення зовні, реалізувавши інтерфейс IGuessPackageCallback. Екземпляр такого класу слід призначити параметру GuessPackageCallback.

Ось дуже простий приклад, який просто відображає команду \head на пакет fancyhdr:

 1public class PackageGuesser : IGuessPackageCallback
 2{
 3    private Dictionary<string, string> _map = new Dictionary<string, string>();
 4
 5    public PackageGuesser()
 6    {
 7        _map.Add("lhead", "fancyhdr"); // Defines the mapping between the \lhead command and the fancyhdr package.
 8    }
 9
10    public string GuessPackage(string commandName, bool isEnvironment)
11    {
12        string packageName;
13        if (!isEnvironment)
14        {
15            _map.TryGetValue(commandName, out packageName);
16            return 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.