Другие параметры управления TeX | Python через .NET

Примеры создают файлы XPS. Сначала примените лицензию и задайте папку вывода в ASPOSE_TEX_OUTPUT_DIR (по умолчанию: output). Запускайте каждый пример в отдельной папке вывода, чтобы сохранить все результаты.

Настройка режима взаимодействия

Как упоминалось в параграфе взаимодействия TeX, Aspose.TeX for Python предоставляет возможность установить начальный режим взаимодействия, в котором запускается движок. Вот пример того, как это можно сделать:

 1# Process a LaTeX document without interactive error prompts.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17options.save_options = save_options
18device = XpsDevice()
19source = r"\documentclass{article}\begin{document}Hello, World!\end{document}"
20with BytesIO(source.encode("ascii")) as stream:
21    result = TeXJob(stream, device, options).run()

Установка имени задания

Если в качестве имени файла указан основной входной файл, результирующие выходные файлы будут иметь то же имя, но с разными расширениями. Движок TeX называет имя входного файла имя задания и использует его для выходных файлов. Исключение составляют вспомогательные файлы с явно указанными именами. Однако когда основной входной файл передается как поток, движок TeX использует имя задания по умолчанию — texput. В обоих сценариях возможно переопределение имени задания путем назначения соответствующего параметра преобразования.

 1# Override the output job name.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17options.job_name = "my-job-name"
18options.save_options = save_options
19device = XpsDevice()
20source = r"\documentclass{article}\begin{document}Hello, World!\end{document}"
21with BytesIO(source.encode("ascii")) as stream:
22    result = TeXJob(stream, device, options).run()

«Остановка времени»

Чтобы автоматически генерировать заголовок на основе определенных определений в преамбуле, LaTeX предлагает функцию, которая обычно включает текущую дату. Однако могут быть случаи, когда мы хотим присвоить дате определенное значение. Вот метод достижения этой цели:

 1# Fix the date used by LaTeX.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17from datetime import datetime
18options.date_time = datetime(2022, 12, 18)
19options.save_options = save_options
20device = XpsDevice()
21source = r"\documentclass{article}\begin{document}\today\end{document}"
22with BytesIO(source.encode("ascii")) as stream:
23    result = TeXJob(stream, device, options).run()

Игнорирование отсутствующих пакетов

Если у нас есть файл LaTeX, содержащий ссылки на пакеты, которые не поддерживаются библиотекой Aspose.TeX for Python, движок TeX обнаружит ошибку и остановится при попытке загрузить эти пакеты. Чтобы предотвратить это, мы можем использовать следующую опцию:

 1# Skip an unavailable LaTeX package.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17options.ignore_missing_packages = True
18options.save_options = save_options
19device = XpsDevice()
20source = r"\documentclass{article}\usepackage{asposeexamplemissingpackage}\begin{document}Hello, World!\end{document}"
21with BytesIO(source.encode("ascii")) as stream:
22    result = TeXJob(stream, device, options).run()

Как избежать наращивания лигатур

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

 1# Disable construction of typographic ligatures.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17options.no_ligatures = True
18options.save_options = save_options
19device = XpsDevice()
20source = r"\documentclass{article}\begin{document}office efficient affine\end{document}"
21with BytesIO(source.encode("ascii")) as stream:
22    result = TeXJob(stream, device, options).run()

Повторение задания

Как упоминалось в параграфе входного файла LaTeX, метки и ссылки, бывают ситуации, когда нам может потребоваться выполнить одно и то же задание дважды. Вот способ добиться этого:

 1# Resolve a forward reference by repeating the job.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17options.repeat = True
18options.save_options = save_options
19device = XpsDevice()
20source = r"\documentclass{article}\begin{document}See Section \ref{sec:target}.\section{Target}\label{sec:target}\end{document}"
21with BytesIO(source.encode("ascii")) as stream:
22    result = TeXJob(stream, device, options).run()

Превращение математических формул в растровые изображения

Если есть необходимость преобразовать математические формулы в растровые изображения вместо их отображения шрифтами, для этой цели можно использовать следующую опцию:

 1# Render math formulas as raster images.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17save_options.rasterize_formulas = True
18options.save_options = save_options
19device = XpsDevice()
20source = r"\documentclass{article}\begin{document}Formula: $x^2+y^2=z^2$\end{document}"
21with BytesIO(source.encode("ascii")) as stream:
22    result = TeXJob(stream, device, options).run()

Превращение графики в растровые изображения

Механизм ObjectTeX предоставляет возможность включать графические файлы в растровых форматах, таких как PNG и JPG, а также в форматах PS (EPS) и XPS (OXPS). Последние два формата обычно содержат векторные элементы и текст. Если мы хотим растеризовать и включить их в виде сплошных изображений, мы можем использовать следующую опцию:

 1# Rasterize an included vector EPS graphic.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17save_options.rasterize_included_graphics = True
18input_root = Path(os.environ.get("ASPOSE_TEX_INPUT_DIR", "input")).resolve()
19options.input_working_directory = InputFileSystemDirectory(str(input_root / "Typesetting"))
20options.save_options = save_options
21device = XpsDevice()
22source = r"\documentclass{article}\usepackage{graphicx}\begin{document}\includegraphics{triangle.eps}\end{document}"
23with BytesIO(source.encode("ascii")) as stream:
24    result = TeXJob(stream, device, options).run()

Пример с графикой читает Typesetting/triangle.eps из каталога ASPOSE_TEX_INPUT_DIR (по умолчанию: input). Сохраните этот подкаталог при подготовке ресурсов.

Подмножество шрифтов

Если мы хотим уменьшить размер выходного файла, мы можем использовать поднабор шрифтов, что означает, что шрифты в результирующем документе не будут включать данные для тех глифов, которые отсутствуют в документе. Вот решение для достижения этой цели:

 1# Embed only the used font glyphs.
 2import os
 3from pathlib import Path
 4from io import BytesIO
 5from aspose.tex import Interaction, TeXConfig, TeXJob, TeXOptions
 6from aspose.tex.io import InputFileSystemDirectory, OutputFileSystemDirectory, OutputMemoryTerminal
 7from aspose.tex.presentation.xps import XpsDevice, XpsSaveOptions
 8
 9output_dir = Path(os.environ.get("ASPOSE_TEX_OUTPUT_DIR", "output")).resolve()
10output_dir.mkdir(parents=True, exist_ok=True)
11
12options = TeXOptions.console_app_options(TeXConfig.object_latex)
13options.output_working_directory = OutputFileSystemDirectory(str(output_dir))
14options.terminal_out = OutputMemoryTerminal()
15options.interaction = Interaction.NONSTOP_MODE
16save_options = XpsSaveOptions()
17save_options.subset_fonts = True
18options.save_options = save_options
19device = XpsDevice()
20source = r"\documentclass{article}\begin{document}Hello, World!\end{document}"
21with BytesIO(source.encode("ascii")) as stream:
22    result = TeXJob(stream, device, options).run()