не будет изменен;

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

ная с ним область памяти, освобождается. После-
дующие ссылки на это имя не будут вызывать ника-
ких действий;

rn - переименовать команду, макро или цепочку. Форма
вызова команды rn - .rn xx yy, начальное значе-
ние - нет, нет аргументов - игнорируется, приме-
чание - нет. Переименовывает команду, макро или
цепочку xx в yy. Если yy уже существует, преды-
дущая версия yy удаляется;

di - отвести выходной текст. Форма вызова команды di
- .di xx, начальное значение - нет, нет аргумен-
тов - конец, примечание - D. Отводит выходной
текст в макро xx. В процессе отведения происхо-
дит нормальная обработка текста за исключением
того, что не считаются страницы. Обработка
текста в макро заканчивается, когда встречаются
команды di или da без аргумента. Чуждые команды
этого типа не должны появляться, при использова-
нии вложенных отведений;

da - добавить выходной текст к отведенному. Форма вы-
зова команды da - .da xx, начальное значение -
нет, нет аргументов - конец, примечание - D.
Отводит текст, добавляя его в макро xx (версия
команды di для добавления текста);

wh - установить ловушку по позиции на странице. Форма
вызова команды wh - .wh N xx, начальное значение


37
АПК.00322-01 33 01-15

- нет, нет аргументов - нет, примечание - V.
Установить ловушку для вызова макро xx на пози-
цию страницы N, отрицательное значение N будет
интерпретироваться как расстояние от основания
(низа) страницы. Если на позицию N ранее была
установлена ловушка с другим макро, то теперь с
позицией N будет связано макро xx. Нулевое зна-
чение N относится к верхнему краю страницы. В
случае отсутствия xx ловушка, найденная в пози-
ции N, удаляется;

ch - изменить позицию ловушки. Форма вызова команды
ch - .ch xx N. начальное значение - нет, нет ар-
гументов -нет, примечание - v. Изменяet позицию
ловушки для макро xx на N. В случае отсутствия N
ловушка, если она была установлена, удаляется;

dt - установить ловушку по позиции в отведении. Форма
вызова команды dt - .dt N xx, начальное значение
- нет, нет аргументов - выключить, примечание -
D,v. Устанавливает ловушку в позицию N текущего
отведения для вызова макро xx. Еще одна команда
.dt переопределит ловушку отведения. Если аргу-
менты не заданы, ловушка удаляется;

it - установить ловушку по количеству введенных
строк. Форма вызова команды it - .it N xx, на-
чальное значение - нет, нет аргументов - выклю-
чить, примечание - Е. Устанавливает ловушку для



38
АПК.00322-01 33 01-15

вызова макро xx после чтения N строк исходного
текста (управляющие строки и строки команд не
учитываются). Учитывается текст, считанный из
исходного файла или текст, вставляемый макроко-
мандами, содержащимися в строке исходного файла
или вызванными при обнаружении "ловушек";

em - конечное макроопределение. Форма вызова команды
em - .em xx, начальное значение - нет, нет аргу-
ментов - нет, примечание - нет. Макро xx будет
вызвана после окончания всего ввода. Результат
будет таким же, как если бы содержимое xx нахо-
дилось в конце последнего обрабатываемого файла.


















39
АПК.00322-01 33 01-15


8. ЧИСЛОВЫЕ РЕГИСТРЫ

Пользователю доступны множество различных, определен-
ных системой (системных) именованных числовых регистров.
Кроме того пользователь может определить собственные чис-
ловые регистры. Имена регистров содержат один или два сим-
вола и могут совпадать с именами команд, макро или цепо-
чек. Имена регистров также не могут содержать русских
букв. За исключением некоторых системных регистров, пред-
назначенных только для чтения, числовые регистры допускают
чтение, запись, автоматическое увеличение или уменьшение
содержимого и вставку их содержимого в вводимый текст в
различных форматах. Обычно пользователи используют эти ре-
гистры для автоматической нумерации разделов, параграфов,
строк и т.д. Числовые регистры можно использовать всегда,
когда требуется цифровой ввод, а также в числовых выраже-
ниях.

Числовые регистры создаются и изменяются с помощью
команды nr, которая задает имя, численное значение и вели-
чину автоматического приращения. Регистры также изменяют-
ся, если они используются в последовательности операций,
содержащих автоприращения. Если регистры x и xx содержат N
и шаг автоматического приращения равен M, то их использо-
вание в следующих последовательностях приводит к результа-
там, представленным в табл.3:




40
АПК.00322-01 33 01-15

Таблица 3
-----------------------------------------------
|последова-| состояние |вставляемоe|
|тельность | регистра |значение |
|----------|----------------------|-----------|
| \nx | не меняется | N |
| \n(xx | не меняется | N |
| \n+х | х увеличивается на М | N+M |
| \n-х | х уменьшается на М | N-M |
| \n+(xx | xx увеличивается на М| N+M |
| \n-(xx | xx уменьшается на М | N-M |
-----------------------------------------------

Когда числовой регистр вставляется в текст, его со-
держимое преобразуется в десятичную форму (по умолчанию),
в десятичную форму с ведущими нулями, в маленькие римские
цифры, большие римские цифры, в последовательность малень-
ких букв алфавита или последовательность заглавных букв
алфавита в зависимости от формата, заданного в команде af.

Для создания и изменения регистров используются сле-
дующие команды:

nr - определить и установить числовой регистр. Форма
вызова команды nr - .nr R _N M, начальное значе-
ние - нет, нет аргументов - нет, примечание - U.
Числовому регистру R присваивается значение _N
по отношению к предыдущему значению, если оно




41
АПК.00322-01 33 01-15

было. Шаг автоматического приращения устанавли-
вается равным M;

af - определить формат числового регистра. Форма вы-
зова команды af - .af R c, начальное значение -
арабские, нет аргументов - нет, примечание -
нет. Задает формат c для содержимого регистра R.
Могут быть использованы форматы, приведенные на
рис.1.
Форматы для регистра r
-------------------------------------------
| формат | последовательность нумерации |
|--------|--------------------------------|
| 1 | 0,1,2,3,4,5,........ |
| 001 | 000,001,002,003,004,005,...... |
| i | 0,i,ii,iii,iv,v,....... |
| I | 0,I,II,III,IV,V,....... |
| a | 0,a,b,c,..,z,aa,ab,..zz,aaa,.. |
| A | 0,A,B,C,..,Z,AA,AB,..ZZ,AAA,.. |
-------------------------------------------
рис.1 ;

rr - удалить числовой регистр. Форма вызова команды
rr - .rr R, начальное значение - нет, нет аргу-
ментов - игнорируется, примечание - нет. Если
динамически создается большое количество ре-
гистров, может возникнуть необходимость удалить
неиспользуемые больше регистры для того, чтобы



42
АПК.00322-01 33 01-15

освободить область внутренней памяти для вновь
создаваемых регистров.




























43
АПК.00322-01 33 01-15


9. ТАБУЛЯЦИИ, ЛИДЕРЫ И ПОЛЯ


9.1. Табуляции и лидеры

ASCII-символы горизонтальной табуляции (HT) и начала
залоговка (SOH), который далее будет называться лидером,
могут использоваться либо для генерации горизонтальных
подвижек, либо для формирования цепочки повторяющихся сим-
волов. Длина горизонтальной подвижки или цепочки регулиру-
ется внутренними табуляционными остановами (табуляциями),
устнавливаемыми с помощью команды ta. Различие состоит в
том, что, по умолчанию, символ tab генерирует подвижку, а
лидер формирует цепочку точек; с помощью команд lc и tc
можно изменить, соответственно, символы лидеров или подви-
жек. Существует три типа внутренних табуляционных остано-
вов: для выравнивания по левому краю табуляции, для вырав-
нивания по правому краю табуляции и по центру табуляции. В
табл.4, приведенной ниже, D - расстояние от текущей пози-
ции входной строки (где был обнаружен символ tab или
лидер) до следующей табуляции; "цепочка" состоит из вход-
ных символов, содержащихся за символом tab (лидером) до
следующего символа tab (или лидера) или конца строки; W -
ширина "цепочки".






44
АПК.00322-01 33 01-15

Таблица 4
-----------------------------------------------
|тип табуляции|длина подвижки |расположение |
| |или повторение | "цепочки" |
| | символов | |
|-------------+----------------+--------------|
| Левый | D |после пропуска|
| | |расстояния D |
| | | |
| Правый | D - W |выравнена по |
| | |правому краю |
| | |в пределах D |
| | | |
| Центральный | D - W/2 |центрирована |
| | |относительно |
| | |правого края |
| | |интервала D |
-----------------------------------------------

Длина горизонтальной подвижки может быть отрицатель-
ной, но длина цепочки повторяющихся символов отрицательной
быть не может. Цепочки повторяющихся символов содержат це-
лое число символов. Символы tab и лидеры, обнаруженные
после последней табуляции, игнорируются, но могут быть ис-
пользованы в качестве признаков конца "цепочки".

Символы табуляции и ведущие символы не интерпретиру-
ются в режиме копирования. Функции еt и еa всегда порожда-
ют неинтерпретируемые символы табуляции и лидеров, соот-


45
АПК.00322-01 33 01-15

ветственно, и в режиме копирования эквивалентны фактичес-
ким символам табуляции и ведущим символам.

9.2. Поля

Поле заключено между парой символов-разграничителей
полей и состоит из подцепочек, разделенных символами инди-
катора заполнения. Длина поля равна расстоянию от позиции
начала поля во входной строке и до следующей табуляции.
Разность между длиной поля и суммарной длиной всех подце-
почек определяет пространство горизонтального заполнения,
которое распределяется между соответствуюшими областями
заполнения. Величина заполнямого пространства может быть
отрицательной. Например, если ограничителем поля является
символ #, а указателем заполнения ^, то #^xxx^right# обоз-
начает выровненную по правому краю цепочку, с цепочкой
xxx, отцентрованной на оставшемся пространстве.

Используются следующие команды:

ta - установить табуляции. Форма вызова команды та -
.ta Nt ...., начальное значение - 0.81, нет ар-
гументов - отсутствует, примечание - Е, n. Уста-
навливает табуляции и их типы. t=R соответствует
выравниванию справа; t=C соответствует центриро-
ванию; при отсутствии t подразумевается выравни-
вание слева. По умолчанию установлены табуляцци
на каждые 0.8 дюйма (или 8n). Значения аргумен-
тов разделяются пробелами; значение, перед кото-


46
АПК.00322-01 33 01-15

рым стоит знак плюс (``+''), рассматривается как
приращение к значению предыдущей табуляции;

tc - установить символ заполнения табуляций. Форма
вызова команды tc - .tc c, начальное значение -
отсутствует, нет аргументов - отсутствует, при-
мечание -Е. Символом, заполняющим табуляционные
подвижки становится символ c, или (если c от-
сутствует) удаляется, обозначая тем самым под-
вижки;

lc - установить символ заполнения лидеров. Форма вы-
зова команды lc - .lc c, начальное значение -
нет, нет аргументов - отсутствует, примечание -
Е. Символом, заполняющим лидеры, становится
символ c, или (если c отсутствует) удаляется,
обозначая тем самым подвижки;

fc - установить символы ограничителя и заполнителя
поля. Форма вызова команды fc - .fc a b, началь-
ное значение - выключить, нет аргументов - вык-
лючить, примечание - нет. Символ ограничителя
поля устанавливается в a; индикатор заполнения
устанавливается в b, а в случае отсутствия b - в
пробел. Если аргументы отсутствуют, механизм уп-
равления полями выключается.






47
АПК.00322-01 33 01-15


10. СОГЛАШЕНИЯ О ВВОДЕ/ВЫВОДЕ И
ПРЕОБРАЗОВАНИЯ СИМВОЛОВ


10.1. Преобразования входных символов

Pif воспринимает некоторые управляющие символы кода
ASCII, такие как символ горизонтальной табуляции (HT),
символ начала заголовка (SOH), символ возврата на шаг
(BS). Символ новой строки (NL) (или LF) используется в ка-
честве разграничителя входных строк. Кроме того, восприни-
маются служебные символы начала текста (STX), конца текста
(ETX), опроса (ENQ), опознания (ACK) и "звонок" (BEL), ко-
торые могут использоваться в качестве разграничителей. Все
прочие символы игнорируются.

Символ переключения ``\'' указывает, что за ним будет
следовать символ, который обозначает другой определенный
символ или некоторую функцию. Полный перечень этих после-
довательностей приведен в разд.23. Символ ``\'' не следует
путать с символом переключения кода (ESC) кода ASCII. Что-
бы в выходном тексте появился символ ``\'', нужно восполь-
зоваться последовательностью ``\\'' во входном тексте.
Символ переключения можно изменить с помощью команды ec.
Для распечатки действующего в данный момент символа перек-
лючения можно воспользоваться функцией \e. При желании или
необходимости механизм переключения кода может быть отклю-
чен и восстановлен при помощи команды eo.



48
АПК.00322-01 33 01-15

Используются следующие команды установки переключате-
лей:

ec - установить символ переключения. Форма вызова ко-
манды ec - .ec c, начальное значение - е, нет
аргументов - е, примечание - нет. Устанавливает
символ переключения в c, а при его отстутствии в
е;

eo - изменить состояние механизма переключения. Форма
вызова команды eo - .eo, начальное значение -
выключить, нет аргументов - нет, примечание -
нет.

10.2. Возврат и подчеркивание

Если выключен режим копирования, то символ возврата
на шаг (BS) кода ASCII обычно заменяется на горизонтальную
подвижку в обратном направлении на ширину символа пробела.
Функция подчеркивания, как одна из форм построения линий,
описана в подразд.12.3. В системе pif подчеркивание произ-
водится автоматически при помощи включения курсива (коман-
дой ft или функцией \f) или при помощи команды ul. Следует
отметить, что подчеркиваются не все символы, а только
буквы и цифры; знаки и пробелы остаются неподчеркнутыми.

Используются следующие команды:

ul - подчеркивать следующие N строк исходного текста.