Вбудована графіка LaTeX | Включіть графіку в код LaTeX

Інший спосіб додавання зображень

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

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

Наразі ми можемо окреслити наступні кроки, щоб отримати бажаний результат:

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

Перші два кроки виконує автор файлу 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.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.