Вбудована графіка LaTeX | Aspose.TeX для Java

Альтернативний спосіб додавання зображень

Деякі системи TeX/LaTeX дозволяють включати зображення, які не зберігаються ззовні відносно самого файлу LaTeX; натомість ці зображення вбудовано безпосередньо у файл LaTeX. Однак, оскільки файли TeX/LaTeX є простим текстом і не можуть містити двійкові дані, нам потрібен метод для представлення двійкових даних у текстовому форматі. Це означає, що двійкові дані повинні бути закодовані в текстове представлення. Проблема полягає в тому, що механізм TeX не може безпосередньо інтерпретувати ці закодовані зображення. Зрештою, зображення включаються за допомогою відомої команди \includegraphics з пакета graphicx, але ця команда обмежена обробкою зовнішніх файлів зображень. Таким чином, зовнішній файл зображення (разом із додатковим проміжним файлом) усе ще має бути створений поза файлом LaTeX, але це відбудеться лише під час верстки. Перевагою є те, що вам потрібно розповсюджувати лише сам файл LaTeX, а не набір файлів.

Гаразд, припустімо, що ми якимось чином вставили закодоване зображення у файл LaTeX. Як ми розшифруємо це зображення? На жаль, ми не можемо декодувати його безпосередньо, прочитавши його з файлу LaTeX і записавши його у зовнішній файл зображення. Замість цього текстовий рядок, який представляє закодоване зображення, потрібно спочатку записати у зовнішній текстовий файл, який потім можна декодувати для створення файлу зображення.

На цьому етапі ми можемо окреслити наступні кроки для досягнення бажаного результату:

  1. Закодуйте зображення.
  2. Вставте текстовий рядок, що представляє дані зображення, у файл LaTeX.
  3. Запишіть текстовий рядок, що представляє дані зображення, у зовнішній файл.
  4. Декодуйте зовнішній файл, створений на кроці 3.
  5. Включіть розшифроване зображення.

Перші два кроки виконує автор файлу LaTeX. Двигун TeX виконає решту кроків, звісно, ​​якщо він має відповідні інструкції.

Переходимо до Кроку 1. Як ми можемо закодувати наше зображення, щоб отримати рядок символів? Одним із методів для цього (і, ймовірно, найпопулярнішим) є Base64.

Кодування двійкових даних за допомогою Base64

Base64 — це група схем кодування двійкового кодування в текст, які перетворюють двійкові дані в послідовність друкованих символів, використовуючи набір із 64 унікальних символів. Зокрема, вихідні двійкові дані обробляються групами по 6 бітів, причому кожна група відображається на один із 64 унікальних символів. Як і всі схеми кодування двійкового кодування в текст, Base64 призначений для полегшення передачі даних, що зберігаються в двійкових форматах, через канали, які переважно підтримують текстовий вміст.

Це коротке пояснення показує, що Base64 – це саме те, що нам потрібно. Щоб закодувати файл зображення у Base64, ви можете скористатися утилітою командного рядка (якщо доступна у вашій операційній системі), стандартними або сторонніми функціями майже кожної мови програмування або онлайн-інструментами, такими як Base64.guru або подібні.

Вбудовування закодованого зображення у файл LaTeX

Рядок символів, згенерований у процесі кодування, має бути розміщено в стандартному середовищі LaTeX filecontents у преамбулі файлу LaTeX таким чином:

1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6...
7\end{document}

Ось воно! Крок 2 завершено. Ми успішно вставили зображення у файл LaTeX! Але що станеться, коли ми запустимо верстку цього файлу за допомогою LaTeX?"

Процесор LaTeX записує рядок символів із середовища у зовнішній файл під назвою sample-image.64. Через опцію overwrite файл буде перезаписано, якщо він уже існує (наприклад, якщо він був створений під час попереднього запуску). Ось як виконується Крок 3!

Декодування рядка base64

Крок 4 нашого плану — це те, де в гру вступають відмінності в реалізації TeX. Декодування рядка символів Base64 виконується за допомогою більш поширеної речі, відомої як функція \write18.

\write18

У класичних механізмах TeX \write<номер>(<список токенів>) є примітивом, який використовується для запису списку токенів. При використанні цього примітиву слідує ціле число. Якщо ціле число від’ємне, маркери записуються до файлу стенограми (журналу). Якщо ціле число більше за 15, маркери надсилаються на термінал. Якщо ціле число потрапляє в діапазон 0..15, маркери записуються у файл, ім’я якого вказано попереднім входженням примітиву \openout. Примітив \openout<4-bit integer>=<ім'я файлу> пов’язує ім’я файлу з числом.

Новіші реалізації TeX, такі як PDF TeX, дозволяють використовувати \write18. У цьому випадку вони інтерпретують <список маркерів> як командний рядок для виконання в оболонці операційної системи. Оскільки ця функція, Вочевидь становить потенційну загрозу безпеці, ви можете відчути натяк на таємницю щоразу, коли на неї згадуються в документації, пов’язаній з TeX, або в Інтернеті. З цієї причини виконувані файли PDF TeX/LaTeX пропонують параметри команд для керування доступом до цієї функції.

Як правило, існує три рівні доступності: вимкнено, увімкнено з обмеженнями та повністю ввімкнено.

У Aspose.TeX є параметр завдання TeX під назвою ShellMode, який може приймати одне з двох можливих значень: NoShellEscape і ShellRestricted. Значення NoShellEscape вказує на те, що функцію вимкнено. Останнє значення означає, що будь-яка команда, яка потребує виконання, має бути реалізована користувачем як розширення класу Executable. Ми не будемо вдаватися в особливості таких реалізацій тут, але важливо зазначити, що емуляція команди base64 вже реалізована в Aspose.TeX і включена за замовчуванням у властивість колекції Executables класу TeXOptions екземпляр. Вбудована емуляція base64 виконується всередині Aspose.TeX і не потребує утиліти Base64 операційної системи.

Декодування даних у кодуванні Base64

Щоб декодувати вміст файлу, який, як очікується, міститиме дані в кодуванні Base64, ми зазвичай використовуємо такий командний рядок:

1base64 -d  FILE1 > FILE2

де FILE1 – це «закодований» файл, а > FILE2 перенаправляє вивід у файл FILE2.

Тому ми повинні включити такий рядок у тіло нашого файлу LaTeX:

1\immediate\write18{base64 -d  sample-image.64 > sample-image.png}

The \immediate prefix is required to ensure that the \write operation is executed immediately when the TeX scanner encounters this primitive. Otherwise, it will be processed during the page ship-out.

Якщо ми зараз запустимо набір файлу, ми побачимо, що файл зображення sample-image.png було створено. Відкрийте його у програмі перегляду, щоб перевірити!

Включаючи розшифроване зображення

Як ми зазначали на початку статті, щоб включити декодоване зображення, ми використовуємо відому команду LaTeX \includegraphics:

1\includegraphics[options]{sample-image.png}

Наступний приклад показує структуру документа. Замініть скорочений рядок Base64 повними даними зображення: крапки є заповнювачем і не можуть бути декодовані:

1\documentclass{article}
2\usepackage{graphicx}
3\begin{filecontents*}[overwrite]{sample-image.64}
4iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
5\end{filecontents*}
6\begin{document}
7  \immediate\write18{base64 -d sample-image.64 > sample-image.png}
8  \includegraphics[width=\textwidth]{sample-image.png}
9\end{document}

Приклад Java перетворює повний документ embedded-base64-image.tex на PDF. Задайте в inputFile повний шлях до вхідного файлу, а в outputDirectory — наявну папку виводу. Імпортуйте використані класи com.aspose.tex, com.aspose.tex.rendering.PdfDevice та com.aspose.tex.rendering.PdfSaveOptions. Обробіть або оголосіть винятки й застосуйте ліцензію відповідно до посібника з ліцензування. Приклад вмикає ShellRestricted для вбудованої команди Base64, працює без взаємодії з користувачем і зберігає вивід термінала в пам’яті. Пристрій PDF та вихідний каталог звільняються або закриваються після завершення завдання. Папка містить sample-image.64, декодоване зображення sample-image.png, PDF та журнал TeX:

 1// Decode an embedded Base64 image with Aspose.TeX's built-in base64 command and include it in PDF.
 2// inputFile is the full LaTeX input path; outputDirectory is an existing output folder.
 3TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
 4OutputFileSystemDirectory output = new OutputFileSystemDirectory(outputDirectory);
 5options.setOutputWorkingDirectory(output);
 6options.setSaveOptions(new PdfSaveOptions());
 7options.setShellMode(ShellMode.ShellRestricted);
 8options.setInteraction(Interaction.NonstopMode);
 9options.setTerminalOut(new OutputMemoryTerminal());
10PdfDevice device = new PdfDevice();
11TeXJobResult result;
12try {
13    result = new TeXJob(inputFile, device, options).run();
14} finally {
15    device.dispose();
16    output.close();
17}

І тепер Крок 5 завершено. Щоб отримати справді вичерпні приклади, перегляньте наш Приклад проекту.

Ви також можете ознайомитися з безкоштовним веб-додатком, створеним на основі Aspose.TeX для .NET API.