Вбудована графіка LaTeX | API для Java
Альтернативний спосіб додавання зображень
Деякі системи TeX/LaTeX дозволяють включати зображення, які не зберігаються ззовні відносно самого файлу LaTeX; натомість ці зображення вбудовано безпосередньо у файл LaTeX. Однак, оскільки файли TeX/LaTeX є простим текстом і не можуть містити двійкові дані, нам потрібен метод для представлення двійкових даних у текстовому форматі. Це означає, що двійкові дані повинні бути закодовані в текстове представлення. Проблема полягає в тому, що механізм TeX не може безпосередньо інтерпретувати ці закодовані зображення. Зрештою, зображення включаються за допомогою відомої команди \includegraphics
з пакета graphicx
, але ця команда обмежена обробкою зовнішніх файлів зображень. Таким чином, зовнішній файл зображення (разом із додатковим проміжним файлом) усе ще має бути створений поза файлом LaTeX, але це відбудеться лише під час верстки. Перевагою є те, що вам потрібно розповсюджувати лише сам файл LaTeX, а не набір файлів.
Гаразд, припустімо, що ми якимось чином вставили закодоване зображення у файл LaTeX. Як ми розшифруємо це зображення? На жаль, ми не можемо декодувати його безпосередньо, прочитавши його з файлу LaTeX і записавши його у зовнішній файл зображення. Замість цього текстовий рядок, який представляє закодоване зображення, потрібно спочатку записати у зовнішній текстовий файл, який потім можна декодувати для створення файлу зображення.
На цьому етапі ми можемо окреслити наступні кроки для досягнення бажаного результату:
- Закодуйте зображення.
- Вставте текстовий рядок, що представляє дані зображення, у файл LaTeX.
- Запишіть текстовий рядок, що представляє дані зображення, у зовнішній файл.
- Декодуйте зовнішній файл, створений на кроці 3.
- Включіть розшифроване зображення.
Перші два кроки виконує автор файлу 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
Щоб декодувати вміст файлу, який, як очікується, міститиме дані в кодуванні 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}
Отже, повний (майже) файл LaTeX може виглядати так:
1\documentclass{article}
2\begin{filecontents*}[overwrite]{sample-image.64}
3iVBORw0KGgoAAAANSUhEUgAAAPgAAABdCAYAAAH/B5vAAAAAGXRFWHRTb2Z0d2FyZQBBZ......
4\end{filecontents*}
5\begin{document}
6 \write18{base64 -d sample-image.64 > sample-image.png}
7 \includegraphics[options]{sample-image.png}
8\end{document}
І код Java, який використовує API Aspose.TeX, подібний до того, що можна знайти в інших статтях, за винятком визначення параметра режиму оболонки:
1// Create conversion options for Object LaTeX format upon Object TeX engine extension.
2TeXOptions options = TeXOptions.consoleAppOptions(TeXConfig.objectLaTeX());
3// Specify a file system working directory for the output.
4options.setOutputWorkingDirectory(new OutputFileSystemDirectory(Utils.getOutputDirectory()));
5// Initialize the options for saving in PDF format.
6options.setSaveOptions(new PdfSaveOptions());
7// Enable the shell command execution.
8options.setShellMode(ShellMode.ShellRestricted);
9// Run LaTeX to PDF conversion.
10new TeXJob(Utils.getInputDirectory() + "embedded-base64-image.tex", new PdfDevice(), options).run();
І тепер Крок 5 завершено. Щоб отримати справді вичерпні приклади, перегляньте наш Приклад проекту.
Ви також можете ознайомитися з безкоштовним веб-додатком, створеним на основі Aspose.TeX для .NET API.