Встроенная графика 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<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.