Spec-Zone.ru › LaTeX

\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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API