\write18
Синопсис:
\write18{shell_command}
Выполните команду в оболочке операционной системы. Операционная система выполнит команду, и выполнение LaTeX заблокируется, пока это не завершится.
Эта последовательность (в Unix)
\usepackage{graphicx} % in preamble
...
\newcommand{\fignum}{1}
\immediate\write18{cd pix && asy figure\fignum}
\includegraphics{pix\figure\fignum.pdf}
выполнит Asymptote (программа asy ) в файле pix/figure1.asy, чтобы документ мог позже прочитать полученный график (см. \includegraphics). Как и любая \write, здесь LaTeX расширяет макросы в shell_command, так что \fignum заменяется на ‘1’.
Другой пример — автоматическое выполнение BibTeX в начале каждого запуска LaTeX (см. Использование BibTeX) путём включения \immediate\write18{bibtex8 \jobname} в первой строке файла. Обратите внимание, что \jobname расширяется до имени базового файла корневого файла, если опция --jobname не передана в командной строке, в этом случае это аргумент опции.
Иногда требуется многошаговый процесс для получения нужной информации. Это вставит в входной поток список всех файлов PDF в текущем каталоге (но см. texosquery ниже):
\immediate\write18{ls *.pdf > tmp.dat}
\input{tmp.dat}
Стандартное поведение любого \write — ожидание, пока страница не будет отправлена, перед расширением макросов или записью в поток (см. \write). Но иногда вы хотите выполнить это немедленно. Для этого используйте \immediate\write18{shell_command}.
Существуют очевидные проблемы безопасности, связанные с разрешением системных команд внутри файла LaTeX. Если вы скачаете файл из сети, который содержит команды для удаления всех ваших файлов, вас это не обрадует. Стандартные настройки в современных дистрибутивах отключают полный доступ к оболочке. Вы можете включить его, если уверены, что системные команды безопасны, скомпилировав с latex --enable-write18 filename (см. Опции командной строки). (Опция --shell-escape — синоним в TeX Live.)
Вместо полного доступа к оболочке, современные дистрибутивы по умолчанию используют ограниченную версию, которая позволяет работать некоторым командам, например, тем, которые запускают Metafont для генерации отсутствующих шрифтов, даже если вы не используете опцию enable-write18. По умолчанию этот список разрешенных команд короткий и содержит только команды, находящиеся под контролем разработчиков дистрибутива (см. Опции командной строки).
Текст shell_command всегда передаётся в /bin/sh в Unix-подобных операционных системах и интерпретатор команд DOS cmd.exe в Windows. Любая другая оболочка, установленная пользователем, и переменная окружения SHELL игнорируются.
Если вам необходима системная информация, например, имя операционной системы, информация о языковых настройках или содержимое каталога, обратите внимание на пакет texosquery, который предоставляет удобный и безопасный интерфейс для этого, в отличие от вышеприведённых примеров с использованием необработанной \write18: https://ctan.org/pkg/texosquery.
LaTeX предоставляет пакет shellesc поверх примитивной команды \write18. Его основная цель — предоставить команду \ShellEscape, которая работает одинаково во всех движках TeX; LuaTeX намеренно не сохранил \write18, как способ вызова команды оболочки, поэтому требуется некоторый код, специфичный для движка. Пакет shellesc также предоставляет команду \DelayedShellEscape, выполняемую в \output время, по той же причине.
© 2007–2018 Karl Berry
Public Domain Software
http://latexref.xyz/_005cwrite18.html