Система подготовки документации (форматер текста) PIF 5 АПК.00322-01 33 01-15 1. ВЫЗОВ PIF Общая форма для вызова pif имеет следующий формат: pif [параметры] [файлы] где [параметры] означает любое число возможных параметров, a [файлы] определяет список файлов, содержащих форматиру- емый документ. Если имена файлов не заданы или указан па- раметр, состоящий из одного знака минус (``-''), то чтение производится из стандартного файла ввода. Ниже приводятся параметры, которые могут быть заданы в любом порядке перед списком файлов: -oсписок - Печатать только те страницы, номера которых присутствуют в "списке", содержащем номера и интервалы номеров, разделенные запятыми. Интер- вал номеров имеет вид N-M и означает: страницы с N по M; если в качестве первого параметра указано -N, то это означает: печатать с первой по N-ю страницу, а, если последний параметр N-, то это означает: печатать с N-й страницы и до конца; -nN - Присвоить номер N первой сформированной страни- це; -sN - Делать остановки через каждые N страниц. Через каждые N страниц (по умолчанию N=1) pif будет останавливать работу для того, чтобы дать воз- 6 АПК.00322-01 33 01-15 можность заправить или заменить бумагу, и во- зобновит ее при получении символа новой строки; -mимя - Присоединяет входныe файлы к файлу макро /usr/lib/tmac.mимя; -raN - В регистр a (имя из одного символа) помещается N (целое число). -i - после того, как входные файлы прочитаны, читать данные со стандартного устройства ввода; -q - вызвать режим одновременного ввода/вывода при команде rd; -Tимя - Задает имя типа устройства вывода; -c - Выводит выровненные строки слов с одинаковыми интервалами между словами, используя полную разрешающую способность терминала. 7 АПК.00322-01 33 01-15 2. ОБЩИЕ СВЕДЕНИЯ 2.1. Структура входных данных Входная информация состоит из строк текста, предназ- наченного для выдачи на печать, среди которых содержатся строки команд, управляющие последующей обработкой текста. Командные строки начинаются с управляющего символа (по умолчанию точки ``.'' или апострофа `` ' ''), за которым следует имя из одного или двух символов, определяющее ос- новную команду или макрокоманду пользователя. Управляющий символ `` ' '' (апостроф) блокирует функцию прерывания (вынужденное прерывание заполнения частично заполненной строки), происходящего при выполнении некоторых команд. Управляющий символ можно отделять от имени команды (макро- команды) пустым промежутком с помощью пробелов или симво- лов табуляции. За именами должны следовать либо символ ``новая строка'' либо пробел, за которым следуют парамет- ры. Командные строки с нераспознанными именами игнорируют- ся. Используя знак переключения кода, обычно ``\'', можно вставить различные специальные функции в любое место ис- ходного текста. Например, функция \nr вызывает подстановку содержимого числового регистра r на место функции, здесь r имя регистра, состоящее либо из одного символа, например 8 АПК.00322-01 33 01-15 \nx, либо, состоящее из двух символов с левой круглой скобкой перед ним, например \n(хх. 2.2. Разрешающая способность устройств и системы Разрешающая способность системы pif составляет 240 единиц/дюйм (94,5 единиц/см), что соответствует наименьше- му общему множителю разрешающих способностей различных пе- чатающих устройств. Система pif производит округление вво- димых числовых параметров (где это требуется по смыслу) до величины фактической разрешающей способности конкретного устройства. 2.3. Ввод числовых параметров Система pif может воспринимать числовые параметры, указанные в различных единицах измерения. В данном доку- менте чаще используется дюймовая шкала, потому что боль- шинство печатающих устройств имеет разрешающую способность кратную дюйму или долям дюйма. Но если дюймовая шкала не устраивает, можно пользоваться метрической, указывая при этом соответствующие единицы измерения согласно табл. 1, в которой V - величина текущей разрядки по вертикали в базо- вых единицах, а C - ширина символов в базовых единицах. 9 АПК.00322-01 33 01-15 Таблица 1 --------------------------------------------------- | указатель| значение | число базовых | | шкалы | | единиц | |----------|----------------------|---------------- | i | Дюйм | 240 | | c | Сантиметр | 240*50/127 | | P | Пика=1/6 дюйма | 240/6 | | n | En=C базовых единиц | C | | p | Пункт=1/72 дюйма | 240/72 | | u | Базовая единица | 1 | | v | Вертикальная разряд- | V | | | ка | | | ничего | По умолчанию | | --------------------------------------------------- Единица En - это, фактически, ширина печатаемых зна- ков, но в системе pif встречаются "сверхширокие" символь- ные конструкции вида ``->'' , ``<-'' или ``3/4'', отобра- жаемые при печати несколькими символами. По умолчанию, масштаб берется в единицах En для горизонтально- ориентированных команд ll, in, ti, ta, lt, mc и функций \h и \l; в единицах вертикальной разрядки (v) для вертикально-ориентированных команд pl, wh, ch, dt, sp, sv, ne, rt и функций \v, \x и \L; в пунктах (p) для команды vs и в базовых единицах (u) для команд nr, if и ie. При всех других командах указание масштабных коэффициентов игнори- руется. Следует заметить, что при определении числового 10 АПК.00322-01 33 01-15 регистра с каким-либо масштабным коэффициентом значение этого регистра переводится в базовые единицы, и, если этот регистр используется в командах, требующих численных аргу- ментов, может потребоваться указание масштабного коэффици- ента ``u'' во избежание дополнительного ошибочного масшта- бирования по умолчанию. Допустим, регистр был определен командой .nr AA 40n тогда, если указать .ll \n(AA то длина строки будет взята из регистра AA (где она хра- нится в базовых единицах) и умножена на коэффициент ``En'' (по умолчанию). Чтобы избежать ошибки нужно указать следу- ющим образом .ll \n(AAu Число N может указываться в форме десятичной дроби, но при запоминании оно округляется до целого числа базовых единиц. Для получения расстояния от текущего места до верти- кальной или горизонтальной позиции N можно использовать индикатор абсолютного положения ``|'', который указывается перед числом. Для вертикально-ориентированных команд и функций |N становится расстоянием от текущего места до вертикальной позиции N, а для всех остальных команд и функций |N становится расстоянием от текущей горизонталь- ной позиции на строке вывода до горизонтальной позиции N. Например, в результате выполнения команды 11 АПК.00322-01 33 01-15 .sp |3.2c получится сдвиг на позицию, расположенную на 3,2 сантимет- ра от верхнего края страницы. 2.4. Численные выражения Везде, где предполагается ввод числовых данных, можно использовать выражения, содержащие скобки, арифметические операторы +, -, /, *, % и логические операторы <, >, <=, >=, =/ или ==/, &/ и /, :/ или /. Вычисление выражений вы- полняется слева направо за исключением выражений, где по- рядок выполнения операций зависит от наличия скобок. Для некоторых команд первый символ + или - отделяется и ин- терпрeтируется соответственно как индикатор увеличения или уменьшения. 2.5. Система обозначений Числовые параметры записываются двумя способами. Запись _N означает, что аргумент может иметь вид N, +N, -N и, что соответствующее действие состоит в задании нужному параметру значения N, увеличении его на N или уменьшении на N, соответственно. Простая запись N означает, что на- чальный алгебраический знак не является индикатором прира- щения, а просто знаком N. Обычно неприемлемые числовые входные данные либо игнорируются, либо усекаются до прием- лемых значений. Например, большинство команд предполагают задание параметрам неотрицательных значений; к исключениям 12 АПК.00322-01 33 01-15 относятся команды sp, wh, сн, nr и if. Команды ft, vs, ls, ll, in и lt при отсутствии аргумента восстанавливают пре- дыдущее значение параметра. Аргументы, содержащие один символ, обозначаются в виде одной строчной буквы, а аргументы из одного или двух символов обозначаются в виде двух строчных букв. Аргумен- ты, представляющие собой цепочку символов, обозначают ус- ловными сокращениями из нескольких символов. При описании команд в колонке примечаний используются следующие обозначения: B - Команда обычно вызывает прерывание; D - Режим или соответствующие параметры относятся к текущему уровню отведения в макро; E - Соответствующие параметры являются частью сово- купности параметров, определяющих текущее окру- жение; O - Должен действовать до логического вывода; P - Режим должен продолжать действовать или быть снова подключен во время физического вывода. v,p,n,u - Масштабный указатель по умолчанию. Если он не задан, то масштабные указатели игнорируются. 13 АПК.00322-01 33 01-15 3. УПРАВЛЕНИЕ СТРАНИЦАМИ Поля в верхней и нижней части страницы (верхний и нижний титулы) автоматически не формируются. Для этого не- обходимо определить две макрокоманды и устанавить для них "ловушки" в вертикальных позициях (См. подразд. 7.5). Это: 0 (верхний край страницы) и -N (N от нижнего края). Переход от первой псевдостраницы к первой странице осуществляется либо, когда происходит первый обрыв запол- нения, либо, когда происходит обработка первого не отве- денного в макро текста (См. подразд. 7.4). Установка прерываний, которые будут происходить при достижении "ловушки" в верхнем поле первой страницы, должна быть закончена до этого перехода. Для управления страницей пользуются следующими коман- дами: pl - установить длину страницы. Форма вызова команды pl - .pl _N, начальное значение - 66, нет аргу- ментов -66, примечание - V. Длина страницы уста- навливается равной _N. Текущая длина страницы хранится в регистре .р; bp - начать новую страницу. Форма вызова команды bp - .bp _N, начальное значение - 1, нет аргументов - нет, примечание - B, V. Текущая страница выво- 14 АПК.00322-01 33 01-15 дится и начинается новая страница. Если _N зада- но, то номером новой страницы будет _N; pn - присвоить номер следующей странице. Форма вызова команды pn - .pn _N, начальное значение - 1, нет аргументов - игнорируется. Следующая страница, если она появится, будет иметь номер _N. Чтобы можно было присвоить номер первой странице, ко- манда pn должна встретиться до начального пере- хода от псевдо-страницы к странице. Номер теку- щей страницы находится в регистре %; ne - требуется место по вертикали. Форма вызова ко- манды ne - .ne _N, начальное значение - нет, нет аргументов - 1v, примечание - D, V. Если рассто- яние D до следующей позиции "ловушки" меньше N, то будет пропущено расстояние D, а затем про- изойдет прерывание. Если на оставшейся части страницы нет "ловушек", то D - расстояние до нижнего края страницы. Если D<V, то вывод еще одной строки все же возможен и вызовет прерыва- ние. Для "отведения" D - это расстояние до "ло- вушки" отведенного текста, если она вообще име- ется, либо очень большое число, если "ловушки" нет; mk - запомнить вертикальную позицию. Форма вызова ко- манды mk - .mk R, начальное значение - нет, нет аргументов - внутренний, примечание - D. Засыла- 15 АПК.00322-01 33 01-15 ет место текущей вертикальной позиции во внут- ренний регистр или, если указан R, то в регистр R; rt - вернуться к вертикальной позиции. Форма вызова команды rt - .rt _N, начальное значение -нет, нет аргументов - внутренний, примечание - D, V. Осуществляет возврат только вверх к помеченной вертикальной позиции в текущем отведенном тексте. Если параметр _N, относящийся к текущей позиции, задан, то эта позиция находится на расстоянии _N от верхнего края страницы или от- веденного текста. Если N отсутствует, происходит возврат к месту, отмеченному предыдущей командой mk. Следует иметь в виду, что вместо команды .rt в любых случаях может быть использована команда .sp (см. разд.5) заданием промежутка до абсолют- ного места, учтенного в регистре, явно указанном в команде .mk, то есть при помощи последователь- ности .mk R ...... ...... .sp |\n(Ru 16 АПК.00322-01 33 01-15 4. ФОРМИРОВАНИЕ, ВЫРАВНИВАНИЕ И ЦЕНТРИРОВАНИЕ ТЕКСТА 4.1. Формирование и выравнивание Обычно слова набираются из строк входного текста и собираются в строку выходного текста до тех пор, пока для какого-то слова не будет хватать места. Тогда делается по- пытка перенести слово для того, чтобы поместить в выходной строке его часть. Затем межсловные интервалы в выходной строке увеличиваются для того, чтобы "растянуть" строку до текущей длины строки без учета текущего отступа. Словом является любая цепочка символов, отделенная символами про- бела или признаком начала/конца входной строки. Любые смежные два слова, которые должны храниться вместе (т.е. не должны переноситься на другую выходную строку и не от- даляться друг от друга в процессе выравнивания), могут быть соединены вместе с помощью разделения их символом не- заполняемого пробела ``\'' (обратная косая черта и про- бел). В pif межсловные промежутки не одинаковы из-за ма- ленькой разрешающей способности устройств по ширине симво- лов. Однако использование параметра -е командной строки дает возможность получить постоянный интервал с полной разрешающей способностью устройства вывода. Формированием, выравниванием и переносом слов на другую строку можно уп- равлять или вообще отменить их. Длина текста последней вы- ходной строки хранится в регистре .n, а позиция линии 17 АПК.00322-01 33 01-15 шрифта (основания строки) текста на странице хранится в регистре nl. Место базисной линии последней строки текста на текущей странице (самой нижней позиции) находится в ре- гистре .h. Несколько пробелов между словами, обнаруженные в ис- ходном тексте, сохраняются за исключением концевых пробе- лов. Начальные пробелы (в начале входной строки) вызывают прерывание заполнения выходной строки. Чтобы вызвать пре- рывание заполнения после определенного слова и получить выходную строку, растянутую до текущей длины строки, при заполнении строки можно вставить в слово или присоединить к нему последовательность \р. Строка исходного текста, которая начинается с управ- ляющего символа, не будет рассматриваться как управляющая строка, если перед ней указать непечатаемый признак запол- нения \&. 4.2. Прерывание текста Две строки исходного текста в режиме "незаполнения" можно "склеить" в результирующем тексте, закончив первую строку последовательностью \с. Аналогичным образом, слова внутри "заполняемого" текста можно "склеить", если слово (или строку) также закончить последовательностью \с. Пос- ледующий текст будет воспринят как продолжение текста, оканчивающегося этим словом. Если в тексте (между \c и последующим словом (или строкой)) встретились управляющие 18 АПК.00322-01 33 01-15 строки, вызывающие прерывание заполнения, то "склеивания" не произойдет, и накопленные строки будут выданы в выход- ной текст. Для формирования и выравнивания строк использу- ются следующие команды: br - прекратить заполнение строки. Форма вызова ко- манды br - .br, начальное значение - нет, нет аргументов - нет, примечание - B. Заполнение формируемой в данный момент строки прекращается и строка выводится без выравнивания. Строки текста, начинающиеся с пробелов, и пустые строки текста также вызывают прерывание; fi - включить режим заполнения. Форма вызова команды fi - .fi, начальное значение - включить, нет ар- гументов - нет, примечание - B, E. Последующие строки будут обрабатываться автоматически с вы- равниванием. Регистр .u содержит 1 если режим заполнения включен и 0 если выключен; nf - выключить режим заполнения. Форма вызова команды nf - .nf, начальное значение - включить, нет ар- гументов - нет, примечание - B, E. Последующие строки исходного текста не будут обрабатываться и копируются непосредственно в строки выходного текста без учета текущего значения длины строки; ad - установить тип выравнивания. Форма вызова коман- ды ad - .ad c, начальное значение - оба, нет ар- гументов - выравнивание, примечание - Е. Вклю- 19 АПК.00322-01 33 01-15 чить выравнивание строк. Если режим заполнения текста выключен, то выравнивание будет отложено до тех пор, пока он опять не будет включен. Если присутствует указатель типа с, то тип выравнива- ния изменяется в соответствии с табл. 2. Таблица 2 ---------------------------------------- | указатель | тип выравнивания | |-------------|------------------------| | l | только по левому краю | | r | только по правому краю | | с | по центру | | b или n | по обоим краям | | отсутствует | не изменяется | ---------------------------------------- na - отключить выравнивание строк. Форма вызова ко- манды na - .na, начальное значение - нет, нет аргументов - нет, примечание - Е. Отменить режим с выравниванием. При заполнении строки выравни- вание не делается. Тип выравнивания для команды ad не меняется. Если режим заполнения включен, то заполнение выходной строки все же происходит; ce - отцентровать следующие N входных строк. Форма вызова команды ce - .ce N, начальное значение - нет, нет аргуметов - 1, примечание - Е. Располо- жить по центру следующие N строк исходного текста в пределах текущего размера текста (длина 20 АПК.00322-01 33 01-15 строки минус отступ). Если N=0 счетчик оставших- ся для центрирования строк обнуляется (выключа- ется режим центрирования). Если входная строка является слишком длинной, она будет выровнена слева. 21 АПК.00322-01 33 01-15 5. ВЕРТИКАЛЬНЫЕ РАЗМЕРЫ 5.1. Интервал между строками Интервал по вертикали (V) между основаниями всех пос- ледующих строк выходного текста можно задать с помощью ко- манды vs, при этом максимальная разрешающая способность определяется типом устройства вывода. Используемая в данный момент величина межстрочного интервала V хранится в регистре .v. Возможно также получение увеличенного (напри- мер, удвоенного) межстрочного интервала путем использова- ния команды ls. 5.2. Дополнительное межстрочное расстояние Имеется возможность задать дополнительное временное (на одну выходную строку) межстрочное расстояние. Для это- го используют функцию \x'N', которая встраивается в необ- ходимое слово или пристраивается к нему. В данной функции, как и в других функциях, параметр которой заключен между символами-ограничителями (здесь символ '), могут использо- ваться произвольные ограничители. Если N отрицательно, то будет вертикальный прогон на величину N перед строкой. Если N положительно, то верти- кальный прогон на величину N будет после строки. Если не- сколько следующих друг за другом указателей дополнительно- го межстрочного расстояния относятся к одной и той же вы- 22 АПК.00322-01 33 01-15 ходной строке, то будет использована максимальная величи- на. Величина использованного в последний раз дополнитель- ного межстрочного расстояния хранится в регистре .a. 5.3. Блоки вертикальных промежутков Блок пустых строк обычно формируется с помощью коман- ды sp, при этом действует режим "без прогонов", если он включен. Если внутри требуемого вертикального пространства имеется "ловушка", то пространство после нее не формирует- ся. Сплошной блок пустых строк можно сохранить, используя команду sv. Для определения вертикальных размеров исполь- зуются следующие команды: vs - установить интервал между строками. Форма вызова команды vs - .vs N, началь- ное значение - 1/6i., нет аргументов - предыдущее, примечание - Е, Р. Устано- вить интервал между строками V (от линии шрифта одной строки до линии шрифта дру- гой). Временный дополнительный интервал по вертикали устанавливается с помощью функции \х'n'; ls - установить межстрочное расстояние. Форма вызова команды ls - .ls _N, начальное значение - N=1, нет аргументов - преды- дущее, примечание - Е. Mежстрочное расстояние (от низа одной строки до низа 23 АПК.00322-01 33 01-15 другой) устанавливается в _N. N-1 допол- нительных интервалов длиной V (пустых строк) добавляется к каждой строке вы- ходного текста. Дополнительные пустые строки не добавляются, если текст или ранее добавленная пустая строка достига- ет позиции "ловушки"; sp - прогон по вертикали на величину N в любом направлении. Форма вызова команды sp - .sp N, начальное значение - нет, нет аргументов - N=1V, примечание - B,V. Если N отрицательно, происходит движение назад (вверх) и ограничивается рассто- янием до верха страницы. Движение вперед (вниз) ограничивается расстоянием до ближайшей "ловушки". Если действует режим "без прогонов", никаких промежут- ков не появится; sv - сохранить вертикальный промежуток. Форма вызова команды sv - .sv N, начальное значение - нет, нет аргуменов - N=1V, примечание - V. Сохранить блок пустых строк размера N. Если расстояние до сле- дующей "ловушки" больше N, осуществляет- ся прогон на величину N в выходном тексте. Режим "без прогонов" на эту ко- манду не действует. Если расстояние до 24 АПК.00322-01 33 01-15 следующей "ловушки" меньше N, то прогон не осуществляется сразу, но N запомина- ется для последующего использования (ко- мандой os). При последующих командах sv запоминаемая ранее величина N будет об- новляться; os - ввести сохраненный вертикальный промежу- ток. Форма вызова команды os - .os, на- чальное значение - нет, нет аргументов - нет, примечание - нет. Осуществить про- гон, величина которого была установлена по команде .sv. Режим "без прогонов" на эту команду не действует. Обычно исполь- зуется для вывода в нужном месте пустого места, запрошенного в предшествующей ко- манде sv; ns - включить режим "без прогонов". Форма вы- зова команды ns - .ns, начальное значе- ние - выключить, нет аргументов - нет, примечание - D. При этом игнорируются команды sp и bp, без номера следующей страницы. Режим "без прогонов" отменяет- ся при появлении строки вывода или по команде rs; rs - выключить режим "без прогонов". Форма вызова команды rs - .rs, начальное зна- 25 АПК.00322-01 33 01-15 чение - выключить, нет аргументов - нет, примечание - D. Разрешить прогоны. Режим "без прогонов" выключается; пустая строка - то же самое, что и .sp 1. Форма вызова команды "пустая строка" - пустая строка, начальное значение - нет, нет аргументов - нет, примечание - B. Вызывает прерыва- ние заполнения и выводит пустую строку так же, как и команда .sp 1. 26 АПК.00322-01 33 01-15 6. ДЛИНА СТРОК И ОТСТУПЫ Максимальная длина строки при включенном режиме за- полнения может быть установлена с помощью команды ll. Величина отступа может быть установлена использованием ко- манды in; отступ, действующий только на следующую строку выходного текста, можно установить командой ti. Длина строки включает абзацный отступ. Длина строки за вычетом отступа является базовой величиной при центрировании текста по команде .се. При наличии частично собранной строки действие команд ll, in или ti (в случае вызова их с управляющим символом, не вызывающим обрыва) задерживается до тех пор, пока эта строка не будет выведена. В режиме заполнения длина текста в выходной строке меньше или равна длине строки минус отступ. Текущие значения длины строки и отступа хранятся соответственно в регистрах .l и .i. Длина заголовков, состоящих из трех частей, получаемых при ис- пользовании команды tl, устанавливается независимо с по- мощью команды lt. Использутся следующие команды установки длины строки и формирования отступа: ll - установить длину строки. Форма вызова команды ll - .ll _N, начальное значение - 65n, нет аргумен- тов - предыдущее, примечание - Е,n. Длина строки устанавливается равной _N; 27 АПК.00322-01 33 01-15 in - установить постоянный отступ. Форма вызова ко- манды in - .in _N, начальное значение - N=0, нет аргументов - предыдущее, примечание - B,E,n. Отступ устанавливается равным _N. Отступ пред- шествует каждой выходной строке до тех пор, пока не будет изменен; ti - установить временный отступ. Форма вызова коман- ды ti - .ti _N, начальное значение - нет, нет аргументов - игнорируется, примечание - B,E,n. Устанавливается временный отступ. Следующая строка выходного текста будет иметь отступ _N по отношению к текущему отступу. Получающийся сум- марный отступ не может быть отрицательным. Теку- щий отступ не изменяется. 28 АПК.00322-01 33 01-15 7. МАКРОКОМАНДЫ, ЦЕПОЧКИ, ОТВЕДЕНИЯ И "ЛОВУШКИ" 7.1. Макрокоманды и цепочки Макрокоманда (макро) - это имеющая определенное имя последовательность произвольных строк, которую можно вызвать по имени или с помощью механизма захвата ("ловуш- ки"). Цепочка - это имеющая определенное имя последова- тельность символов, не включающая символ новой строки, ко- торую с помощью имени можно вставить в любое место текста. Имена команд, макро и цепочек хранятся в одном списке имен. Имена макро и цепочек могут содержать один или два символа и могут совпадать с именами команд, макро или це- почек, определенных ранее (в этом случае прежний вариант об'екта с этим именем игнорируется). Имена макро или цепо- чек не могут содержать русские буквы. Любой из этих об'ек- тов может быть переименован с помощью команды .rn или исключен с помощью команды .rm. Макро создаются по коман- дам de и di, а для внесения к ним добавлений используются команды am и da. В результате команд di и da нормальный выходной текст должен быть записан в макрокоманду. Цепочки создаются по команде ds а для добавления к ним использует- ся команда as. Макро вызывается таким же образом, как и команда; управляющая строка, начинающаяся с .хх будет вставлять в текст содержимое макро хх. Последующая часть управляющей строки может содержать до девяти аргументов. 29 АПК.00322-01 33 01-15 Цепочки х и хх вставляются в любое нужное место текста посредством функций \*х и \*(хх соответственно. Ссылки на цепочки и вызовы макро могут быть вложенными. 7.2. Интерпретация ввода в режиме копирования В процессе определения и расширения цепочек и макро (но не в случае отведения) исходный текст считывается в режиме копирования. Входной текст копируется без интерпре- тации за исключением следующих случаев, когда: - содержимое числовых регистров вставляется с помощью функции \n; - вставляются цепочки, указанные функцией \*; - вставляются аргументы, указанные функцией \$; - исключаются скрытые символы новой строки, указанные функцией \(символ новой строки); - исключаются комментарии, указанные функцией \"; - последовательности \t и \a соответственно интерпретиру- ются как ASCII символы HT (горизонтальная табуляция) и SOH (началo заголовка); - \\ интерпретируется как \; - \. интерпретируется как ".". 30 АПК.00322-01 33 01-15 Эти интерпретации могут быть отменены добавлением перед соответствующей функцией обратной косой черты \. Например, так как \\ отображается в \, то \\n будет копи- роваться как \n, что при последующем считывании макро или цепочки будет интерпретироваться как указатель числового регистра. 7.3. Аргументы Во время вызова макрокоманды по имени предполагается, что оставшаяся часть строки может содержать до девяти ар- гументов. Разделителем аргументов является символ пробела и аргументы, содержащие символы пробела, должны быть зак- лючены в двойные кавычки ("). Чтобы ввести в аргумент, заключенный в двойные кавычки, символ двойной кавычки, нужно в этом месте ввести пару двойных кавычек (""). Если нужные аргументы не помещаются в строке, то для продолже- ния записи на следующей строке можно использовать символ скрытой новой строки (\(символ новой строки)). При вызове макрокоманды уровень ввода заносится в стек и любые аргументы доступные на предыдущем уровне ста- новятся недоступными до тех пор, пока макрокоманда не будет полностью выполнена и не будет восстановлен предыду- щий уровень. Собственные аргументы макрокоманды можно вставить в любое место внутри макро с помощью функции \$N, на место которой вставляется значение N-го аргумента 31 АПК.00322-01 33 01-15 (1<=N<=9). Если вызванный аргумент не существует, то ре- зультатом будет нулевая цепочка. Например, макрокоманду xx можно определить следующим образом: .de xx \"начало определения Сегодня \\$1,\\$2. .. \"конец определения и вызвать: .хх Понедельник 14-е чтобы получить выходной текст Сегодня Понедельник,14-е. Заметим, что аргумент был замаскирован в макро с помощью дополнительной обратной косой черты. Количество имеющихся в данный момент аргументов находится в регистре .$. В данной реализации на верхнем уровне (не макро) никаких ар- гументов нет. Так как ссылки на цепочки реализованы в виде макровызова нулевого уровня (уровня ввода), внутри цепочки не может быть никаких аргументов. Макро, вызываемые по достижении позиции "ловушки", также не могут содержать ни- каких аргументов. Аргументы записываются в режиме копирования в стек, откуда они могут быть извлечены. Такой механизм не позво- ляет использовать в аргументах прямые ссылки на длинные цепочки (вставленные во время копирования аргумента) и, поэтому, рекомендуется скрывать ссылки на цепочки (с по- мощью дополнительного символа ``\'') для того чтобы отло- жить подстановку цепочки до момента ссылки на данный аргу- мент. 32 АПК.00322-01 33 01-15 7.4. Отведения Обработанный выходной текст можно отвести в макро, например для обработки сноски или определения размера по горизонтали и вертикали некоторого текста для изменения страниц или колонок в соответствии с определенными услови- ями. В отведении можно установить единственную ловушку по определенной вертикальной позиции. В числовых регистрах dn и dl содержатся соответственно вертикальный и горизонталь- ный размеры последнего отведения. При последующем считыва- нии отведенного текста в режиме "без заполнения" верти- кальный размер каждой из его строк сохраняется, независимо от текущего значения интервала между строками (V). Текст, при отведении которого была установлена постоянная разряд- ка, или текст с выделенными символами, может быть правиль- но считан только в том случае, если эти режимы будут снова задействованы во время последующего считывания. Одним из способов достижения этого является встраивание в текст от- ведения соответствующих команд с помощью "механизма проз- рачного вывода" (См. подразд.10.4). Отведенные в макро тексты могут быть вложены друг в друга, и некоторые параметры и регистры связаны с текущим уровнем отведения (верхний, не относящийся к отведению, уровень можно считать нулевым уровнем отведения). К ним (параметрам и регистрам) относятся: "ловушка" по отведению и соответствующее ей макро, режим "без прогонов", сохраня- емая во внутреннем регистре отмеченная вертикальная пози- 33 АПК.00322-01 33 01-15 ция (см. разд. 3), текущая вертикальная позиция (регистр гистр .h) и имя текущего отведения (регистр .z). 7.5. "Ловушки" Существует три типа "ловушек": ловушки по месту на странице, ловушки по месту в отведении и ловушки по числу входных строк. Ловушки для вызова макрокоманды можно по- местить, используя команду wh, в любую позицию страницы, включая верхний край. Позицию такой ловушки можно изменить с помощью запроса ch. Ловушки, позиции которых расположены на основании страницы или ниже, не действуют до тех пор, пока они не будут смещены внутрь страницы или не будет увеличен размер страницы. Две ловушки могут оказаться на одной позиции только в результате первоначального помеще- ния их в разные позиции и последующего перемещения одной из них; первая из двух ловушек, помещенных в одну и ту же позицию будет "скрывать" вторую, до тех пор, пока она не переместится. Если первая ловушка возвращается обратно, она снова "скрывает" вторую ловушку. Макрокоманда, связан- ная с ловушкой по месту на странице, вызывается автомати- чески как только выводимая строка текста перекрывает какую-нибудь ловушку (то есть позиция ловушки попадает в очередной вертикальный интервал). При достижении основания (низа) страницы происходит переключение на ловушку по на- чалу (верхней части) страницы, если вообще существует та- кая ловушка. Расстояние до позиции следующей ловушки хра- нится в регистре .t. Если между текущей позицией и основа- 34 АПК.00322-01 33 01-15 нием страницы ловушек нет, то содержимое регистра .t равно расстоянию до основания страницы. Макровызов по ловушке, действующей в текущем отведе- нии, можно установить с помощью команды dt. Регистр .t также используется в случае отведения текста в макро. Если не имеется последующих ловушек, то в регистр засылается достаточно большое число. Описание ловушки по количеству входных строк приводится ниже в пояснениях к команде it. Используются следующие команды "ловушек": de - определить или переопределить макроопределение Форма вызова команды de - .de xx yy, начальное значение - нет, нет аргументов - .yy=.., приме- чание - нет. Определить или переопределить макро xx. Текст макро начинается со следующей строки входного текста. Строки входного текста записы- вются в рабочий файл в режиме копирования до тех пор, пока в определении макро не встретится строка, начинающаяся с .yy, которая вызывает макро yy. Если аргумент yy отсутствует, опреде- ление макро заканчивается строкой, начинающейся с "..". Макро может содержать вложенные команды de при условии, что имена макрокоманд, заверша- ющих определение, различны или признак конца оп- ределения является неявным. Признак конца ".." можно замаскировать с помощью дополнительных 35 АПК.00322-01 33 01-15 символов ``\'' - \\.., которые при записи внеш- него макроопределения будут преобразованы в \.. и при последующем считывании в ".."; am - добавить к макрокоманде. Форма вызова команды am - .am xx yy, начальное значение - нет, нет аргу- ментов - .yy=.., примечание - нет. Версия коман- ды de для добавления текста в макро; ds - определить цепочку. Форма вызова команды ds - .ds xx цепочка, начальное значение - нет, нет аргументов - игнорируется, примечание - нет. Определяет цепочку xx, содержащую "цепочку". Цепочка определена от первого непробельного сим- вола после указания имени цепочки до конца стро- ки (или начала комментария). Символ двойной ка- вычки ( " ) перед "цепочкой" не записывается и служит для разрешения начальных пробелов в "це- почке"; as - добавить к цепочке. Форма вызова команды as - .as xx цепочка, начальное значение - нет, нет аргументов - игнорируется, примечание - нет. Добавляет "цепочку" к цепочке xx (версия команды ds для добавления к цепочке); rm - удалить команду, макро или цепочку. Форма вызова команды rm - .rm xx, начальное значение - нет, нет аргументов - игнорируется, примечание - нет. Имя xx удаляется из списка имен и любая, связан- 36 АПК.00322-01 33 01-15 ная с ним область памяти, освобождается.