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

Have any questions about Aspose.TeX?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.