Другие выходные форматы преобразования TeX | Java

Крайне маловероятно, что вы сейчас захотите конвертировать файл TeX, написанный в любом другом формате, кроме LaTeX. Но это возможно, если вы по какой-то причине изучаете язык TeX и/или его внутренности. В любом случае, Aspose.TeX for Java позволяет конвертировать файлы, написанные в формате Plain TeX. Он также позволяет создавать собственные форматы и верстать документы, разработанные в этих форматах.

Начнем с создания пользовательского формата.

Создание пользовательского формата

Напомним, что файл формата представляет собой двоичный дамп внутреннего состояния движка TeX.

Укажите в inputDirectory папку с файлом customtex.tex и его зависимостями, а в outputDirectory — существующую папку вывода. Исходный файл формата должен заканчиваться командой \dump; пример создаёт в папке вывода файл customtex.fmt. Импортируйте классы Aspose.TeX, используемые в примерах, а для набора текста также com.aspose.tex.rendering.XpsDevice, java.io.ByteArrayInputStream и java.nio.charset.StandardCharsets. Вызывающий метод должен обрабатывать или объявлять исключения. Примените лицензию согласно руководству по лицензированию, чтобы избежать ограничений ознакомительной версии.

 1// Create a custom TeX format from customtex.tex, which ends with \dump.
 2// inputDirectory contains customtex.tex; outputDirectory is an existing output folder.
 3TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectIniTeX());
 4InputFileSystemDirectory input = new InputFileSystemDirectory(inputDirectory);
 5OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
 6options.setInputWorkingDirectory(input);
 7options.setOutputWorkingDirectory(output);
 8options.setInteraction(Interaction.NonstopMode);
 9options.setTerminalOut(new OutputMemoryTerminal());
10try {
11    TeXJob.createFormat("customtex", options);
12} finally {
13    output.close();
14    input.close();
15}

Как видите, код аналогичен коду конвертации файла TeX. Но есть несколько отличий.

Во-первых, здесь мы используем конфигурацию задания TeXConfig.objectIniTeX() . Это специальная конфигурация, которая оставляет состояние движка «девственным», т. е. внутренние параметры имеют значения по умолчанию, а набор управляющих последовательностей совпадает с набором примитивов. В нашем примере набор примитивов расширен в смысле, упомянутом здесь.

Далее мы настраиваем рабочие каталоги ввода и вывода как обычно. Входной рабочий каталог должен содержать исходный файл основного формата и все его зависимости.

И второе ключевое отличие — это то, как мы выполняем работу. На этот раз мы используем статический метод createFormat() , который вместе с параметрами принимает имя основного исходного файла, которое должно совпадать с именем формата.

Набор текста TeX-файла в вашем пользовательском формате

Теперь, когда у нас есть собственный формат TeX, мы хотим набрать файл TeX, написанный в этом формате. Вот код:

Укажите в formatDirectory папку с ранее созданным файлом customtex.fmt, а в outputDirectory — существующую папку вывода. Пример выполняет набор из самодостаточного текстового потока в typeset-with-custom-format.xps, поэтому рабочая папка ввода не требуется. Задайте её, если основной ввод содержит зависимости, например изображения.

 1// Typeset text using the previously created customtex.fmt format.
 2// formatDirectory contains customtex.fmt; outputDirectory is an existing output folder.
 3InputFileSystemDirectory formatInput = new InputFileSystemDirectory(formatDirectory);
 4FormatProvider formatProvider = new FormatProvider(formatInput, "customtex");
 5OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
 6XpsDevice device = new XpsDevice();
 7TeXJobResult result;
 8try {
 9    TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectTeX(formatProvider));
10    options.setJobName("typeset-with-custom-format");
11    options.setOutputWorkingDirectory(output);
12    options.setInteraction(Interaction.NonstopMode);
13    options.setTerminalOut(new OutputMemoryTerminal());
14    // No input working directory is needed for this self-contained stream.
15    try (ByteArrayInputStream text = new ByteArrayInputStream(
16            "Congratulations! You have successfully typeset this text with your own TeX format!\\end"
17                    .getBytes(StandardCharsets.US_ASCII))) {
18        result = new TeXJob(text, device, options).run();
19    }
20} finally {
21    device.dispose();
22    output.close();
23    formatProvider.close();
24    formatInput.close();
25}

Очевидно, нам нужно как-то указать формат. Прежде всего, нам нужно создать экземпляр класса FormatProvider . Затем в конструкторе параметров мы используем конфигурацию TeXConfig.objectTeX(FormatProvider), которая принимает нашего поставщика формата в качестве аргумента и загружает формат поверх «девственного» состояния движка.

Оба примера выполняются без взаимодействия с пользователем и сохраняют вывод терминала в памяти. После выполнения задания пример набора закрывает входной поток, освобождает устройство XPS и закрывает рабочую папку и поставщика формата. Эти возможности обсуждались ранее в этом руководстве.

Набор текста файла TeX в формате Plain TeX

Если мы используем TeXConfig.objectTeX() без поставщика формата, движок загрузит формат по умолчанию, то есть Object TeX в четвертом смысле. Таким образом, если у вас есть файл TeX, написанный в формате Plain TeX, вы можете преобразовать его в любой поддерживаемый целевой формат.