Вбудована графіка LaTeX | Включіть графіку в код LaTeX
Інший спосіб додавання зображень
Деякі системи TeX/LaTeX дозволяють включати зображення, які не зберігаються поза межами самого файлу LaTeX, а включаються безпосередньо у файл LaTeX. Однак, оскільки файли TeX/LaTeX є простими текстовими файлами і тому не можуть містити двійкові дані, нам потрібен спосіб представлення двійкових даних у текстовій формі. Іншими словами, двійкові дані повинні бути закодовані в деяке текстове представлення. Проблема полягає в тому, що механізм TeX не може безпосередньо інтерпретувати такі закодовані зображення. Насправді включення зображення здійснюється за допомогою старої доброї команди \includegraphics
з пакета graphicx
. Однак ця команда працює лише із зовнішніми файлами зображень. Так, зовнішній файл зображення (разом з іншим проміжним файлом) усе одно буде створено поза файлом LaTeX. Ключовим моментом є те, що вам потрібно лише поширювати файл LaTeX окремо.
Гаразд, скажімо, ми якимось чином помістили закодоване зображення у файл LaTeX. Але як нам розшифрувати зображення? На жаль, ми не можемо декодувати файл, прочитавши його з файлу LaTeX і записавши у зовнішній файл зображення. Текстовий рядок, що представляє закодоване зображення, спочатку потрібно записати у зовнішній текстовий файл, який потім можна декодувати для отримання файлу зображення.
Наразі ми можемо окреслити наступні кроки, щоб отримати бажаний результат:
- Закодуйте зображення.
- Вставте текстовий рядок, що представляє дані зображення, у файл LaTeX.
- Виведіть текстовий рядок, що представляє дані зображення, у зовнішній файл.
- Декодуйте зовнішній файл із кроку 3.
- Включіть розшифроване зображення.
Перші два кроки виконує автор файлу LaTeX. Двигун TeX подбає про решту кроків, звісно, за умови, що він правильно проінструктований.
Почнемо з самого початку. Як ми можемо закодувати наше зображення, щоб отримати рядок символів? Одним із методів для цього (і, мабуть, найпопулярнішим) є Base64.
Кодування двійкових даних за допомогою Base64
Base64 — це група схем кодування двійкового коду в текст, яка перетворює двійкові дані в послідовність друкованих символів, обмежену набором із 64 унікальних символів. Точніше, вихідні двійкові дані беруться по 6 бітів за раз, потім ця група з 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}
Префікс
\immediate
потрібен, щоб забезпечити виконання операції\write
, щойно сканер TeX зустріне примітивну команду. В іншому випадку його буде оброблено під час відправлення сторінки.
Якщо ми зараз запустимо набір файлу, ми побачимо, що створено файл зображення 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}
І код C# з використанням Aspose.TeX API подібний до коду в інших статтях, за винятком вказівки параметра ShellMode
:
1TeXOptions options = TeXOptions.ConsoleAppOptions(TeXConfig.ObjectLaTeX);
2// Specify a file system working directory for the output.
3options.OutputWorkingDirectory = new OutputFileSystemDirectory(RunExamples.OutputDirectory);
4// Initialize the options for saving in PDF format.
5options.SaveOptions = new PdfSaveOptions();
6// Enable the shell command execution.
7options.ShellMode = ShellMode.ShellRestricted;
8// Run LaTeX to PDF conversion.
9new TeXJob(Path.Combine(RunExamples.InputDirectory, "embedded-base64-image.tex"), new PdfDevice(), options).Run();
І тепер ми закінчили з Кроком 5. Щоб отримати справді повні приклади, перегляньте наш Приклад проекту.
Ви також можете ознайомитися з безкоштовним веб-додатком, створеним на основі Aspose.TeX для .NET API.