Встроенная графика LaTeX | Включите графику в код LaTeX

Альтернативный способ включения изображений

Некоторые системы 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<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}

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 for .NET API.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.