\write
Синопсис:
\write number{string}
Записать строку в лог-файл, в терминал или в файл, открытый с помощью \openout. Например, \write6 записывает в текстовый поток номер 6.
Если в базовый_файл.tex содержится следующая запись, то он откроет базовый_файл.jh, запишет в него ‘Привет Мир!’ и перевод строки, а затем закроет этот файл.
\newwrite\myfile
\immediate\openout\myfile=\jobname.jh % \jobname is root file basename
...
\immediate\write\myfile{Hello world!}
...
\immediate\closeout\myfile
\newwrite выделяет номер потока, присваивая ему символическое имя для удобства, так что stream
\newwrite\myfile\the\myfile генерирует нечто вроде ‘поток 3’. Затем \openout связывает номер потока с заданным именем файла. TeX в конечном итоге выполнил \write3, что помещает строку в файл.
Обычно номер находится в диапазоне от 0 до 15, поскольку авторы LaTeX обычно следуют приведенному выше примеру, а число выделяется системой. Если номер выходит за пределы диапазона от 0 до 15 или если он не связан с открытым файлом, то LaTeX записывает строку в лог-файл. Если номер положительный, то в дополнение LaTeX записывает строку в терминал.
Таким образом, test \write-1{Hello World!} помещает ‘Привет Мир!’ и перевод строки в лог-файл. (Это делает команда \wlog; см. \wlog). А \write100{Hello World!} помещает то же самое в лог-файл, но также помещает ‘Привет Мир!’ и перевод строки в вывод терминала. (Но 16, 17 и 18 являются особыми значениями для номер; см. ниже).
В LuaTeX вместо 16 потоков вывода их 256 (см. TeX-движки).
Используйте \write\@auxout{string} для записи в текущий файл .aux, который связан либо с корневым файлом, либо с текущим включаемым файлом; и используйте \write\@mainaux{string} для записи в главный файл .aux. Эти символические имена определяются LaTeX.
По умолчанию LaTeX не записывает строку в файл сразу. Это связано с тем, что, например, вам может потребоваться \write для сохранения текущего номера страницы, но когда TeX встречает \write, он обычно не знает, какой номер страницы, поскольку ещё не выполнил разбиение на страницы. Поэтому вы используете \write в одном из трёх контекстов:
\immediate\write\@auxout{string} %1
\write\@auxout{string} %2
\protected@write\@auxout{}{string} %3
- В первом случае LaTeX сразу записывает строку в файл. Все макросы в строке полностью раскрываются (точно так же, как и в
\edef), поэтому, чтобы предотвратить раскрытие, вы должны использовать\noexpand,toks, и т. д., за исключением того, что вы должны использовать#вместо##. - Во втором случае строка сохраняется в текущем списке элементов (как элемент TeX «whatsit») и хранится до тех пор, пока страница не будет выслана, и аналогично, макросы не раскрываются до
\shipout. В\shipout, строка полностью раскрывается. - В третьем случае,
\protected@write, он похож на второй, за исключением того, что вы можете использовать\protectдля предотвращения раскрытия. Дополнительный первый аргумент позволяет вам локально вставить дополнительные определения, чтобы защитить больше макросов или иметь какое-то другое специальное определение для записи.
В качестве простого примера раскрытия с \write, строка здесь содержит управляющую последовательность \triplex, которую мы определили как текст ‘XYZ’:
\newwrite\jhfile
\openout\jhfile=test.jh
\newcommand{\triplex}{XYZ}
\write\jhfile{test \triplex test}
В результате файл test.jh содержит текст ‘test XYZtest’ и перевод строки.
Случаи, когда номер равен 16, 17 или 18, являются особыми. Из-за поведения \write, когда номер выходит за пределы диапазона от 0 до 15, описанного выше, в Plain TeX \write16 и \write17 иногда использовались для записи в лог-файл и терминал; однако в LaTeX естественным способом сделать это является \typeout (см. \typeout). Команда \write18 ещё более специальная; современные системы TeX используют её для передачи команд операционной системе (см. \write18).
Обычно \write выводит одну строку. Вы можете включить перевод строки с помощью ^^J. Таким образом, это даёт две строки в лог-файле:
\wlog{Parallel lines have a lot in common.^^JBut they never meet.}
Часто авторы нуждаются в создании собственного файла для ответов на упражнения или в другой ситуации, где вам нужно записать текст буквально, без раскрытия макросов. CTAN имеет ряд пакетов для этого; один из них – answers.
© 2007–2018 Karl Berry
Public Domain Software
http://latexref.xyz/_005cwrite.html