Встроенная графика 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<number>(<token list>) — это примитив, записывающий список токенов. При использовании за этим примитивом следует целое число. Если это число отрицательное, токены записываются в файл расшифровки (журнала). Если число больше «15», токены записываются в терминал. Если число находится в диапазоне 0..15, токены записываются в файл, имя которого определяется предыдущим появлением примитива \openout. Примитив \openout<4-битное целое>=<имя файла> сопоставляет имя файла с числом.

Более новые реализации 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#, использующий API Aspose.TeX, аналогичен коду в других статьях, за исключением указания опции 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 for .NET API.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.