КулЛиб - Классная библиотека! Скачать книги бесплатно 

Руководство пользователя GNU troff [Иван Георгиевич Титаренко] (fb2) читать онлайн


 [Настройки текста]  [Cбросить фильтры]
  [Оглавление]

Титаренко Иван Георгиевич (перевод) Руководство пользователя GNU troff

Оглавление.


1. Текстовой процессор GNU troff

2. История troff

3. Основные возможности

4. Командная строка

5. Опции командной строки

6. Вывод на устройство

7. Переменные окружения

8. Каталоги макросов

9. Каталоги шрифтов

10. Страница, размер страницы

11. Примеры работы CLI

12. Утилита grod

13. Основные объекты gtroff

14. Текст

15. Перенос слова

16. Соглашения набора

17. Табуляторы

18. Разрыв строки

19. Внутренние соглашения

20. Входные кодировки

21. Единицы измерения

22. Единица измерения по умолчанию

23. Арифметика, логика, выражения, операторы

24. Идентификаторы

25. Встроенные команды

26. Встроенные запросы

27. Аргументы макросов и запросов

28. Встроенные макросы

29. Экранирование

30. Комментарии

31. Числовые регистры

32. Установка регистров

33. Интерполяция регистров

34. Регистры, автоинкремент

35. Переопределение форматов

36. Встроенные регистры

37. Корректировка и наполнение

38. Управление переносами слов

39. Управление пространством

40. Поля и табуляция

41. Лидеры

42. Поля

43. Трансляция символов

44. Режимы troff и nroff

45. Размещение строк

46. Контроль строк

47. Макеты страниц

48. Контроль страницы

49. Строковые переменные

50. Операторы if, ie, while

51. Конструкция if‐else

52. Цикл while

53. Добавление файлов

54. Доступ к постпроцессорам

55. Дополнительные команды

56. Внутренние преобразования gtroff

57. Отладка

58. Предупреждения и ошибки

59. Особенности программы troff

60. Препроцессоры

61. Постпроцессор grotty

62. Постпроцессор grops

63. Встроенный POSTSCRIPT

64. Постпроцессор gropdf

65. Команды PDF

66. Постпроцессор grodvi

67. Постпроцессор grolj4

68. Постпроцессор grolbp

69. Постпроцессор grohtml

70. Специальные регистры и строки grohtml

71. Промежуточные форматы вывода

72. Пробелы и табуляторы

73. Командные аргументы

74. Опредение промежуточного документа

75. Команды промежуточного вывода

76. Команды для работы с графикой

77. Команды контроля устройств

78. Устаревшие команды

79. Промежуточный вывод

80. Совместимость вывода

81. Среды и окружения

82. Подавление вывода

83. Создание макросов

84. Режим копирования

85. Параметры макроса

86. Ловушки

87. Ловушки страницы

88. Ловушки внутри диверсий

89. Ловушки строки

90. Ловушка пустой строки

91. Ловушки специальных символов

92. Ловушка конца строки

93. Диверсии, перенаправления

94. Символы и шрифты

95. Настройки шрифтов

96. Семейство шрифтов

97. Позиции шрифта

98. Глифы и символы

99. Классы символов

100. Специальные шрифты

101. Модификации шрифтов

102. Лигатуры и кернинг

103. Размеры строк

104. Изменение размеров

105. Дробные размеры

106. Файлы настройки

107. Файл описания устройств DESC

108. Файл описания шрифта

109. Перемещение по странице

110. Геометрические фигуры

111. Настройки цвета

Текстовой процессор GNU troff

GNU troff («groff») — текстовой процессор, система набора документов. Программный пакет troff очень гибкий, легко настраивается и широко применяется уже около тридцати лет. Это авторитетный, известный программный пакет форматирования текстов в сообществе Unix.

Программа «groff» принадлежит к старшему поколению систем подготовки документов: такие системы похожи на компиляторы языков программирования. «Groff» и его современный аналог «TeX» форматируют текст в «пакетной» парадигме: входные (исходные) файлы представляют текстовые файлы со встроенными командами форматирования.

«Groff» не следует путать с «текстовыми процессорами», созданными в парадигме WYSIWYG.

Хотя системы WYSIWYG проще в использовании, но у них есть ряд недостатков по сравнению с troff, например, они требуют графического монитора и не очень хорошо справляются с огромными массивами текстовых файлов.

История troff

Происхождение troff можно проследить до программы форматирования RUNOFF, написанной Джерри Зальцером. Программа применялась в проекте CTSS (Compatible Time Sharing System, проект Массачусетского технологического института) в середине шестидесятых годов. Очевидно, название произошло от фразы «run off a document».

Боб Моррис портировал программу на архитектуру 635 и назвал «roff». Затем программу переписали с именем «rf» для PDP‐7 (до Unix), и в 1969 году Дуг Макилрой создал расширенную и упрощенную версию roff на языке программирования BCPL.

В 1971 году разработчики Unix решили закупить компьютеры PDP‐11 и, чтобы оправдать вложения, предложили внедрить систему форматирования документов для патентного отдела AT&T. Первая программа форматирования была повторной реализацией roff Макилроя, ее автором стал Дж. Ф. Оссанна.

Когда понадобился более гибкий язык, была написана новая версия roff под названием «nroff». Программа имела сложный синтаксис, но послужила основой для всех будущих версий.

Для фотонаборной машины CAT от Graphic Systems Оссанна написал собственную версию nroff. Ее назвали «troff».

Фактически это была одна и та же программа, за некоторыми исключениями: nroff предназначалась для вывода на построчные принтеры и символьные терминалы.

Позднее началась работа над препроцессорами. Программы транслировали определенные части документа в troff, очень естественно применяя конвейеры Unix.

Так, препроцессор «eqn» позволял описывать математические формулы простым, интуитивно понятным способом, а «tbl» форматировал таблицы. Препроцессор «refer» (и аналогичная программа «bib») обрабатывал цитаты в документе с помощью библиографической базы данных.

К сожалению, программа troff Оссанны была написана на языке ассемблера PDP‐11, она специально создавалась для фотонаборной машины CAT. Оссанна переписал программу на C, хотя теперь она состояла из 7000 строк кода без комментариев и все еще зависела от CAT. Поскольку машины CAT больше не поддерживались производителем, потребовались правки кода. Прежде чем это удалось сделать, Оссанна умер от сердечного приступа в больнице.

Тогда же Брайан Керниган взял на себя задачу переписать troff. Его версия создавала независимый от устройства код, постпроцессоры читали и транслировали его в соответствующие команды принтеров. Кроме того, новая версия troff (названная ditroff) имела несколько расширений.

Благодаря дополнительным возможностям появились наборы препроцессоров. Препроцессор «pic» обеспечивал функции рисования, а препроцессор «grap» работал с графами.

Джеймс Кларк начал работу над GNU‐реализацией ditroff в начале 1989 г. Первая версия groff 0.3.1 была выпущена в июне 1990 г. В этой версии появились следующие модификации: добавлены препроцессоры «soelim», «pic», «tbl» и «eqn», также постпроцессоры для символьных устройств, POSTSCRIPT, TeX DVI и оконной системы X Windows.

Программа GNU troff устранила необходимость в отдельной программе nroff, добавились макросы «me» и собственная реализация «man».

Начиная с 1999 года у groff появились сопровождающие (пакет несколько лет оставался сиротой). В результате добавили новые функции и программы, такие как «grn», препроцессор для изображений гремлинов и устройство вывода HTML и XHTML.

Основные возможности

Программный пакет groff предоставляет различные формы низкоуровневых операций форматирования текста. С их помощью можно выполнять сложные задачи форматирования, такие как создание оглавлений, сносок, центрирование текста, переносы, управление страницами, шрифтами, размерами глифа, вертикальным интервалом, строкой и т.д.

Поскольку groff применяет сложные средства низкого уровня, чтобы упростить форматирование и для рутинной работы были созданы программы‐макросы. Макросы можно собирать вместе в «пакеты». Доступно несколько пакетов макросов, наиболее распространенными считаются «man», «mdoc», «me», «ms» и «mm».

Хотя groff предоставляет множество функций, необходимых для форматирования документа, некоторые операции, например, рисование, будет сложно реализовать простыми средствами. Поэтому были написаны программы‐препроцессоры, работающие с собственными командами управления. Препроцессоры способны отличать свои команды от других запросов с помощью маркеров.

Для передачи данных препроцессорам используются потоки Unix. Также для создания документа может применяться любое количество препроцессоров, поэтому препроцессоры объединяются в один конвейер. Чтобы работать с groff, пользователю не нужно создавать конвейер, но необходимо указать добавляемые препроцессоры.

В настоящее время groff включает препроцессоры для создания таблиц («tbl»), оформления уравнений («eqn»), рисования («pic» и «grn»), обработки библиографии («refer»), вывода формул химических структур («chem»). Ассоциированная программа, полезная при работе с препроцессорами, называется «soelim».

В качестве дополнительного пакета имеется бесплатная реализация препроцессора создания графиков «grap».

Уникальным для «groff» является препроцессор «preconv», он позволяет обрабатывать документы в различных входных кодировках.

Существуют и другие препроцессоры, но, к сожалению, бесплатных реализаций нет.

Groff создает независимый от устройств код, он может быть передан в постпроцессор для работы с конкретным устройством. В настоящее время groff поддерживает постпроцессоры для устройств POSTSCRIPT, символьных терминалов, оконной среды X Windows (для предварительного просмотра), подготовки файлов формата TeX DVI, также обеспечивает поддержку принтеров HP LaserJet 4 и Canon LBP (CAPSL), вывод HTML, XHTML и PDF.

О документе. Большая часть руководства взята из существующих документов, в первую очередь это страницы руководства groff Джеймса Кларка и замечания Эрика Оллмана к пакету макросов «me». Раздел пакета макросов «man» частично основан на справочной странице Сьюзэн Клейнман («groff_man»), написанной для дистрибутива Debian GNU/Linux. Ларри Коллар предоставил материал для пакета макросов «ms».

Командная строка

В этом разделе основное внимание уделяется тому, как вызвать внешний интерфейс groff. Интерфейс командной строки управляет построением конвейера между препроцессорами, gtroff и постпроцессорами.

Программы GNU традиционно получают префикс «g», чтобы отличить их от оригинальных программ. Например, «geqn» — это «eqn» версии GNU. В операционных системах GNU/Linux или Hurd, которые не содержат проприетарных версий troff, а также в MS‐DOS/MS‐Windows, префикс опущен, так как GNU troff является единственным вариантом troff.

В этом документе мы пишем gtroff, если подразумеваем программу GNU troff. Все остальные реализации называются troff AT&T.

Опции командной строки

Команда «groff» обычно запускает программу «gtroff» и постпроцессор, соответствующий выбранному устройству. Устройством по умолчанию считается «ps».

Многие аргументы «groff» также передаются «gtroff». Аргументы для пре‐ или постпроцессоров можно найти в вызовах gpic, geqn, gtbl, ggrn, grefer, gchem, gsoelim, preconv, grotty, grops, gropdf, grohtml, grodvi, grolj4, grolbp и gxditview.

Формат командной строки для «groff» следующий.

groff [ ‐abceghijklpstvzCEGNRSUVXZ ] [ ‐d«cs» ] [ ‐D«arg» ]
[ ‐f«fam» ] [ ‐F«dir» ] [ ‐I«dir» ] [ ‐K«arg» ] [ ‐L«arg» ]
[ ‐m«name» ] [ ‐M«dir» ] [ ‐n«num» ] [ ‐o«list» ] [ ‐P«arg» ]
[ ‐r«cn» ] [ ‐T«dev» ] [ ‐w«name» ] [ ‐W«name» ] [ «files»... ]
Однако для работы с командной строкой «gtroff» ввод изменен.

gtroff [ ‐abcivzCERU ] [ ‐d«cs» ] [ ‐f«fam» ] [ ‐F«dir» ]
[ ‐m«name» ] [ ‐M«dir» ] [ ‐n«num» ] [ ‐o«list» ] [ ‐r«cn» ]
[ ‐T«name» ] [ ‐w«name» ] [ ‐W«name» ] [ «files» ... ]
Впрочем, многие опции groff фактически передаются gtroff без модификаций.

Опции без аргумента могут быть сгруппированы за символом «‐». Символ «‐» предполагает стандартный ввод. Между опцией и параметрром может быть пробел.

Утилиту «grog» допускается применять для угадывания правильной команды groff.

Параметры командной строки даются ниже.

«‐a»

Опция создает аппроксимацию ASCII для вывода в терминал. Доступный только для чтения регистр «.A» принимает значение 1.

:: groff ‐a ‐man ‐Tdvi troff.man | less

Сегодня опция кажется бесполезной, поскольку графические терминалы везде доступны.

«‐b»

Трассировка с предупреждением или сообщением об ошибке. Обратная трассировка помогает отследить причину ошибки. Номера строк, указанные в трассировке, не всегда правильно определяются: иногда gtroff ошибается с запросами «as» или «am» при подсчете строк.

«‐c»

Подавление цветного вывода.

«‐C»

Включает режим совместимости различных версий troff.

«‐d c s»

«‐d name=s»

Опции определяют «c» или «name» как строку «s». В данном случае «c» однобуквенное имя, «name» может быть произвольной длины. Все определения строк происходят до загрузки любого файла макроса, включая стартовый файл.

«‐D arg»

Установит кодировку ввода «preconv» на «arg». По умолчанию препроцессор включается опцией «‐k».

«‐e»

Предварительная обработка с помощью «geqn».

«‐E»

Запрещает вывод сообщений об ошибках.

«‐f fam»

Устанавливает «fam» как семейство шрифтов по умолчанию.

«‐F dir»

Ищет в «dir» подкаталоги «dev.name» («name» — имя устройства), файл «DESC» и файлы шрифтов, прежде чем искать в стандартном каталоге. Параметр передается всем пре‐ и постпроцессорам с помощью переменной окружения «GROFF_FONT_PATH».

«‐g»

Предварительно обрабатывает файл с помощью «ggrn».

«‐G»

Предварительная обработка с помощью «grap». Но по умолчанию указана опция «‐р».

«‐h»

Вывод справочного сообщения.

«‐i»

Читает стандартный ввод после обработки всех именованных входных файлов.

«‐I dir»

Параметр применяется для указания каталога поиска файлов. Передается в следующие программы: «gsoelim» (подразумевает опцию «‐s»); «gtroff» (для поиска файлов, названных в запросах «psbb» и «so»); «grops» (для поиска файлов, указанных в escape‐последовательности «\X’ps: import» и «\X’ps: file»).

Текущий каталог всегда ищется первым. Опция может повторяться. Каталоги просматриваются в указанном порядке. Поиск в каталоге для файлов, указанных с использованием абсолютного пути, не выполняется.

«‐j»

Предварительная обработка с помощью «gchem». По умолчанию «‐р».

«‐k»

Предварительная обработка с помощью «preconv». Запускается перед любым другим препроцессором, если опция «‐K» (или «‐D») не указана.

«‐K arg»

Установит входную кодировку «preconv» в «arg».

«‐l»

Отправляет вывод в спулер печати. Вывод‐команда указывается командой «print» в файле описания устройства. Если требуемые опции не добавлены, «‐l» игнорируется.


** Спулер печати — набор программных компонентов, управляющих процессом печати.

«‐L arg»

Передает «arg» спулеру. Каждый аргумент должен передаваться с опцией «‐L». Обратите внимание, что «groff» не добавляет «‐» к «arg» перед передачей в постпроцессор. Если ключевое слово «print» в файле описания устройства отсутствует, параметрр «‐L» игнорируется.

«‐m name»

Просматриваются настройки в файле «name.tmac». Обычно «groff» ищет настройки в каталогах макросов. Если настройки не найдены, программа обращается к «tmac.name».

«‐M dir»

Поиск в каталоге «dir» для файлов макросов перед поиском в стандартных каталогах.

«‐n num»

Номер первой страницы («num»).

«‐N»

Отключает перевод строк с разделителями «eqn». Это то же самое, что опция «‐N» в «geqn».

«‐o list»

Выводит страницы в «list», где аргумент ‐ список диапазонов страниц, разделенных запятыми; «n» подразумевает печать страницы «n», «m ‐ n» означает печать каждой страницы между «m» и «n»; «‐n» выводит каждую страницу до «n»; «n‐» заставляет печатать каждую страницу, начинающуюся с «n». Программа gtroff завершает работу после печати последней страницы в списке.

В gtroff информация о печати страниц может быть получена чтением регистра «.P».

Если ваш документ перезагружает нумерацию страниц в начале любой главы, то gtroff выводит указанный диапазон страниц для каждой главы.

«‐p»

Предварительная обработка с помощью «gpic».

«‐P arg»

Передает «arg» в постпроцессор. Каждый аргумент должен передаваться с опцией «‐P». Обратите внимание, что groff не добавляет «‐» к «arg» перед передачей в постпроцессор.

«‐r c n»

«‐r name=n»

Установит номер регистра «c» или «name» в значение «n», где «c» однобуквенное, а «name» произвольной длины, «n» может быть любым числовым выражением gtroff. Все назначения регистров происходят перед загрузкой любого файла макроса (включая файл запуска).

«‐R»

Предварительная обработка с помощью «grefer». Механизм передачи аргументов «grefer» не предусмотрен, потому что большинство параметрров «grefer» имеют эквивалентные команды, которые можно включить в файл.

Обратите внимание, что «gtroff» также принимает опцию «‐R», недоступную для «groff». Эта опция предотвращает загрузку файлов «troffrc» и «troffrc‐ end».

«‐s»

Предварительная обработка с помощью «gsoelim».

«‐S»

Безопасный режим. Передает опцию «‐S» в «gpic» и отключает запросы «open», «opena», «pso», «sy» и «pi». Из соображений безопасности режим включен по умолчанию.

«‐t»

Предварительно обработка с помощью «gtbl».

Вывод на устройство

В программе под устройствами понимают форматированный определенным образом текст. Например, устройство «ps» создает файл для принтеров формата POSTSCRIPT.

«‐T dev»

Опция подготавливает вывод для устройства «dev». Устройством по умолчанию считается «ps», если не было указано иное при настройке и сборке groff.

В настоящее время доступны следующие устройства вывода.

«ps»

Устройство для принтеров и программ предварительного просмотра POSTSCRIPT.

«pdf»

Устройство для программ просмотра PDF или поддерживаемых принтеров.

«dvi»

Вывод в формате TeX DVI.

«X75»

Вывод для средств предварительного просмотра X11 с разрешением 75 dpi.

«X75‐12»

Вывод для средств предварительного просмотра X11 с разрешением 75 dpi и базовым шрифтом 12pt в документе.

«X100»

Вывод для средств предварительного просмотра X11 с разрешением 100 dpi.

«X100‐12»

Для средств предварительного просмотра X11 с разрешением 100 dpi и базовым шрифтом 12pt в документе.

«ascii»

Форматирование для устройств типа пишущих машинок, использующих 7‐битный набор символов ASCII.

«latin1»

Форматирование для устройств типа пишущих машинок, поддерживающих набор символов Latin‐1 (ISO 8859‐1).

«utf8»

Для устройств типа пишущих машинок с набором символов Unicode (ISO 10646) и кодировкой UTF‐8.

«cp1047»

Для устройств типа пишущих машинок кодировки EBCDIC IBM cp1047.

«lj4»

Для принтеров, совместимых с HP LaserJet4 или PCL5.

«lbp»

Для принтеров Canon CAPSL (лазерные принтеры серий LBP‐4 и LBP‐8).

«html»

«xhtml»

Форматирование выходных данных в форматах HTML и XHTML соответственно. Обратите внимание, что драйвер состоит из двух частей: препроцессора («pre‐ grohtml») и постпроцессора («post‐grohtml»).

Предопределенный строковый регистр gtroff «.T» содержит текущее устройство вывода; регистр только для чтения «.T» устанавливается в 1, если опция включена (что всегда верно, когда «groff» вызывает «gtroff»).

Постпроцессор устройства задается командой «postpro» в файле описания устройства, его можно переопределить с помощью опции «‐X».

«‐U»

Небезопасный режим. Включает запросы «open», «opena», «pso», «sy» и «pi».

«‐w name»

Включает предупреждение «name». Допускается использование нескольких вариантов «‐w».

«‐W name»

Запрещает предупреждение «name». Допускается использование нескольких вариантов «‐W».

«‐v»

Заставит программы, запускаемые groff, выводить номер версии.

«‐V»

Выводит конвейер на «stdout» вместо выполнения команд потока. Если опция указана более одного раза, выведет конвейер на «stderr» (поток ошибок) и выполнит определенные команды.

«‐X»

Предварительный просмотр с помощью программы «gxditview». Просмотр вряд ли даст удобочитаемые результаты без опции «‐Tps».

Обратите внимание, что опция отлична от «‐TX75» или «‐TX100»: в первом случае используются метрики указанного устройства, во втором применяются X‐специфичные шрифты.

«‐z»

Подавляет вывод gtroff. Выводятся только сообщения об ошибках.

«‐Z»

Запрещает выполнять постобработку gtroff. (Обычно groff автоматически запускает соответствующий постпроцессор.)

Переменные окружения

Существуют несколько переменных окружения в операционной системе, приводящих к изменению работы groff.

«GROFF_BIN_PATH»

Путь поиска, за которым следует «PATH»; используется для команд, выполняемых groff.

«GROFF_COMMAND_PREFIX»

Если установлено значение «X», то groff запускает X‐версию troff вместо gtroff. Что также относится к «tbl», «pic», «eqn», «grn», «chem», «refer» и «soelim». Не распространяется на «grops», «grodvi», «grotty», «pre‐ grohtml», «post‐grohtml», «preconv», «grolj4», «gropdf», и «gxditview».

Префикс команды определяется в процессе установки. Если найдена система troff, отличная от GNU, применяется префикс «g».

«GROFF_ENCODING»

Значение этого параметрра среды передается препроцессору «preconv» для выбора кодировки входных файлов. Подразумевает использование параметрра командной строки «groff ‐k», в этом случае groff всегда вызывает «preconv». Если значение не задано, groff вызывает «preconv» без аргументов. Явный параметрр командной строки «‐K» переопределяет значение «GROFF_ENCODING».

«GROFF_FONT_PATH»

Разделенный двоеточиями список каталогов, в которых следует искать директории «dev/name».

«GROFF_TMAC_PATH»

Список каталогов, разделенных двоеточиями для поиска файлов макросов.

«GROFF_TMPDIR»

Каталог, в котором groff создает временные файлы. Если переменная не определена, установлен «TMPDIR», именно в этом каталоге создаются временные файлы. В противном случае временные файлы создаются в системно‐зависимом каталоге по умолчанию. В системах Unix и GNU/Linux это обычно директория /tmp. (Программы «grops», «grefer», «pre‐grohtml» и «post‐grohtml» могут создавать временные файлы в этом каталоге.)

«GROFF_TYPESETTER»

Устройство вывода по умолчанию.

«SOURCE_DATE_EPOCH»

Отметка времени, считается в секундах с начала «эпохи Unix». Применяется вместо текущего времени при инициализации встроенных регистров, основанных на времени, таких как «\n[seconds]».


** Обратите внимание, что порты groff для операционных систем MS‐DOS и MS‐Windows используют точку с запятой для разделения каталогов в списках.

Каталоги макросов

Все имена файлов макросов должны называться «name.tmac» или «tmac.name». Это необходимо, чтобы опция командной строки «‐m name» корректно работала. Запрос «mso» не имеет подобного ограничения; допускается любое имя файла, gtroff не будет добавлять строку «tmac».

Файлы макросов хранятся в «каталогах tmac», каждый из которых описан как «путь tmac».

Пути поиска файлов макросов следующие: а) каталоги, указанные с помощью опции командной строки «‐M»; б) каталоги, определенные в переменной окружения «GROFF_TMAC_PATH»; г) текущий каталог (только в небезопасном режиме с ключом командной строки «‐U»); д) домашний каталог; е) каталог, зависящий от платформы или специфичный (независимый от платформы), а также основной каталог tmac.

Примеры.

:: /usr/local/lib/groff/site‐tmac

:: /usr/local/share/groff/site‐tmac

:: /usr/local/share/groff/1.22.3/tmac


** В процессе установки или компиляции программ можно самостоятельно настроить каталоги и пути.

Каталоги шрифтов

Не существует ограничений для имен файлов шрифтов, но чтобы механизм семейства шрифтов работал, шрифты должны начинаться с имени семейства, за которым следует форма. Например, семейство Times использует «T» для подгрупп «R», «B», «I» и «BI» (римский, жирный, курсив и жирный курсив или «roman», «bold», «italic», «bold italic»). В терминологии groff они также имеют сокращенные названия «TR», «TB», «TI» и «TBI».

Все файлы шрифтов хранятся в «каталогах шрифтов», определяемых как «путь к шрифтам». Функции поиска файлов всегда добавляют каталог «devname», где «name» — это имя выходного устройства.

Например, если предполагается выход на устройство DVI, где «/foo/bar» считается каталогом шрифтов, файлы шрифтов для «grodvi» должны находиться в «/foo/bar/devdvi».

Пути поиска файлов шрифтов определены следующим образом.

1. Каталоги, указанные с помощью опции командной строки «‐F». Драйверы устройств и некоторые препроцессоры также понимают эту опцию.

2. Каталоги, указанные в переменной окружения «GROFF_FONT_PATH».

3. Каталог для конкретного применения и основной каталог шрифтов; расположение по умолчанию /usr/local/share/groff/site‐font, /usr/local/share/groff/1.22.3/font.

В процессе установки программ можно настроить каталоги шрифтов самостоятельно.

Страница, размер страницы

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

Размер бумаги по умолчанию можно установить в файле DESC устройства. Большинство устройств вывода понимает параметр командной строки «‐p» (переопределение размера) и параметрр «‐l» (альбомная ориентация).

Для удобства установки размера бумаги существует параметрр командной строки «‐dpaper=size», определяющий строку «paper»; она обрабатывается в файле «papersize.tmac» (по умолчанию загружается в «troffrc»). Возможные значения для «size» такие же, как предопределенные значения ключевого слова «papersize» (но только в нижнем регистре), за исключением «a7», «d7». Символ «l» (ell) подразумевает альбомную ориентацию.

Например, ниже определяется вывод PS на бумаге формата A4 в альбомной ориентации.

:: groff ‐Tps ‐dpaper=a4l ‐P‐pa4 ‐P‐l ‐ms foo.ms > foo.ps

Обратите внимание, конкретный пакет макросов должен учитывать установленные размеры страницы.

Примеры работы CLI

В этом разделе перечислены несколько распространенных вариантов использования groff и соответствующих командных строк.

:: groff file

Эта команда обрабатывает «file» без макросов или препроцессора. Устройством вывода по умолчанию считается «ps», вывод отправляется на «stdout».

:: groff ‐t ‐mandoc ‐Tascii file | less

Здесь вызывается макрос «mandoc». Программа gtroff обрабатывает страницу «file» с макрофайлом «mandoc» (который, в свою очередь, вызывает пакет макросов «man» или «mdoc»), с помощью препроцессора «tbl» и устройство вывода ASCII. Наконец, пейджер «less» отображает результат.

:: groff ‐X ‐m me file

Предварительный просмотр «file» с помощью программы «gxditview» и пакета макросов «me». Поскольку опция «‐T» не указана, применяется устройство по умолчанию «ps». Обратите внимание, вы можете написать «‐m me» или «‐me», последнее считается анахронизмом с первых дней существования Unix.

:: groff ‐man ‐rD1 ‐z file

Форматирует «file» с помощью пакета макросов «man», принудительная двусторонняя печать.

Утилита grod

«Grog» читает файлы и пытается определить, исходя из анализа синтаксиса, какие препроцессоры или пакеты макросов необходимы для форматирования. Затем создается команда groff с опциями для стандартного вывода. Генерируются варианты «‐e», «‐man», «‐me», «‐mm», «‐mom», «‐ms», «‐mdoc», «‐mdoc‐old», «‐p», «‐R», «‐g», «‐G», «‐s» и «‐t».

Специальное имя файла «‐» относится к стандартному вводу. Отсутствие файлов также подразумевает чтение стандартного ввода. Любые указанные параметрры включаются в итоговую команду. Между параметррами и аргументами не допускаются пробелы. Единственными распознаваемыми параметррами являются «‐C» для включения режима совместимости и «‐v», чтобы напечатать номер версии и закончить работу.

:: grog ‐Tdvi paper.ms

Здесь угадывается соответствующая команда для печати «paper.ms», результат выводится в командую строку после добавления опции «‐Tdvi». Для прямого вывода заключите вызов «grog» в обратные кавычки.

Основные объекты gtroff

В процессе работы над тестом программа gtroff собирает слова из ввода и пытается разместить как можно больше слов в строку вывода. Это называется «заполнение».

Текст

В процессе работы над тестом программа gtroff собирает слова из ввода и пытается разместить как можно больше слов в строку вывода. Это называется «заполнение».

После того, как gtroff создает «заполненную» строку, она «настраивается». Поэтому интервал между словами увеличивается до тех пор, пока текст не достигнет правого поля (в режиме настройки по умолчанию). Лишние пробелы между словами сохраняются, но пробелы в конце строк игнорируются. Пробелы в начале строки вызывают «разрыв строки».

Перенос слова

Программа gtroff переносит слова, чтобы можно было выровнять строки, не вставляя лишние пробелы между словами. Программа использует внутренний алгоритм расстановки переносов (упрощенная версия алгоритма TeX), чтобы определить, какие слова следует переносить через дефис и как это делать. При переносе первая часть слова добавляется к текущей заполняемой выводимой строке с присоединенным дефисом, вторая часть добавляется к следующей заполняемой строке.

Соглашения набора

Известные правила набора гласят, что после знаков препинания должно быть разное количество пробелов. Например, в «Чикагском руководстве по набору текста» говорится, что после точки в конце предложения должно быть в два раза больше места, чем после запятой или точки в составе аббревиатуры.

Программа gtroff следует правилам, помечая определенные символы (обычно «!», «?» и «.») как «конец предложения». Когда gtroff встречает один из этих символов в конце строки, добавляется обычный пробел, за которым следует символ‐пробел конца предложения.

Кроме того, следующие знаки и графемы обрабатываются прозрачно при форматировании символов конца предложения: «"», «’», «)», «]», «*», «\[dg]», «\[rq]», and «\[cq]».

Чтобы предотвратить вставку лишнего пробела после символа конца предложения, добавьте «\&».

Табуляторы

Программа gtroff транслирует «символы табулятора» (код ASCII «0x09», EBCDIC «0x05») при вводе до следующей остановки табулятора. Позиции табуляции изначально располагаются через полдюйма на странице, что позволяет создавать простые таблицы. Однако внешний вид, ширина текста на терминале и на принтере могут сильно различаться.

Разрыв строки

Важным понятием gtroff считается «разрыв строки». Когда происходит разрыв, gtroff выводит частично заполненную строку (без выравнивания) и возобновляет заполнение текста на следующей строке.

Есть несколько способов изменить алгоритм работы gtroff с разрывом строки. Например, пустая строка не только вызывает разрыв, но выводит однострочный вертикальный пробел. Обратите внимание, что допускается изменять алгоритм с помощью макроса пустой строки «blm».

Строка, начинающаяся с пробела, вызывает разрыв, пробел выводится в начале следующей строки. Пространство не корректируется даже в режиме заполнения; тем не менее, алгоритм тоже можно изменить с помощью макроса «lsm».

Конец файла также вызывает разрыв, в противном случае последняя строка документа удаляется из файла.

Примечание. Некоторые запросы явно или неявно вызывают разрывы.

Внутренние соглашения

Поскольку gtroff заполняет строку автоматически, в программе принято не вводить текст с отформатированными абзацами. Ниже перечислены некоторые соглашения, обычно используемые при наборе текста gtroff.

1. Разрывайте строки после знаков препинания, особенно в конце предложения, в других логически важных местах. Сохраняйте связанные абзацы, фразы на строках без переноса, так как при редактировании часто добавляются или удаляются пустые строки.

2. Старайтесь, чтобы длина строк не превышала 66 символов.

3. Не пытайтесь выполнять форматирование в режиме WYSIWYG (т.е. не добавляйте пробелы для получения правильного отступа).

Входные кодировки

В настоящее время доступны следующие входные кодировки.

• cp1047

Входная кодировка применяется только на платформах EBCDIC (другие входные кодировки не работают с EBCDIC); файл «cp1047.tmac» загружается при запуске.

• latin‐1

Кодировка ввода по умолчанию на платформах, отличных от EBCDIC; файл «latin1.tmac» загружается при запуске.

• latin‐2

Чтобы применить эту кодировку, укажите «.mso latin2.tmac» в самом начале документа или добавьте «‐mlatin2» в качестве аргумента командной строки groff.

• latin‐5

Применяется для турецкого языка. Укажите «.mso latin5.tmac» в самом начале документа, либо передайте «‐mlatin5» в качестве аргумента командной строки groff.

• latin‐9 (latin‐0)

Кодировка предназначена для замены latin‐1. Основное отличие от latin‐1 состоит в том, что latin‐9 содержит символ евро. Чтобы применить кодировку, укажите «.mso latin9.tmac» в начале документа, либо добавьте аргумент «‐mlatin9» как команду groff.

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

groff ‐Tlatin1 ‐mlatin9 ...
Так, вывод не будет работать, если текст содержит символ евро. Обычно ограничение присутствует только на устройствах с сокращенным набором выходных глифов (например, «‐Tascii» и «‐Tlatin1»); для других устройств достаточно установить правильные шрифты, содержащие необходимые глифы.

Из‐за важности глифа евро в Европе, пакет groff поставляется со шрифтом POSTSCRIPT («freeeuro.pfa»), шрифт предоставляет различные формы глифа для евро. Другими словами, кодировка latin‐9 поддерживается для устройства «‐Tps» из коробки. Это не касается кодировки latin‐2.

Настройка «‐Tutf8» поддерживает все входные кодировки; «‐Tdvi» поддерживает как latin‐2, так и latin‐9, если командная строка «‐mec» применяется для загрузки файла «ec.tmac», что заставляет процессор переключиться на шрифты EC.

Единицы измерения

Gtroff требует числовых параметрров для различных измерений. К большинству числовых параметрров может быть прикреплена «единица измерения». Единица указывается как одиночный символ, следующий непосредственно за числом или выражением. Каждая из единиц понимается как кратная «основной единице». Когда указывается единица измерения, gtroff преобразует ее в собственные «базовые единицы».

Базовая единица измерения, обозначаемая буквой «u», зависит от устройства и ограничена значениями от 1/75 до 1/72000 дюйма. Значения могут быть указаны в дробных числах; однако дробные базовые единицы всегда округляются до целых чисел.

Некоторые единицы измерения полностью независимы от каких‐либо текущих настроек, например, размера шрифта.

Хотя базовая единица groff связана с устройством, она все же может быть меньше наименьшей единицы. Регистр «.H» определяет, сколько базовых единиц groff составляют базовую единицу текущего устройства по горизонтали, а регистр «.V» определяет значение по вертикали.

Модификаторы перечислены ниже. Основные типы измерений: дюйм, сантиметр, пайка (пика), em, en, pt (точка), интервал по вертикали.

«i»

Дюйм. Устаревшая единица измерения, которая до сих пор используется в некоторых странах. Один дюйм определяется как 2,54 см.

«c»

Сантиметр. Один сантиметр ‐ примерно 0,3937 дюйма.

«p»

Точка, pt. Это типографское измерение для указания размера шрифта. По умолчанию 72 точки на дюйм.

«P»

Пайка, пика. Еще один наборный размер, подразумевается 6 пик на дюйм и 12 pt на пайку.

«s»

«z»

Дробные размеры шрифта.

«f»

Дроби. 65536.

Существуют измерения, напрямую зависящие от текущих настроек gtroff. Ниже дается краткий перечень.

«m»

Ems (эм). Единица равна текущему размеру шрифта в пунктах. «Приблизительно» равна ширине буквы «м» в текущем шрифте.

«n»

Ens (эн). Половина em.

«v»

Вертикальное пространство. Эквивалентно текущему межстрочному интервалу. Вертикальный интервал между строками текста по умолчанию зависит от текстового процессора. Для «nroff» это одна шестая дюйма.

«M»

Сотая часть ems.

Единица измерения по умолчанию

Индикатора масштабирования «u». Многие запросы применяют единицу измерения по умолчанию, что может привести к ошибкам в некоторых выражениях. Например, запрос длины строки предполагает использование единицы em.

Ниже несколько попыток получить линию длиной 3,5 дюйма.

3.5i = 3.5i
7/2 = 0i
7/2i = 0i
(7 / 2)u = 0i
7i/2 = 0.1i
7i/2u = 3.5i
Здесь происходит конвертация в базовые единицы. Предполагается, что 1i = 240u, а 1m = 10p (1m = 33u). Значение 7i/2 сначала обрабатывается как 7i/2m, а затем преобразуется в 1680u/66u, что составляет 25u, и приблизительно равно 0,1i. Как видно, индикатор масштабирования после закрывающей скобки просто игнорируется.

Поэтому самый безопасный способ указать размеры — всегда жестко определять индикатор масштабирования. Если вы хотите умножить или разделить на определенное скалярное значение, используйте «u» в качестве единицы измерения значения.

Арифметика, логика, выражения, операторы

Gtroff поддерживает множество арифметических операторов, общих с другими языками программирования.

Арифметика: «+» (сложение), «‐» (вычитание), «/» (деление), «*» (умножение), «%» (по модулю).

Gtroff поддерживает только целочисленную арифметику. Внутренний тип для вычисления результатов «int», обычно это 32‐разрядное целое число со знаком.

Сравнение: «<» (меньше), «>» (больше), «<=» (меньше или равно), «>=» (больше или равно), «=» (равно), «==» (то же, что «=»).

Логические: «&» (логическое «AND»), «:» (логическое «OR»).

Унарные операторы: «‐» (отрицание, т.е. изменение знака), «+» (ничего не делаетв выражениях), «!» (логическое «not»).

Логический оператор not, описанный выше, работает только в запросах «if» и «while». Кроме того, он может стоять в начале выражения, что инвертирует все выражение. Попытка вставить оператор «!» в выражение приводит к выводу предупреждения «ожидается числовое выражение» (для совместимости со старыми версиями «troff»).

.nr X 1
.nr Y 0
.\’’ This does
not work as expected
.if (\n[X])&(!\n[Y]) .nop X only
.
.\’’ Use this construct instead
.if
(\n[X]=1)&(\n[Y]=0) .nop X only
Extrema: «>?» (максимум), «<?» (минимум).

.nr x 5
.nr y 3
.nr z (\n[x] >?
\n[y])
(Регистр «z» будет содержать 5.)

Масштабирование, приоритет: «(«c»; «e». Определяет «e», используя «c» в качестве индикатора масштабирования по умолчанию. Если «с» отсутствует, игнорирует показатель масштабирования приоритета «е».

Скобки применяются так же, как и в любом другом языке программирования. Однако в gtroff они синтаксически необходимы. Gtroff не имеет оператора приоритета, выражения оцениваются слева направо. Это означает, что gtroff оценивает «3+5*4», как если бы оно было заключено в скобки «(3+5)*4».

Для многих запросов, вызывающих перемещение виртуального указателя на странице, унарные операторы «+» и «‐» указывают движение относительно текущего положения (вниз или вверх).

Операторы «+» и «‐» также неоднозначно обрабатываются следующими запросами: «bp», «in», «ll», «lt», «nm», «nr», «pl», «pn», «po», «ps», «pvs», «rt», «ti», «\H», «\R», и «\s». Здесь ведущие знаки плюс и минус указывают на увеличение и уменьшение значений.

Ведущий оператор «|» указывает на абсолютную позицию. Для вертикальных перемещений он указывает расстояние от верхней части страницы; для горизонтальных перемещений дает расстояние от начала входной строки.

• Escape: «\B’anything’»

Возвращает 1, если «anything» является допустимым числовым выражением, или 0, если «anything» не является допустимым числовым выражением или не определен.

Из‐за способа обработки аргументов в выражениях не допускается вставлять пробелы, если только все выражение не заключено в круглые скобки.


** Обратите внимание. Для улучшения восприятия, аргументы отделены от оператора пробелом.

Идентификаторы

Как и любой другой язык, gtroff следует правилам для формирования «идентификаторов». В gtroff идентификатор может состоять из любого печатного символа, за исключением следующих: пробельных символов (пробелы, табуляции и символы новой строки); «backspace» (ASCII «0x08» или EBCDIC «0x16») и код символа «0x01».

Следующие символы недействительны и игнорируются, если groff вызывается в терминале ASCII, также приводят к предупреждающему сообщению: «0x00», «0x0B», «0x0D» «0x1F», «0x80» «0x9F».

Ниже перечислены недопустимые входные символы, если groff работает на хосте EBCDIC: «0x00», «0x08», «0x09», «0x0B», «0x0D» , «0x14», «0x17» «0x1F», «0x30», «0x3F».

В настоящее время некоторые из этих зарезервированных символов применяются как внутренние, что затрудняет работу gtroff в Unicode или набор текста в экзотических кодировках.

Во избежание проблем с препроцессором «refer», имена макросов не должны начинаться с «[» или «]». Из‐за обратной совместимости все символы после «.[» и «.]» обрабатываются как специальный аргумент для «refer». Например, «.[foo» заставляет «refer» начинать ссылку, где «foo» считается параметрром.

• Escape: «\A’ident’»

Последовательность проверяет допустимость идентификатора «ident» в gtroff. Выводит 1 или 0 в зависимости от того, является ли аргумент (заключенный в кавычки) приемлемым в качестве имени строки, макроса, числового регистра, среды или шрифта. Возвращает 0, если аргумент не указан.

\A’end‐list’
= 1
Идентификаторы gtroff могут быть любой длины, но в некоторых контекстах требуется указать, где заканчиваются идентификаторы и начинается текст. Иногда идентификаторы необходимо заключать в скобки «[» и «]». Любой идентификатор может быть заключен в скобки.

В отличие от многих других языков программирования, неопределенные идентификаторы игнорируются. Когда gtroff находит такой идентификатор, он выдает предупреждение, выполняя следующие действия.

1. Если идентификатор является строкой, макросом, ловушкой, gtroff помечает его как пустой.

2. Если идентификатор является числовым регистром, gtroff назначает ему нулевое значение.

Обратите внимание, что макросы, строки, ловушки используют одно пространство имен.

.de xxx
.nop foo
..
.
.di
xxx
bar
.br
.di
.
.xxx
= bar
Как видно из предыдущего примера, gtroff повторно использует идентификатор «xxx», заменяя макрос на перенаправление. Предупреждение не выдается, содержимое первого макроопределения теряется.

Встроенные команды

Документам требуется дополнительное форматирование, помимо заполнения или неявного разрыва строк. Для расширения функциональности gtroff встраивает команды в текст двумя способами.

1. Запрос в начале пустой строки, выполняющий некоторые глобальные операции (например, разрыв строк, начало новой страниц).

2. «Экранирование» можно вставить в любом месте текста; большинство запросов применяет экранирование даже в качестве аргумента. Экранирование обычно выполняет мелкие операции, такие как обработка нижних и верхних регистров, печать символов и т.д.

Встроенные запросы

Строка запроса начинается с управляющего символа. Символ может быть либо одинарной кавычкой («’», неразрывный управляющий символ), либо точкой («.», обычный управляющий символ). Допускается программно переназначать символы.

Поскольку управляющий символ, за которым следует пробел, игнорируется, общепринятой практикой считается использование этой функции для структурирования исходного кода документов или пакетов макросов.

.de foo
. tm
This is foo.
..
.
.de bar
. tm
This is bar.
..
Так же можно применить запрос «blm», назначив ему пустой макрос.

.de do‐nothing
..
.blm do‐nothing \’’ activate blank line macro
.de foo
. tm
This is foo.
..
.de bar
. tm
This is bar.
..
.blm \’’ deactivate blank line macro
Чтобы начать строку с управляющего символа без интерпретации, поставьте в начале «\&».

В большинстве случаев именно точка применяется как управляющий символ. Также несколько запросов неявно вызывают разрыв, но применение управляющего символа одинарной кавычки предотвратит его.

• Register: «\n[.br]»

Здесь «\n[.br]» числовой регистр только для чтения, он устанавливается как 1, если макрос вызывается с обычным управляющим символом (как определено в запросе «cc»), в противном случае значение регистра 0.

Пример качественной модификации запросов.

.als bp*orig bp
.de bp
. tm before bp
. ie \n[.br] .bp*orig
. el ’bp*orig
. tm after bp
..
Применение регистра «.br» вне макроса не имеет смысла, потому что всегда возвращается нулевое значение.

Если макрос вызывается как строка (то есть «\*»), значение регистра «.br» наследуется до вызова.

Аргументы макросов и запросов

Аргументы запросов и макросов обрабатываются так же, как аргументы командной строки: строка разбивается с помощью пробелов.

Множественные аргументы макросов следует заключать в двойные кавычки, либо пробелы должны быть экранированы обратной косой чертой. Это не касается запросов.

.uh The Mouse Problem
.uh "The Mouse
Problem"
.uh The\ Mouse\ Problem
Здесь первая строка ‐ макрос «uh», вызываемый с тремя аргументами: «The», «Mouse» и «Problem». Последние два дают тот же эффект, что и вызов макроса «uh» с одним аргументом «The Mouse Problem».

Двойные кавычки, если им не предшествует пробел, не запускают аргумент макроса. Если строка не закрывается, она выводится без изменений.

.xxx a" "b c" "de"fg"
Здесь аргументы «a», «b c», «de», и «fg» приводят к неявному поведению, таких случаев следует избегать.

Чтобы правильно оформить аргументы, следует руководствоваться простыми правилами.

Например, заключите все аргументы в двойные кавычки. Недостатком такого традиционного решения является то, что двойные кавычки могут привести к некоторым проблемам в режиме совместимости (опция «‐C» команды groff):

.de xx
. tm xx: \’ \’ \’
..
.xx A "test with ""quotes""" .
= xx: test with
"quotes"’ A’ quotes""’
Если режим совместимости отсутствует, вы получите ожидаемый результат.

xx: test with "quotes"’ A’ .’
Можно также использовать глиф двойной кавычки «\(dq». Прием работает как с включенным режимом совместимости, так и без него, поскольку gtroff не преобразует «\(dq» в двойные кавычки.

Обратите внимание, что этот метод не будет работать в некоторых версиях Unix, так как глиф «dq» не определен во всех системах.

Встроенные макросы

При работе с программой gtroff есть возможность создавать макросы для определения последовательности строк. Макросы вызываются по имени, как аргументы запроса.

Экранирование

Экраны могут применяться в любом месте входа gtroff. Обычно они начинаются с обратной косой черты с одним символом, указывающим на выполняемую функцию. Экранирующий символ можно изменить.

Escape‐последовательности, требующие идентификатора в качестве параметрра, допускают три формы синтаксиса.

1. Одиночный символ считается идентификатором.

2. Если единственный символ является открывающей скобкой, следующие два символа будут идентификатором. Обратите внимание, что после идентификатора нет закрывающей скобки.

3. Если единственный символ является открывающей скобкой, в качестве идентификатора берутся все символы до закрывающей скобки.

\fB
\n(XX
\*[TeX]
Некоторые escape‐последовательности могут потребовать нескольких аргументов и/или специального синтаксиса. В таких случаях аргумент традиционно заключают в одинарные кавычки.

\l’1.5i\(bu’
Обратите внимание, что кавычки можно заменить любым другим символом, не встречающимся в аргументе, даже символом новой строки или пробелом. Это касается следующих escape‐последовательностей: «\o», «\b», «\», «\X».

A caf
\o
e\’
in Paris
= A caf\xE9 in Paris
Следующие управляющие последовательности обрабатываются аналогично символам, поскольку не принимают параметрров, они также разрешены в качестве разделителей: «\%», «\», «\|», «\^», «\{», «\}», «\’», «\‘», «\‐», «\_», «\ !», «\?», «\)», «\/», «\,», «\&», «\:», «\~», «\0», «\a», «\c», «\d», «\e», «\E», «\p», «\r», «\t», and «\u».

Не используйте их, если это возможно.

Символы новой строки в качестве разделителей не допускаются в escape‐последовательностях «\A», «\B», «\Z», «\C» и «\w».

Наконец, в последовательностях «\D», «\h», «\H», «\l», «\L», «\N», «\R», «\s», «\S», «\v» и «\x» не могут использоваться в качестве разделителей цифры 0‐9, односимвольные операторы +‐/*%<>=&:()., пробел, табуляция и символы новой строки, все управляющие последовательности, кроме «\%», «\:», «\{», «\}», «\’», «‘‘», «\‐», «\_», «\ !», «\/», «\c», «\e» и «\p».

Чтобы в выводе отображалась обратная косая черта (текущий экранирующий символ), определено несколько escape‐символов: «», «\e» или «\E». Они похожи и отличаются только тем, как используются в макросах.

Комментарии

Комментарий это форма экранирования.

• Escape: «\’’»

Последовательность начинает комментарий. Текст до конца строки ввода игнорируется.

Если escape‐последовательность находится справа от какого‐либо текста или запроса, эта часть строки игнорируется.

Одна из особенностей комментариев заключается в том, что нельзя использовать вкладки для выравнивания комментариев.

Комментарий рассматривается как пустая строка.

Test
\’’ comment
Test
Иногда применяют три последовательные одинарные кавычки ( «’’’») в начале строки для создания комментария. В этом случае gtroff выдает предупреждение о неопределенном макросе.

• Escape: «\’’»

В программе gtroff существует механизм комментариев с экранированием «\». Экран работает так же, как «\’’», при этом новая строка игнорируется.

Test
\# comment
Test
• Request: «.ig» [end]

Запрос применяется как комментарий к большому блоку текста.

Запрос игнорирует все вводимые данные до тех пор, пока gtroff не встретит макрос «.» или «end» на отдельной строке (или «..», если «end» не указан).

text text text...
.ig
This is part of
a large block
of text that has been
temporarily(?) commented
out.
We can restore it simply by removing
the .ig request
and the ".." at the
end of the block.
..
More text text
text...
Обратите внимание, что закомментированный блок текста не приводит к разрыву строки. Ввод также читается в режиме копирования, автоинкрементные регистры изменяются.

Числовые регистры

Числовые переменные в gtroff называются регистрами. Существует ряд встроенных регистров, предоставляющих, например, параметрры форматирования, день, месяц, год и т.д.

Установка регистров

Определить или установить регистры можно с помощью запроса «nr» или escape‐последовательности «\R». Применение неопределенного регистра приведет к его обнулению.

• Request: «.nr» ident value

• Escape: «\R’ident value’»

Запрос установит числовой регистр «ident» в «value». Если «ident» не существует, gtroff создает его.

Аргумент «\R» обычно заключают в кавычки. «\R» не создает входной токен в gtroff; другими словами, он полностью исчезает после того, как gtroff его обработает.

Например, следующие две строки эквивалентны.

.nr b (((17 + (3 * 4))) % 4)
\nb
\R’a (((17 + (3 * 4))) % 4)’
= 1
\na
Обратите внимание, полная прозрачность «\R» может вызвать неожиданные эффекты, если вы используете числовые регистры, такие как «.k».

.ll 1.6i
.
aaa bbb ccc ddd eee fff ggg
hhh\R’:k \n[.k]’
.tm :k == \n[:k]
= :k ==
126950
.
.br
.
aaa bbb ccc ddd eee fff ggg
hhh\h’0’\R’:k \n[.k]’
.tm :k == \n[:k]
= :k == 15000
Если обработка происходит на устройстве POSTSCRIPT (‐Tps), после «ggg» в обеих строках ввода будет разрыв строки. Однако после обработки пробела «ggg» частично собранная строка еще не заполнена, поэтому troff продолжает собирать ввод, пока не встретит пробел (или новую строку) после «hhh». Затем линия разрывается.

И «nr», и «\R» имеют две специальные формы для увеличения или уменьшения значений регистра.

• Request: «.nr» ident + value

• Request: «.nr» ident ‐ value

• Escape: «\R’» ident + value

• Escape: «\R’» ident ‐ value

Здесь увеличивается (уменьшается) регистр «ident» на «value».

.nr a 1
.nr a +1
\na
= 2
Присвоить инвертированное значение регистра другому регистру.

.nr a 7
.nr b 3
.nr a ‐\nb
\na
= 4
.nr a (‐\nb)
\na
= ‐3
Круглые скобки не позволяют интерпретировать знак минус как оператор уменьшения.

Альтернативой считается форма «0».

.nr a 7
.nr b ‐3
.nr a \nb
\na
= 4
.nr a 0\nb
\na
= ‐3
• Request: «.rr» ident

Запрос удалит регистр с номером «ident». Если «ident» не существует, запрос игнорируется.

• Request: «.rnn» ident1 ident2

Переименование регистра с номером «ident1» в «ident2». Если «ident1» или «ident2» не существует, запрос игнорируется.

• Request: «.aln» ident1 ident2

Создает псевдоним «ident1» для номерного регистра «ident2». Новое и старое имена полностью эквивалентны. Если «ident1» не определен, выводится предупреждение «reg» и запрос игнорируется.

Интерполяция регистров

К числовым регистрам можно получить доступ через escape‐последовательность «\n».

• Escape: «\n» i

• Escape: «\n(» id

• Escape: «\n[ident]»

Здесь происходит интерполяция числового регистра с именем «ident» (односимвольное имя «i», двухсимвольное «id»). Значение регистра изменяется, пока gtroff анализирует входную строку. Возможны вложенные значения (также называемые косвенными назначениями).

.nr a 5
.nr as \na+\na
\n(as
= 10
.nr a1 5
.nr ab 6
.ds str b
.ds
num 1
\n[a\n[num]]
= 5
\n[a\*[str]]
= 6

Регистры, автоинкремент

Значения числовых регистров могут автоматически увеличиваться или уменьшаться. Значение приращения или уменьшения может быть указано третьим аргументом в запросе «nr» или как «\R».

• Request: «.nr» ident value incr

Запрос установит числовой регистр «ident» в «value»; приращение для автоматического увеличения установлено на «incr». Обратите внимание, что escape‐последовательность «\R» не поддерживает нотацию.

Чтобы активировать автоинкремент, последовательность «\n» предоставляет специальную синтаксическую форму.

• Escape: «\n+i»

• Escape: «\n‐i»

• Escape: «\n+(id»

• Escape: «\n‐(id»

• Escape: «\n+[ident]»

• Escape: «\n‐[ident]»

Перед интерполяцией увеличивается или уменьшается «ident» (односимвольное имя «i», двухсимвольное имя «id») на значение автоинкремента, указанное в запросе «nr» (или «\R»). Если значение автоинкремента не определено, форма синтаксиса идентична «\n».

.nr a 0 1
.nr xx 0 5
.nr foo 0 ‐2
\n+a, \n+a, \n+a, \n+a, \n+a
.br
\n‐(xx, \n‐(xx, \n‐(xx, \n‐(xx, \n‐(xx
.br
\n+[foo], \n+[foo], \n+[foo],
\n+[foo], \n+[foo]
1, 2, 3, 4, 5
‐5, ‐10, ‐15, ‐20, ‐25
‐2, ‐4, ‐6, ‐8, ‐10
Чтобы изменить значение приращения без изменения значения регистра, допускается использовать такую форму.

.nr a \na 10

Переопределение форматов

Форматы вывода можно изменить (например, на римские цифры), с помощью запроса «af».

• Request: «.af» ident format

Это запрос формата вывода числового регистра. Аргумент «ident» содержит имя изменяемого числового регистра, аргумент «format» определяет выходной формат.

Доступны следующие форматы вывода.

«1»

Десятичные арабские числа. Формат по умолчанию: 0, 1, 2, 3, ...

«0»

Десятичные числа с заданным количеством цифр. Таким образом, выводятся числа 01, 02, 03, ...

Можно назначить любую цифру вместо нуля: gtroff считывает лишь сколько цифр указано. Как следствие, формат по умолчанию «af 1» также может быть указан как «0» (возвращается escape‐кодом «\g»).

«I»

Прописные римские цифры: 0, I, II, III, IV, ...

«i»

Строчные римские цифры: 0, i, ii, iii, iv, ...

«A»

Заглавные буквы: 0, A, B, C, ... Z, AA, AB, ...

«a»

Строчные буквы: 0, a, b, c, ... z, aa, ab, ...

Пропуск формата числового регистра вызовет программное предупреждение.

.nr a 10
.af a 1 \’’ the default
format
\na,
.af a I
\na,
.af a a
\na,
.af a 001
\na
Наибольшее число, которое может быть представлено для форматов «i» и «I», равно 39999 (или ‐39999); troff Unix использует «z» и «w» для представления 10000 и 5000 римскими цифрами, то же самое делает gtroff. В настоящее время правильные глифы римской цифры пять тысяч и римской цифры десять тысяч (код Юникода «U+2182» и «U+2181» соответственно) недоступны.

Изменение выходного формата регистра, если он доступен только для чтения, вызывает ошибку. Необходимо сначала скопировать значение регистра в доступный для записи регистр, а затем применить запрос «af» к этому регистру.

• Escape: «\gi»

• Escape: «\g(id»

• Escape: «\g[ident]»

Последовательность возвращает текущий формат указанного регистра «ident» (односимвольное имя «i», двухсимвольное «id»).

Встроенные регистры

Ниже перечислены некоторые встроенные регистры, не описанные в других разделах данного руководства.

Любой регистр, начинающийся с «.», доступен только для чтения. Полный список всех встроенных регистров можно найти в указателе регистров.

«\n[.F]»

Строковый регистр возвращает текущее имя входного файла.

«\n[.H]»

Количество базовых единиц на горизонтальную единицу разрешения устройства вывода.

«\n[.R]»

Число доступных регистров. Всегда 10000 в GNU troff, регистр определен для обратной совместимости.

«\n[.U]»

Если gtroff вызывается с параметрром командной строки «‐U» для активации небезопасного режима, числовой регистр «.U» устанавливается как 1, в противном случае 0.

«\n[.V]»

Количество базовых единиц на вертикальную единицу разрешения устройства вывода.

«\n[seconds]»

Количество секунд в минуте, обычно в диапазоне от 0 до 59, но может быть до 61, чтобы учесть дополнительные секунды. Инициализируется при запуске gtroff.

«\n[minutes]»

Количество минут, диапазон от 0 до 59. Инициализируется при запуске gtroff.

«\n[hours]»

Количество часов после полуночи в диапазоне от 0 до 23. Инициализируется при запуске gtroff.

«\n[dw]»

День недели.

«\n[dy]»

День месяца.

«\n[mo]»

Текущий месяц.

«\n[year]»

Текущий год.

«\n[yr]»

Текущий год определен как 1900. К сожалению, 7 версия troff имела ошибку 2000 года: неверно утверждалось, что «yr» содержит две последние цифры года.

’\’’ The following line stopped working after 1999
This document was formatted in 19\n(yr.
Ошибку можно исправить следующим образом.

This document was formatted in \n[year].
.nr y4 1900+\n(yr
This document was
formatted in \n(y4.
«\n[.c]»

«\n[c.]»

Текущий номер входной строки. Регистр «.c» доступен только для чтения, в то время как «c.» (расширение gtroff) доступен для записи, но затрагивает «.c» и «c.».

«\n[ln]»

Текущий выходной номер строки после вызова запроса активации нумерации строк («nm»).

«\n[.x]»

Номер основной версии. Например, если номер версии 1.03, то «.x» содержит «1».

«\n[.y]»

Дополнительный номер версии. Например, если номер версии 1.03, то «.y» содержит «03».

«\n[.Y]»

Номер ревизии groff.

«\n[8396]»

Идентификатор процесса gtroff.

«\n[.g]»

Значение всегда 1. Позволяет макросам определить, работают ли они под GNU troff.

«\n[.A]»

Если параметрр командной строки «‐a» используется для получения аппроксимации ASCII вывода, регистр устанавливается в 1, в противном случае 0.

«\n[.O]»

Доступный только для чтения регистр установлен на уровень вложенности подавления (см. escape‐последовательность «\O»).

«\n[.P]»

Этот регистр устанавливается как 1 (в противном случае 0), если текущая страница фактически печатается, т.е. если используется опция «‐o» для печати выбранных страниц.

«\n[.T]»

Если gtroff вызывается с параметрром командной строки «‐T», числовой регистр «.T» устанавливается как 1, в противном случае 0.

«\*[.T]»

Строковый регистр чтения‐записи, содержащий текущее устройство вывода (например, «latin1» или «ps»). Единственный строковый регистр, определяемый gtroff.

Корректировка и наполнение

5.7 Manipulating Filling and Adjusting

Запрос «br» вызывает явный разрыв. Некоторые запросы разрывают строку неявно, это касается запросов «bp», «ce», «cf», «fi», «fl», «in», «nf», «rj», «sp», «ti», и «trf».

• Request: «.br»

Разрыв текущей строки, т.е. собранный до сих пор ввод выдается без корректировки.

Если применяется управляющий символ без разрыва, gtroff подавляет разрыв.

a
’br
b
= a b
Программа gtroff заполняет и корректирует текст на обоих полях. Заполнение можно отключить запросом «nf» и включить запросом «fi».

• Request: «.fi»

• Register: «\n[.u]»

Запросы активируют режим заполнения (по умолчанию установлен). Запрос неявно разрешают настройку; также вставляется разрыв в текст, который в настоящее время заполняется. Доступный только для чтения числовой регистр «.u» установлен в 1.

Статус режима заполнения связан с текущей средой.

• Request: «.nf»

Запрос включает режим заполнения. Входные строки выводятся как есть, с сохранением разрывов строк, игнорированием текущей длины строки. Регистр «.u» установлен в 0.

Статус режима заполнения связан с текущей средой.

• Request: «.ad» [mode]

• Register: «\n[.j]»

Режим настройки. Активация и деактивация настройки производится неявно вызовами запросов «fi» или «nf».

Параметр «mode» может принимать одно из следующих значений.

«l»

Выравнивает текст по левому полю (рваный текст).

«r»

Форматирует текст до правого поля, создавая неровный левый отступ.

«c»

Текст с заполнением и центрированием, отличается от запроса «ce», который только центрирует текст без заполнения.

«b»

«n»

Выравнивание по ширине по обоим полям. Значение по умолчанию для программы gtroff.

Наконец, «mode» может быть числовым аргументом, возвращаемым регистром «.j».

Применение «ad» без аргумента равносильно тому, чтобы написать «.ad \[.j]». В частности, gtroff корректирует линии так же, как это было до деактивации форматирования (например, с помощью «na»).

.de AD
. br
. ad \
..
.
.de NA
. br
. na
..
.
textA
.AD r
.nr ad \n[.j]
textB
.AD c
textC
.NA
textD
.AD \’’ back to centering
textE
.AD \n[ad] \’’ back to right justifying
textF
textA
textB
textC
textD
textE
textF
Текущий режим настройки доступен в числовом регистре только для чтения «.j»; значение можно сохранить и впоследствии применять.

Статус режима настройки связан с текущим окружением.

• Request: «.na»

Отключает настройку. Запрос не изменит текущий режим: последующий вызов «ad» использует предыдущую настройку.

Состояние режима настройки связано с окружением.

• Request: «.brp»

• Escape: «\p»

Разрыв, корректировка текущей строки в соответствии с текущим режимом настройки.

Если применить «\p», разрыв произойдет на границе следующего слова. Последовательность «\p» полностью удаляется, не добавляя ни разрыва, ни пробела там, где появляется во вводе. Таким образом, последовательность можно поместить в середине слова, чтобы вызвать разрыв в конце.

К сожалению, часто это приводит к некрасивому форматированию, поскольку gtroff не имеет сложного алгоритма построения абзаца. Программа gtroff заполняет и корректирует абзац построчно.

This is an uninteresting sentence.
This is
an uninteresting sentence.\p
This is an uninteresting sentence.
• Request: «.ss» word_space_size [sentence_space_size]

• Register: «\n[.ss]»

• Register: «\n[.sss]»

Меняется размер пробела между словами. Пробел принимает единицы измерения, равные одной двенадцатой ширины пробела для текущего шрифта. По умолчанию и «word_space_size», и «sentence_space_size» равны 12. В режиме заполнения значения определяют минимальное расстояние.

Если для запроса «ss» задано два аргумента, второй аргумент устанавливает размер предложения. Если второй аргумент не указан, размер пространства предложения устанавливается равным «word_space_size».

Размер интервала предложения используется в двух случаях: если конец предложения находится в конце строки в режиме заполнения, то добавляются как пробел между словами, так и пробел предложения; если два пробела следуют за концом предложения в середине строки, то второй пробел является пробелом предложения.

Если в запрос «ss» не передается второй аргумент, то программа troff Unix ведет себя так же, как troff GNU. В GNU troff за предложением всегда должен следовать либо символ перевода строки, либо два пробела.

Числовые регистры «.ss» и «.sss», доступные только для чтения, содержат значения параметрров, заданных первым и вторым аргументом запроса «ss».

Значения пространства слов и предложений связаны с текущей средой.

В отличие от troff AT&T, запрос не игнорируется, если используется устройство вывода TTY, заданные значения округляются до числа, кратного 12.

Запрос игнорируется, если нет параметрра.

Полезное применение запроса «ss» — вставка отбрасываемого горизонтального пробела, т.е. пробела, который удаляется при разрыве строки.

Например, сноски на странице можно форматировать следующим образом.

.ll 4.5i
1.\ This is the first
footnote.\c
.ss 48
.nop
.ss 12
2.\ This
is the second footnote.
1. This is the first footnote. 2. This
is
the second footnote.
Обратите внимание, escape‐последовательность «\h» создает неразрывное пространство.

• Request: «.ce» [nnn]

• Register: «\n[.ce]»

Запросы центрирует текст. Хотя запрос «.ad c» также центрирует текст, форматирование проводится с заполнением строки. Запрос «ce» не заполняет строку, но вызывает разрыв. Количество строк центрирования связано с текущим окружением.

Следующий пример демонстрирует различия между разными запросами центрирования.

.ll 4i
.ce 1000
This is a small text
fragment that shows the differences
between the .ad c’ request.
.ce 0
.ad c
This is a small text fragment that shows the
differences
between the .ad c’ request.
Без аргументов «ce» центрирует следующую строку текста, «nnn» указывает количество строк, которые должны быть центрированы. Если аргумент равен нулю или отрицателен, центрирование считается отключенным.

Длина выравнивания текста по центру — это длина строки минус отступ. Временный отступ игнорируется. Длина строки задается запросом «ll», отступ запросом «in».

Общепринятой практикой является включение выравнивания по центру для большого количества строк. Это полезно для любого запроса, который принимает несколько строк в качестве аргумента.

Числовой регистр «.ce», доступный только для чтения, содержит количество строк центрирования, как указано в запросе «ce».

• Request: «.rj» [nnn]

• Register: «\n[.rj]»

Выравнивается незаполненный текст по правому краю. Аргументы идентичны запросу «ce». Числовой регистр «.rj», доступный только для чтения, содержит количество строк, которые необходимо выровнять по правому краю. Запрос вызывает разрыв строки. Количество строк выравнивания связано с текущей средой.

Управление переносами слов

Следующие запросы влияют на расстановку переносов.

• Request: «.hy» [mode]

• Register: «\n[.hy]»

 Запросы включают перенос. Есть необязательный числовой аргумент «mode» для ограничения расстановки переносов, если это необходимо.

«1»

Аргумент по умолчанию, если «mode» опущен переносы включены, первый и последний символы слова не переносятся.

«2»

Не переносит на другую строку последнее слово на странице или в столбце.

«4»

Не переносит два последних символа слова.

«8»

Не переносит первые два символа слова.

«16»

Разрешает перенос перед последним символом слова.

«32»

Допускает перенос после первого символа слова.

Значения в предыдущей таблице считаются аддитивными. Например, значение 12 заставляет gtroff не переносить ни два последних, ни два первых символа слова. Обратите внимание, что значение 13 сделает то же самое; другими словами, значение 1 не нужно добавлять, если значение больше 1.

Некоторые значения нельзя использовать вместе, потому что они противоречивы. Например, значения 4 и 16 или 8 и 32.

Количество символов в начале слова, после которого должна быть вставлена первая точка переноса, определяется шаблонами; количество нельзя уменьшить без введения дополнительных недопустимых точек переноса. То же самое относится и к количеству символов в конце слова перед вставкой последней точки переноса.

.ll 1
.hy 48
splitting
s‐
plit‐
t‐
in‐
g
Правила переноса для американского и английского языков требуют двух символов в начале и трех символов в конце; поэтому значение 4 параметрра «hy» считается обязательным. В качестве дополнительного ограничения возможно значение 8, но следует избегать значений 1 (по умолчанию!), 16 и 32.

Исключения при расстановке переносов в файлах шаблонов (т.е. слова в группе «\hyphenation») подчиняются ограничениям на расстановку переносов, заданным «hy». Однако исключения, указанные с помощью «hw», этого не делают.

Текущие ограничения на расстановку переносов можно найти в доступном только для чтения числовом регистре «.hy».

Режим переноса связан с текущей средой.

• Request: «.nh»

Отключает расстановку переносов (нулевой режим). Связан с текущей средой.

• Request: «.hlm» [nnn]

• Register: «\n[.hlm]»

• Register: «\n[.hlc]»

Определеятся максимальное количество последовательных строк с переносом на «nnn». Если число отрицательное, то максимума нет. Значение по умолчанию ‐1, если «nnn» опущен. Значение связано с текущей средой. Только строки, выводимые данной среды, учитываются в максимальном количестве. Учитываются дефисы, полученные от «\%», но не учитываются явные дефисы.

Текущая настройка «hlm» доступна в числовом регистре только для чтения «.hlm». Также число непосредственно предшествующих последовательных строк через дефис доступно в регистре только для чтения «.hlc».

• Request: «.hw» word1 word2 ...

Запрос определит, как следует расставлять дефисы в словах «word1», «word2» и т.д. Слова должны содержать дефисы.

.hw in‐sa‐lub‐rious
Помимо символа пробела, для разделения аргументов «hw» можно применять любой символ, код дефиса которого равен нулю. Кроме того, запрос можно использовать более одного раза.

Точки переноса, указанные с помощью «hw», не подпадают под ограничения, указанные в запросе «hy».

Исключения для запроса «hw» связаны с текущим языком расстановки переносов.

Запрос игнорируется, если нет параметрра.

• Escape: «\%»

• Escape: «\:»

Чтобы сообщить gtroff, как расставлять слова на лету, используйте escape‐последовательность «\%» (также известную как символ переноса). Если перед словом стоит этот символ, оно не будет переноситься через дефис; но если последовательность внутри слова, в этом месте слово может быть перенесено. Обратите внимание, что этот механизм влияет только на одно вхождение слова. Чтобы изменить перенос слова для всего документа, используйте запрос «hw».

Эскейп «\:» вставляет точку разрыва нулевой ширины (то есть слово разрывается, но без дефиса).

• Request: «.hc» [char]

Изменяется символ дефиса на «char». Этот символ будет подобен escape‐последовательности «\%», и поэтому больше не выводится. Без аргумента «hc» сбрасывает символ переноса на «\%» (по умолчанию).

Символ дефиса связан с текущей средой.

• Request: «.hpf» pattern_file

• Request: «.hpfa» pattern_file

• Request: «.hpfcode» a b [ c d ... ]

Считывает файл шаблонов переносов. Файл ищется так же, как «name.tmac» (или «tmac.имя»), если указана опция «‐m name».

Он должен иметь тот же формат, что и (простые) файлы шаблонов TeX. В частности, реализованы следующие правила сканирования.

Знак процента начинает комментарий до конца строки, даже если предшествует обратная косая черта.

Нет поддержки графов типа «$».

Признаются команды «^^ xx» («x» равно 0‐9 или a f) и «^^ x» (символьный код «x» в диапазоне 0‐127), но иное использование «^» вызывает ошибку.

Нет расширения макроса.

Также «hpf» проверяет выражение «\patterns{}» (возможно, с пробелами до и после фигурных скобок). Все, что находится между фигурными скобками, воспринимается как расстановка переносов. Следовательно, «{» и «}» не допускаются в шаблонах.

Аналогично, «\hyphenation{...}» дает список исключений при расстановке переносов.

Также можно применять «\endinput».

Для обратной совместимости, если «\patterns» отсутствует, весь файл рассматривается как список шаблонов переноса (но символ «%» распознается как начало комментария).

Если запрос «hpf» не указан (ни в документе, ни в пакете макросов), gtroff не будет расставлять переносы.

Запрос «hpfa» добавляет файл шаблонов к текущему списку.

Запрос «hpfcode» определяет значения сопоставления для кодов символов в шаблонах переносов. Аргументы ‐ пары кодов символов, целые числа от 0 до 255. Запрос сопоставляет код символа «a» с кодом «b», код «c» с кодом «d» и так далее. Вы можете использовать коды символов, которые в противном случае были бы недействительными. По умолчанию ничто не сопоставляется, кроме букв от «A» до «Z», которые сопоставляются от «a» до «z».

Набор шаблонов переноса связан с текущим языком, заданным запросом «hla». Запрос «hpf» обычно вызывается файлом «troffrc» или «troffrc‐end»; по умолчанию «troffrc» загружает шаблоны переносов и исключений для американского варианта английского языка (файлы «hyphen.us» и «hyphenex.us»).

Второй вызов «hpf» (для того же языка) заменяет шаблоны переносов новыми.

Вызов «hpf» вызывает ошибку, если на указан текущий язык переносов.

• Request: «.hcode» c1 code1 [ c2 code2 ... ]

Установит код переноса символа «c1» на «code1», код переноса «c2» на «code2» и т.д. Код переноса должен быть одним входным символом (не специальным), отличным от цифры.

Чтобы расстановка переносов работала, необходимо ее настроить. При запуске groff присваивает коды переноса только буквам «a‐z» (сопоставляются сами с собой) и буквам «A‐Z» (сопоставляются с a‐z); все остальные коды переноса устанавливаются равными нулю. Обычно шаблоны переносов содержат только строчные буквы, которые следует применять независимо от регистра. Другими словами, слова FOO и Foo должны писаться через дефис точно так же, как пишется через дефис слово foo, и для этого хорошо подходит «hcode». Слова, которые содержат другие буквы, не будут переноситься должным образом, если соответствующие шаблоны переноса действительно содержат их. Например, следующие запросы «hcode» необходимы для присвоения кодов переноса буквам «\xC4\xE4\xD6\xF6\xDC\xFC\xDF» (для немецкого языка).

.hcode \xE4 \xE4 \xC4 \xE4
.hcode \xF6 \xF6 \xD6 \xF6
.hcode
\xFC \xFC \xDC \xFC
.hcode \xDF
\xDF
Без присвоений groff обрабатывает немецкие слова, такие как «Kinderg\xE4rten» (форма множественного числа от «детский сад»), как две подстроки «kinderg» и «rten», потому что код переноса умлаута по умолчанию равен нулю.

Запрос игнорируется, если не имеет параметрров.

• Request: «.hym» [length]

• Register: «\n[.hym]»

Установит (правое) поле переноса на «length». Если текущий режим отличен от «b» или «n», строка не переносится, если она короче «length». Без аргумента поле для переноса сбрасывается до значения по умолчанию, равного 0. Индикатор масштабирования для запроса «m». Поле для переноса связано с текущей средой.

Отрицательный аргумент сбрасывает поле для переноса на ноль, выдавая предупреждение типа «range».

Текущее поле для переноса записывается в числовой регистр «.hym», доступный только для чтения.

• Request: «.hys» [hyphenation_space]

• Register: «\n[.hys]»

Задает для расстановки переносов значение «hyphenation_space». Если текущий режим корректировки «b» или «n», не переносит строку. Без аргумента пространство для переноса устанавливается на значение по умолчанию, равное 0. Индикатор масштабирования для запроса «m». Пространство для переноса связано с текущей средой.

Отрицательный аргумент сбрасывает пространство для переноса на ноль, выдавая предупреждение типа «range».

Текущее место для расстановки переносов доступно в числовом регистре «.hys», доступном только для чтения.

• Request: «.shc» [glyph]

Установите «soft hyphen character» на «glyph». Если аргумент опущен, символ мягкого переноса устанавливается на глиф «\(hy». Символ мягкого переноса (дефиса) — это глиф, который вставляется, когда слово переносится после разрыва строки. Если символ мягкого переноса отсутствует в шрифте символа, непосредственно предшествующего потенциальной точке разрыва, то строка не нарушается ни запросами char, ни tr.

• Request: «.hla» language

• Register: «\n[.hla]»

Установит текущий язык переноса «language». Исключения расстановки переносов, указанные в запросе «hw», и шаблоны переносов, указанные в запросах «hpf» и «hpfa», связаны с текущим языком расстановки переносов. Запрос «hla» обычно вызывается файлами «troffrc» или «troffrc‐end»; «troffrc» устанавливает язык по умолчанию «us».

Текущий язык расстановки переносов указан в регистре «.hla», доступном только для чтения.

.ds curr_language \n[.hla]
\*[curr_language]
= us

Управление пространством

• Request: «.sp» [distance]

Запрос определяет пространство вниз «distance». Без аргумента продвигает указатель на 1 строку. Отрицательный аргумент заставляет «gtroff» двигаться вверх по странице на указанное расстояние. Если аргументу предшествует «|», то «gtroff» перемещается от верха страницы. Запрос вызывает разрыв строки и добавляет текущий межстрочный интервал к только что указанному пространству. Индикатор масштабирования по умолчанию «v».

Вызов «.y‐from‐bot‐up 10c» означает, что следующая строка будет в 10 см. от края бумаги внизу.

Если вертикальная ловушка срабатывает во время выполнения «sp», значения вертикального пространства сбрасываются.

.de xxx
..
.
.wh 0 xxx
.
.pl 5v
foo
.sp 2
bar
.sp 50
baz
Количество отброшенного пространства доступно в числовом регистре «.trunc».

Для защиты «sp» от вертикальных ловушек используйте запрос «vpt».

.vpt 0
.sp ‐3
.vpt 1
• Request: «.ls» [nnn]

• Register: «\n[.L]»

Запрос выводит «nnn» пустых строк после каждой строки текста. Без аргумента gtroff использует предыдущее значение перед последним вызовом «ls».

.ls 2 \’’ This causes double‐spaced output
.ls 3 \’’ This causes triple‐spaced output
.ls \’’
Again double‐spaced
Междустрочный интервал связан с текущей средой.

Числовой регистр «.L», доступный только для чтения, содержит текущую настройку межстрочного интервала.

• Escape: «\x’spacing’»

• Register: «\n[.a]»

Иногда требуется дополнительное расстояние по вертикали, например, чтобы оставить место для уравнения. Последовательность «\x» определит такое расстояние. Экранированию присваивается числовой аргумент, обычно заключенный в кавычки (например, «\x’3p’»); индикатор масштабирования по умолчанию «v». Если число положительное, под текущей строкой вставляется дополнительный вертикальный пробел. Отрицательное число добавляет пространство выше. Если экран используется несколько раз в одной и той же строке, используется максимальное значение.

Числовой регистр «.a», доступный только для чтения, содержит самый последний (неотрицательный) дополнительный пробел по вертикали.

Использование «\x» может быть необходимо в сочетании с экранированием «\b», как показано в следующем примере.

This is a test with the \[rs]b escape.
.br
This is a test with the \[rs]b escape.
.br
This
is a test with \b’xyz’\x’‐1m’\x’1m’.
.br
This
is a test with the \[rs]b escape.
.br
This is a test with
the \[rs]b escape.
• Request: «.ns»

• Request: «.rs»

• Register: «\n[.ns]»

Запросы включают режим без пробелов. В этом режиме отступы отключены. Запрос «bp» также отключен, за исключением случаев, когда он сопровождается номером страницы). Режим отключается, когда выводится фактический текст или встречается запрос «rs». Доступный только для чтения числовой регистр «.ns» устанавливается в 1 до тех пор, пока режим активен.

Запрос полезен для макросов, которые вставляют вертикальный пробел перед началом текста (например, макрос абзаца может вставлять пробел, за исключением случаев, когда это первый абзац после заголовка раздела).

Поля и табуляция

Символ табуляции (ASCII символ 9, EBCDIC символ 5) вызывает горизонтальное перемещение к следующей позиции табуляции, как это происходит на пишущей машинке.

• Escape: «\t »

Этот escape‐символ является неинтерпретируемым символом табуляции. В режиме копирования «\t» соответствует реальному символу табуляции.

• Request: «.ta» [n1 n2 nn «T» r1 r2 rn]

• Register: «\n[.tabs]»

Запрос изменит позицию табулятора. Принимает ряд спецификаторов табуляции в качестве аргументов (необязательно разделенных на две группы буквой «T»), которые указывают, где должна быть каждая позиция табуляции. При этом переопределяются любые предыдущие настройки.

Позиции табуляции могут быть указаны абсолютно, т.е. как расстояние от левого поля. Например, здесь устанавливаются 6 позиций табуляции через каждый дюйм.

.ta 1i 2i 3i 4i 5i 6i
Позиции табуляции также можно указывать с помощью знака «+», в данном случае указанная позиция устанавливается относительно предыдущей позиции.

Следующий пример эквивалентен предыдущему.

.ta 1i +1i +1i +1i +1i +1i
Программа gtroff поддерживает расширенный синтаксис для повторяющихся значений после метки «T» (значения всегда считаются относительными). Это обычный способ указать вкладки, установленные через равные промежутки.

Пример определяет бесконечное количество позиций табуляции, разделенных одним дюймом.

.ta T 1i
«4c +6c T 3c 5c 2c»

Эквивалентная форма записи:

«4c 10c 13c 18c 20c 23c 28c 30c».

Текст в каждом столбце табуляции (т.е. столбец между двумя позициями табуляции) может быть выровнен по правому или левому краю или по центру. Это определяется добавлением «R», «L» или «C» к спецификатору табуляции. По умолчанию выравнивание «L».

.ta 1i 2iC 3iR
Единица измерения запроса «та» по умолчанию «м».

Табулятор превращается в неразрывное горизонтальное поле, его нельзя ни растянуть, ни сжать.

.ds foo a\tb\tc
.ta T 5i
\*[foo]
Здесь создается строка около 10 дюймов.

.ds bar a\tb b\tc
.ta T 5i
\*[bar]
Gtroff сначала преобразует табуляции в неразрывные горизонтальные движения, а затем разделяет строку после второго «b» (при достаточно короткой длине строки).

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

.ds Z foo\tbar\tfoo
.ds ZZ
foo\tbar\tfoobar
.ds ZZZ
foo\tbar\tfoo\tbar
.ta 2i 4iR
\*[Z]
.br
\*[ZZ]
.br
\*[ZZZ]
.br
Первая строка выравнивает foo по правому краю относительно позиции табуляции. Вторая строка выравнивает по правому краю foobar. Третья строка выравнивает по правому краю только foo из‐за дополнительного символа табуляции, который отмечает конец строки, принадлежащей последней определенной позиции табуляции.

Позиции табуляции связаны с текущей средой.

Вызов «ta» без аргумента удаляет все позиции табуляции.

Начальное значение программы gtroff составляет «T 0,5i».

Числовой регистр «.tabs», доступный только для чтения, содержит строковое представление текущих настроек вкладки, подходящее для использования в качестве аргумента запроса «ta».

.ds tab‐string \n[.tabs]
\*[tab‐
string]
= T120u
Версия troff операционной системы Plan 9 использует регистр «.S» для той же цели.

• Request: «.tc» [fill‐glyph]

Обычно gtroff заполняет пространство до следующей позиции табуляции пробелами. Но поведение можно изменить с помощью запроса «tc». Без аргумента gtroff возвращается к использованию пробелов (значение по умолчанию). Значение символа повторения табуляции связано с текущей средой.

• Request: «.linetabs» n

• Register: «\n[.linetabs]»

Если «n» отсутствует или отличен от нуля, включается режим «line‐tabs», по умолчанию отключен. В режиме вкладок строки программа gtroff вычисляет расстояния табуляции относительно (текущей) выходной строки, а не входной строки.

.ds x a\t\c
.ds y
b\t\c
.ds z c
.ta 1i 3i
\*x
\*y
\*z
Режим «line‐tabs» связан с текущим окружением. Доступный только для чтения регистр «.linetabs» устанавливается равным 1 в режиме вкладок строк и 0 в обычном режиме.

Лидеры

Иногда может потребоваться применить запрос «tc» для заполнения определенной позиции табуляции заданным глифом (например, точками в оглавлении). Для подобного случая gtroff предоставляет альтернативный механизм вкладок, лидеры.

Ведущий символ (код символа 1) подобен символу табуляции: перемещает на следующую позицию табуляции. Единственное отличие состоит в том, что для движения глиф заливки по умолчанию представляет собой символ точки, а не пробела.

• Escape: «\a»

Эта последовательность считается неинтерпретированным лидером. В режиме копирования «\a» то же самое, что и настоящий лидер.

• Request: «.lc» [fill‐glyph]

Объявляет символ повторения выноски. Без аргумента выноски ведут себя так же, как вкладки (т.е. используют пробелы для заполнения). Начальное значение gtroff точка («.»). Значение символа повторения выноски связано с текущим окружением.

Например, для оглавления позиции табуляции могут быть определены таким образом, чтобы номер раздела соответствовал одной позиции табуляции, заголовок — второй, а оставшееся пространство заполнялось точками, где номер страницы слегка отделен от точек.

.ds entry 1.1\tFoo\a\t12
.lc .
.ta 1i 5i +.25i
\*[entry]
1.1 Foo..........................................
12

Поля

Поля — общий способ размещения табличных данных. Поле определяется как данные между парой символов‐разделителей. Оно содержит подстроки, разделенные дополняющими символами. Ширина поля — это расстояние по вводной строке от позиции, где начинается поле, до следующей позиции табуляции. Символ заполнения вставляет растягиваемый пробел, аналогичный команде TeX «\hss» (может быть отрицательным числом), чтобы сделать сумму длин всех подстрок плюс растягиваемый пробел равной ширине поля. Если вставлено более одного символа заполнения, доступное пространство равномерно распределяется между ними.

• Request: «.fc» [delim‐char[padding‐char]]

Запрос определит символ‐разделитель и символ заполнения для полей. Если последний отсутствует, символ заполнения по умолчанию является символом пробела. Если аргумент отсутсвуют, механизм поля отключен (по умолчанию). Обратите внимание, разделители и символы заполнения не связаны с текущей средой.

.fc # ^
.ta T 3i
#foo^bar^smurf#
.br
#foo^^bar^smurf#
foo bar smurf
foo bar smurf

Трансляция символов

Управляющий символ («.») и неразрывный управляющий символ («’») могут быть изменены с помощью запросов «cc» и «c2» соответственно.

• Request: «.cc» [c]

Установит управляющий символ на «c». Без аргумента восстанавливается управляющий символ по умолчанию «.». Значение управляющего символа связано с текущим окружением.

• Request: «.c2» [c]

Установит неразрывный управляющий символ на «c». Без аргумента восстанавливается управляющий символ по умолчанию «’». Значение непрерывного управляющего символа связано с текущим окружением.

• Request: «.eo»

Полностью отключит механизм эвакуации. После выполнения запроса символ обратной косой черты «\» больше не запускает управляющую последовательность.

Этот запрос может быть очень полезен при написании макросов, поскольку нет необходимости удваивать escape‐символ.

.\’’ This is a simplified version of the
.\’’ .BR request from the man macro package
.eo
.de
BR
. ds result \&
. while (\n[.$] >= 2)
\{\
. as result \fB$1\fR$2
. shift 2
. \}
. if \n[.$] .as result \fB$1
\*[result]
. ft R
..
.ec
• Request: «.ec» [c]

Установит escape‐символ на «c». Без аргумента восстанавливается escape‐символ по умолчанию «\». Запрос можно использовать для повторного включения механизма выхода после запроса «eo».

Обратите внимание, что глобальное изменение escape‐символа скорее всего приведет к разрыву пакетов макросов, поскольку gtroff не имеет механизма для интернирования макросов, то есть для преобразования определения макроса во внутреннюю форму, независимую от представления (в TeX такой механизм есть). Если вызывается макрос, он выполняется буквально.

• Request: «.ecs»

• Request: «.ecr»

Запрос «ecs» сохраняет текущий escape‐символ во внутреннем регистре. Используйте этот запрос в сочетании с запросом «ec», чтобы временно изменить escape‐символ.

Запрос «ecr» восстанавливает escape‐символ, сохраненный с помощью «ecs». Без предварительного вызова «ecs» этот запрос устанавливает escape‐символ «\».

• Escape: «\»

• Escape: «\e»

• Escape: «\E»

Последовательности выводят текущий escape‐символ (по умолчанию это символ обратной косой черты «\»).

«»«отложенная» обратная косая черта; точнее, это escape‐символ, за которым следует обратная косая черта, но она не используется из‐за начального escape‐символа. Это не управляющая последовательность.

Эскейп‐символ «\E» отличается от «\e» тем, что символ не интерпретируется в режиме копирования. Применяется, чтобы определить строки с экранированием, работающие в режиме копирования (например, в качестве аргумента макроса).

.ds { \v’‐.3m’\s’\En[.s]*60/100’
.ds } \s0\v’.3m’
Еще один пример, демонстрирующий различия между escape‐последовательностями.

.ec ‐
.de xxx
‐‐A’foo’
..
.xxx
= ‐A’foo’
Здесь, как упоминалось выше, escape‐символ делает следующий символ обычным. Записанная с escape‐символом последовательность «‐‐» становится «\‐».

.ec ‐
.de xxx
‐EA’foo’
..
.xxx
= 1
• Escape: «\.»

Подобно «», последовательность «\.» не является настоящей управляющей последовательностью. Предупреждающее сообщение подавляется, если за escape‐символом следует точка.

.de foo
. nop foo
.
. de bar
. nop bar
\..
.
..
.foo
.bar
= foo bar
Трансляция — сопоставление входного символа с выходным глифом. Сопоставление происходит во время вывода, т.е. входному символу присваивается информация сопоставленного выходного символа перед преобразованием входных токенов.

• Request: «.tr» a b c d ...

• Request: «.trin» a b c d ...

Переводят символ «a» в глиф «b», символ «c» в глиф «d» и т.д. При нечетном числе аргументов последний переводится в нерастягиваемый пробел («\»).

Запрос «trin» идентичен «tr», но когда используется «asciify», перевод игнорируется.

Некоторые примечания. Специальные символы («\(xx», «\[xxx]», «\C’xxx’», «\’», «‘», «\‐», «\_»), глифы, определенные с помощью запроса «char», и пронумерованные глифы («\N’xxx’») также могут быть переведены. Последовательность «\e» тоже можно перевести.

Символы могут быть отображены как escape‐последовательности «\%» и «\~» (но «\%» и «\~» не могут быть сопоставлены с другим глифом).

Следующие символы не могут быть переведены: пробел, backspace, новая строка, лидер («\a»), табуляция, а также «\t».

Переводы не учитываются при поиске набора символов мягкого дефиса с запросом «shc».

Пара «c\&» (произвольный символ «c», за которым следует пробел нулевой ширины) не сопоставляет символ.

.tr a\&
foo bar
= foo br
.tr aa \&
foo bar
= foobar
Как показано в примере, пробел не может быть первой парой символ/глиф в качестве аргумента «tr». Кроме того, невозможно сопоставить символ пробела с любым другим глифом; запросы типа «.tr aa x» отменяют «.tr aa \&».

Если выравнивание активно, строки выравниваются, несмотря на пустой пробел (однако между словами нет минимального расстояния).

После создания выходного глифа на него больше не влияет «tr».

Возможен также перевод символа в глифы, где один из них или оба не определены. Запрос «tr» не проверяет, существуют ли объекты в аргументе.

Программа troff не имеет жестко запрограммированной зависимости от Latin‐1; все объекты «char XXX» были удалены из файлов описания шрифтов. Из‐за этого появляются предупреждения «не удается найти символ с кодом ввода XXX», если запрос «tr» не обрабатывается должным образом.

.tr \xE9\xC9
Здесь сопоставляется входной символ «\xE9» с глифом «\xC9», он идентичен глифу «char201». Но глиф не существует. Поэтому «\[char201]» обрабатывается как вводимый символ и отображается на «\[’E]».

.tr \xE9\[’E]
Другими словами, первый аргумент «tr» должен быть входным символом или сущностью, а второй — глифом.

Без аргумента запрос «tr» игнорируется.

• Request: «.trnt» a b c d ...

Запрос «trnt» — это тот же запрос «tr», но переводы не применяются к тексту, который прозрачно переводится с помощью «\ !».

.tr ab
.di x
\ !.tm a
.di
.x
Здесь «b» выводится в стандартный поток ошибок, если «trnt» используется вместо «tr», печатается «a».

Режимы troff и nroff

Программы «nroff» и «troff» были самостоятельными программами, но первая работала с выводом TTY. В GNU troff программы объединяются в один исполняемый файл, который отправляет свой вывод драйверу устройства («grotty» для устройств TTY, «grops» для POSTSCRIPT и т.д.). Последний интерпретирует промежуточный вывод gtroff. Для систем troff Unix подразумеваются режимы nroff и troff, поскольку различия жестко запрограммированы. Однако GNU troff (gtroff) берет информацию, указанную в файлах шрифтов для конкретного устройства, без обработки запросов, если используется устройство вывода TTY.

Обычно пакет макросов можно использовать со всеми устройствами вывода. Тем не менее иногда необходимо различать устройства TTY и устройства без TTY: «gtroff» предоставляет два встроенных условия «n» и «t» для «if», «ie» и «while», позволяющих определить, будет ли «gtroff» вести себя как «nroff» или как «troff».

• Request: «.troff»

Запрос позволяет сделать встроенное условие «t» истинным (условие «n» ложное) для условных запросов «if», «ie» и «while». Это значение по умолчанию, если «gtroff» запускается с ключом «‐R», чтобы избежать загрузки файлов запуска «troffrc» и «troffrc‐end». Без опции «‐R» «gtroff» остается в режиме troff, если устройство вывода не является TTY (например, ps).

• Request: «.nroff»

Запрос сделает встроенное условие «n» истинным (условие «t» ложное) при использовании «if», «ie» и «while».Значение по умолчанию, если gtroff применяет устройство вывода TTY; переход в режим nroff определяется в файле «tty.tmac», он загружается стартовым файлом «troffrc».

Размещение строк

На следующем рисунке показаны размеры, которые gtroff использует для размещения строки вывода на странице. Они помечены запросом, который манипулирует каждым измерением.

‐‐>| in |<‐‐
|<‐‐‐‐‐‐‐‐‐‐‐ll‐‐‐‐‐‐‐‐‐‐‐‐>|
+‐‐‐‐+‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+
| : : : |
+‐‐‐‐+‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+
‐‐>| po |<‐‐
|<‐‐‐‐‐‐‐‐paper width‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐>|
Эти размеры следующие.

«po»

Смещение страницы ‐ крайняя левая позиция текста в окончательном выводе, определяющая левое поле.

«in»

Отступ ‐ это расстояние от левого поля, где печатается текст.

«ll»

Длина строки ‐ расстояние от левого поля до правого поля.

.ll 3i
This is text without indentation.
The line length has been set to 3\~inch.
.in +.5i
.ll ‐.5i
Now the left and right margins are both increased.
.in
.ll
Calling .in and .ll without parameters restore the
previous values.
• Request: «.po» [offset]

• Request: «.po» +offset

• Request: «.po» ‐offset

• Register: «\n[.o]»

Запросы управляют смещением страницы по горизонтали на «offset» (увеличивает или уменьшает текущее значение на «offset»). Обратите внимание, что некоторые запросы не вызывает разрыва, поэтому изменение смещения страницы в середине заполняемого текста может не дать ожидаемого результата. Начальное значение равно 1i. Для устройств вывода TTY в стартовом файле «troffrc» установлено значение 0; индикатор масштабирования по умолчанию «m» (а не «v», как неправильно задокументировано в оригинальном руководстве Unix troff).

Текущее смещение страницы можно найти в доступном только для чтения числовом регистре «.o».

Если «po» вызывается без аргумента, смещение страницы сбрасывается до предыдущего значения перед последним вызовом «po».

.po 3i
\n[.o]
= 720
.po
‐1i
\n[.o]
= 480
.po
\n[.o]
= 720
• Request: «.in» [indent]

• Request: «.in» +indent

• Request: «.in» ‐indent

• Register: «\n[.i]»

Запрос установит отступ на «indent» (увеличит или уменьшит текущее значение на «indent»). Этот запрос вызывает разрыв строки. Нет отступа.

Если «in» вызывается без аргумента, отступ сбрасывается до предыдущего значения перед последним вызовом «in». Индикатор масштабирования по умолчанию «m». Отступ связан с текущей средой.

Если указано отрицательное значение отступа (что недопустимо), gtroff выдает предупреждение типа «range» и устанавливает отступ равным нулю.

Эффект «in» откладывается до тех пор, пока не будет выведена частично собранная строка (если она существует). Временное значение отступа также обнуляется.

Текущий отступ (заданный «in») можно посмотреть в доступном только для чтения числовом регистре «.i».

• Request: «.ti» offset

• Request: «.ti» +offset

• Request: «.ti» ‐offset

• Register: «\n[.in]»

Временно определяет отступ следующей строки вывода на «offset». Если указано значение приращения или уменьшения, корректирует временный отступ относительно значения, установленного запросом «in».

Этот запрос вызывает паузу, значение связано с текущим окружением. Индикатор масштабирования по умолчанию «m». Вызов «ti» без аргумента игнорируется.

Если общее значение отступа отрицательное (недопустимо), gtroff выдает предупреждение «range» и устанавливает временный отступ равным нулю. Общий отступ — это либо «offset», если указано абсолютное значение, либо временный отступ плюс нормальный отступ, если «offset» указано как относительное значение.

Эффект «ti» откладывается до тех пор, пока не будет выведена частично собранная строка (если она существует).

Доступный только для чтения числовой регистр «.in» содержит значение отступа текущей строке вывода.

Различие между «.i» и «.in» заключается в том, что последний учитывает, применяет ли частично собранная строка прежнее значение или временное значение отступа.

• Request: «.ll» [length]

• Request: «.ll» +length

• Request: «.ll» ‐length

• Register: «\n[.l]»

• Register: «\n[.ll]»

Установит длину строки на «length» (увеличит или уменьшит текущее значение на «length»). Изначально длина установлена на 6,5i. Эффект «ll» задерживается до тех пор, пока не будет выведена частично собранная строка (если она есть). Индикатор масштабирования по умолчанию «m».

Если «ll» вызывается без аргумента, длина строки сбрасывается до предыдущего значения перед последним вызовом «ll». Если указана отрицательная длина строки (недопустимо), gtroff выдает предупреждение «range» и устанавливает длину строки равной нулю. Длина строки связана с текущим окружением.

Текущая длина строки (заданная «ll») сохраняется в доступном только для чтения числовом регистре «.l». Доступный только для чтения числовой регистр «.ll» хранит длину строки, которая применяется к текущей выходной строке.

Разница между «.l» и «.ll» заключается в том, что последний учитывает, использует ли частично собранная строка прежнее значение длины строки.

Контроль строк

Многие escape‐последовательности применяют позиционирование относительно строки ввода.

This is a \h’|1.2i’test.
This is
a
\h’|1.2i’test.
Основное применение функции — определение макросов, которые активируются в том месте, где вызываются.

.\’’ A simple macro to underline a word
.de underline
. nop l’|0\[ul]’
..
В приведенном выше примере «|0» указывает отрицательное расстояние от текущей позиции (в конце аргумента «\$1») до начала входной строки. Таким образом, последовательность «\l» рисует линию справа налево.

• Escape: «\RET»

• Escape: «\.»

• Register: «\n[.int]»

Продолжит линию. «\RET», однако обратная косая черта в конце строки, сразу за которой следует перевод строки, подавляет эффекты перехода на новую строку во вводе.

This is a \
.test
= This is a
.test
(Здесь также затронут оператор «|».)

Последовательность «\c» активируется на выходе. Все, что следует за escape‐символом на той же строке, игнорируется (кроме «\R»). Все, что находится перед «\c» в той же строке, добавляется к текущей строке вывода. Следующая (если это не команда) строка после прерванной строки считается новой.

Визуально результаты зависят от того, активен ли режим без заполнения.

Если установлен режим без заполнения (задается запросом «nf»), следующая строка ввода текста после «\c» обрабатывается как продолжение той же строки.

.nf
This is a \c
test.
=
This is a test.
Если активен режим заполнения (запрос «fi»), слово, прерванное «\c», продолжается текстом на следующей строке ввода без пробела.

This is a te\c
st.
= This is a
test.
Обратите внимание, что промежуточная управляющая строка, вызывающая разрыв, удаляет текущую неполную строку.

Регистр «.int» содержит положительное значение, если последняя строка вывода была прервана «\c»; регистр связан с текущей средой.

Макеты страниц

Gtroff предоставляет несколько примитивных операций для управления макетом страницы.

• Request: «.pl» [length]

• Request: «.pl» +length

• Request: «.pl» ‐length

• Register: «\n[.p]»

Запросы устанавливают длину страницы на значение «length» (или увеличивают, уменьшают текущее значение на «length»). Индикатор масштабирования по умолчанию «v».

Текущая настройка находится в доступном только для чтения числовом регистре «.p».

Обратите внимание, что указывается только размер страницы, а не верхнее и нижнее поля. Они не устанавливаются gtroff напрямую.

Отрицательные значения «pl» также возможны, но не всегда полезны: например, ловушка не срабатывает, каждая строка выводится на одной странице, подавляются вертикальные интервалы.

Если аргумент отсутствует или указан недопустимый аргумент, «pl» устанавливает длину страницы как 11i.

Gtroff предоставляет несколько операций, помогающих настроить верхние и нижние заголовки (колонтитулы).

• Request: «.tl» ’left’center’right’

Запрос печатает строку заголовка и состоит из трех частей, форматирующих по левому краю, по центру и по правому краю. Разделитель аргумента «’» можно заменить любым символом, не встречающимся в строке заголовка. Символ «%» заменяется номером текущей страницы. Символ изменяется с помощью запроса «pc». Без аргумента «tl» игнорируется.

Некоторые примечания. Длина строки, заданная запросом «ll», не учитывается «tl»; используйте запрос «lt» (описанный ниже), чтобы контролировать длину строки текста, заданного «tl».

Строка заголовка не ограничивается верхней или нижней частью страницы.

Запрос «tl» выводит строку заголовка, игнорируя частично заполненную строку.

Отсутствие закрывающих разделителей не считается ошибкой. Например, «.tl /foo» эквивалентно «.tl /foo///»: выводится строка заголовка с выровненным по левому краю словом «foo», но центрированные и выровненные по правому краю части пустые.

Запрос «tl» принимает те же символы‐разделители параметрров, что escape‐символ «\A».

• Request: «.lt» [length]

• Request: «.lt» +length

• Request: «.lt» ‐length

• Register: «\n[.lt]»

Заголовок выводится с использованием собственной длины строки, которая увеличивается или уменьшается с помощью запроса «lt». Изначально длина строки заголовка установлена на 6,5i. Если указана отрицательная длина строки (недопустимо), gtroff выдает предупреждение ошибки «range», устанавливает длину строки заголовка равной нулю. Индикатор масштабирования по умолчанию «m». Если «lt» вызывается без аргумента, длина заголовка сбрасывается до предыдущего значения перед последним вызовом «lt».

Значения параметрра доступны в числовом регистре только для чтения «.lt»; регистр связан с текущей средой.

• Request: «.pn» page

• Request: «.pn» +page

• Request: «.pn» ‐page

• Register: «\n[.pn]»

Уувеличивает или уменьшает номер следующей страницы. Единственным аргументом является номер страницы, без параметрра запрос игнорируется.

Регистр «.pn», доступный только для чтения, содержит номер следующей страницы и либо значение, заданное запросом «pn», либо номер текущей страницы, увеличенный на единицу.

• Request: «.pc» [char]

Запрос изменит символ номера страницы на другой символ. Без аргумента не вносит изменений. Обратите внимание, запрос не влияет на числовой регистр «%».

Контроль страницы

• Request: «.bp» [page]

• Request: «.bp» +page

• Request: «.bp» ‐page

• Register: «\n[%]»

Запрос остановит обработку текущей страницы, чтобы программа перешла к следующей странице. Он также может принимать аргумент для установки (увеличения, уменьшения) номера следующей страницы. Последняя становится текущей страницей после завершения «bp». Разница между «bp» и «pn» заключается в том, что «pn» не вызывает разрыва строки.

.de newpage \’’ define macro
’bp
\’’ begin page
’sp .5i \’’ vertical space
.tl ’left
top’center top’right top’ \’’ title
’sp .3i \’’ vertical
space
.. \’’ end macro
Запрос «bp» не действует, если не вызывается как ловушка верхнего уровня.

Регистр «%» содержит текущий номер страницы.

Числовой регистр «.pe» установлен в 1, если исполняется запрос «bp».

• Request: «.ne» [space]

Часто необходимо принудительно заполнить определенное пространство перед печатью новой страницы, чтобы не допускать ненужных строк внизу страницы. Запрос «ne» гарантирует, что существует определенное расстояние, указанное первым аргументом, до запуска следующей страницы. Индикатор масштабирования по умолчанию для «v», значение по умолчанию «space» равно 1v, если не задан аргумент.

.ne 2
text text text
Запрос «ne» автоматически приводит к разрыву страницы, если есть место только для одной строки.

• Request: «.sv» [space]

• Request: «.os»

Запрос «sv» аналогичен запросу «ne» и резервирует указанное количество вертикального пространства. Если перед следующей ловушкой (или нижней границей страницы, если ловушка не установлена) существует требуемый объем пространства, она выводится немедленно, игнорируя частично заполненную строку, которая остается нетронутой. Если места недостаточно, сохраняется для последующего вывода через запрос «os». Значение по умолчанию равно 1v, если аргумент не указан; индикатор масштабирования по умолчанию «v».

И «sv», и «os» игнорируют режим без «space». Но если запрос «sv» допускает отрицательные значения для «space», «os» их пропускает.

• Register: «\n[nl]»

Регистр содержит текущую позицию по вертикали. Если позиция по вертикали равна нулю и переход к началу страницы еще не произошел, «nl» устанавливается в отрицательное значение.

.de xxx
. sp
. tl ’’Header’’
.
sp
..
.
First page.
.bp
.wh 0 xxx
.nr
nl (‐1)
Second page.
Без сброса «nl» в отрицательное значение только что установленная ловушка будет активна, начиная со следующей, а не с текущей страницы.

======

Строковые переменные

В gtroff строковые переменные предназначены исключительно для удобства пользователя (т.е. нет встроенных строк, кроме «.T»).

Хотя для создания строк можно применять запросы, простое использование неопределенной строки приведет к тому, что она будет определена как пустая.

• Request: «.ds» name[string]

• Request: «.ds1» name[string]

• Escape: «\*» n

• Escape: «\*(» nm

• Escape: «\*[name arg1 arg2]»

Эти запросы и последовательности обеспечивают доступ к строковой переменной «name» (односимвольное имя «n», двухсимвольное «nm»). Если «name» существует, «ds» перезаписывает предыдущее определение. Только форма синтаксиса с квадратными скобками может принимать аргументы, которые обрабатываются идентично аргументам макроса; исключением считается, если закрывающая скобка в качестве аргумента заключена в двойные кавычки.

.ds foo a \ test
.
This is
\*[foo nice].
= This is a nice test.
Последовательность «\*» «интерполирует» (расширяет) ранее определенную строковую переменную. Чтобы быть более точным, сохраненная строка помещается во входной стек, который затем анализируется gtroff. Подобно числовым регистрам, строки можно вкладывать друг в друга, т.е. строку можно вызывать внутри строковых переменных.

Если строка, определенная escape‐последовательностью «\*», не существует, она считается пустой, выдается предупреждение «mac».

В отличие от других запросов, второй аргумент запроса «ds» занимает всю строку, включая завершающие пробелы. Это означает, что комментарии к строке с таким запросом могут ввести в строку нежелательный пробел.

.ds TeX
T\h’‐.2m’\v’.2m’E\v’‐.2m’\h’‐.1m’X \’’
Knuth’s TeX
Комментарий следует поместить на другую строку или создать escape‐последовательность комментария рядом с концом строки.

.ds TeX
T\h’‐.2m’\v’.2m’E\v’‐.2m’\h’‐.1m’X\’’ Knuth’s
TeX
Чтобы ввести начальный пробел, строка должна начинаться с двойной кавычки. Заключительная кавычка не требуется, любая конечная кавычка включена в строку.

.ds sign " Yours in a white wine sauce,
Строки в файлах не ограничиваются одной строкой текста. Строка может занимать несколько строк в текстовом файле, если символы новой строки экранируются обратной косой чертой.

.ds foo lots and lots \
of text are on
these \
next several lines
В строке не может быть настоящей новой строки. Чтобы поместить один символ двойной кавычки в строку, используйте два последовательных символа двойной кавычки.

Запрос «ds1» отключает режим совместимости при интерпретации строки: токен ввода «сохранение совместимости» вставляется в начало строки, а токен ввода «восстановление совместимости» в конец.

.nr xxx 12345
.ds aa The value of xxx is
\n[xxx].
.ds1 bb The value of xxx is \n[xxx].
.
.cp 1
.
\*(aa
= warning: number register
\’
. tm =\’
. tm =\$^’
..
.foo "
This is a "test"
= =test"’
= =" This is a " "test""’
=
$^=abc’ is \w’abc’u.
= The length of the string \&’.
Строки, макросы, диверсии, блоки используют одно и то же пространство имен. Иногда это приводит к некоторым неожиданным последствиям. Например, можно вызвать макрос со строковым синтаксисом и наоборот.

.de xxx
a funny test.
..
This is
\*[xxx]
= This is a funny test.
.ds yyy a funny
test
This is
.yyy
= This is a funny test.
Интерполяция строки не скрывает существующие аргументы макроса.

.xx \$ @
\*[xx]\
Обратите внимание, что синтаксис вызова не изменяет значение «\$0», значение наследуется из вызывающего макроса.

Диверсии и блоки также могут вызываться со строковым синтаксисом.

Допустимо копировать однострочные диверсия или блоки в строку.

.di xxx
a \fItest\fR
.br
.di
.ds yyy This is \*[xxx]\c
\*[yyy].
= This is a "test".
Как показано в предыдущем примере, форматированный вывод можно сохранять в виде строк. Экранирование «\c» предотвращает вставку дополнительной пустой строки в вывод.

Копирование диверсий длиннее одной строки приводит к неожиданным результатам.

.di xxx
a funny
.br
test
.br
.di
.ds yyy This is \*[xxx]\c
\*[yyy].
= test This is a funny.
Обычно невозможно предсказать, содержит ли переадресация одну или несколько выходных строк, поэтому лучше избегать подобного приема. (В Unix troff это было единственное решение убрать последнюю новую строку.) Пробелы в скопированной строке обработаны, что делает их нерастяжимыми и может привести к некрасивому форматированию.

Решение проблемы доступно в GNU troff, если применяется запрос «chop» для удаления последней строки перехода, или «unformat» для повторного растягивания горизонтальных пробелов.

.box xxx
a funny
.br
test
.br
.box
.chop xxx
.unformat xxx
This is
\*[xxx].
= This is a funny test.
• Request: «.as» name [string]

• Request: «.as1» name [string]

Запрос «as» подобен запросу «ds», но добавляет «string» к строке, сохраненной как «name», вместо ее переопределения. Несуществующее «name» создается.

.as sign " with shallots, onions and garlic,
Запрос «as1» аналогичен «as», но режим совместимости отключается на время интерпретации добавленной строки. Токен ввода «сохранение совместимости» вставляется в начало добавляемой строки, а токен ввода «восстановление совместимости» в конец.

В следующих двух запросах создаются рудиментарные подпрограммы для работы со строками.

• Request: «.substring» str n1 [n2]

Запрос заменяет строку с именем «str» на подстроку, определяемую индексами «n1» и «n2». Первый символ в строке имеет индекс 0. Если «n2» опущен, ему неявно присваивается наибольшее допустимое значение (длина строки минус единица). Если значение индекса «n1» или «n2» отрицательное, оно отсчитывается от конца строки в обратном порядке: последний символ имеет индекс ‐1, символ перед последним символом индекс ‐2 и т.д.

.ds xxx abcdefgh
.substring xxx 1 ‐4
\*[xxx]
= bcde
.substring xxx 2
\*[xxx]
= de
• Request: «.length» reg str

Запрос вычисляет количество символов «str» и записывает их в числовой регистр «reg». Если «рег» не существует, он создается, «str» читается в режиме копирования.

.ds xxx abcd\h’3i’efgh
.length yyy
\*[xxx]
\n[yyy]
= 14
• Request: «.rn» xx yy

Переименует запрос, макрос, переадресацию или строку с «xx» на «yy».

• Request: «.rm» xx

Удалит запрос, макрос, переадресацию или строку «xx». Программа gtroff обрабатывает последующие вызовы, как если бы объект никогда не был определен.

• Request: «.als» new old

Создает псевдоним с именем «new» для запроса, строки, макроса или объекта с именем «old». Новое имя и старое имя полностью эквивалентны. Если «old» не определен, gtroff выдает предупреждение «mac», запрос игнорируется.

.de foo
..
.
.als bar foo
.
.de bar
. foo
..
.
.bar
= input stack
limit exceeded
Здесь определение макроса «bar» заменяет старый объект, с которым связано имя. Однако псевдоним «foo» все еще активен. Другими словами, «foo» связан с тем же объектом, что и «bar», а результатом вызова «bar» будет бесконечный рекурсивный цикл, приводящий к ошибке.

Чтобы отменить псевдоним, просто вызовите «rm» для него. Объект не уничтожается до тех пор, пока не исчезнут псевдонимы.

• Request: «.chop» xx

Удалит (вырежет) последний символ из макроса, строки с именем «xx». Команду можно вызывать повторно.

Операторы if, ie, while

Для операторов «if», «ie» и «while», помимо обычных выражений, также доступна поддержка расширенных условий.

«e»

«o»

Истинно, если текущая страница четная или нечетная.

«n»

Истинно, если документ обрабатывается в режиме nroff (т.е. была введена команда «.nroff»).

«t»

Истинно, если документ обрабатывается в режиме troff (т.е. была введена команда «.troff»).

«v»

Всегда ложь. Это условие только для совместимости с другими версиями troff (идентификация устройства «‐Tversatec»).

«’xxx’yyy’»

Истинно, если результат, произведенный «xxx», равен результату, произведенному «yyy». Вместо одинарных кавычек допускаются другие символы; применяется тот же набор разделителей, что и для escape‐последовательности «\D». После сравнения полученные данные отбрасываются.

.ie "|"\fR|\fP" \
true
.el \
false
= true
Результирующие движения, размеры глифов и шрифтов должны совпадать. В предыдущем примере «|» и «\fR|\fP» создает римский глиф «|» с одинаковым размером и в том же месте на странице, поэтому строки равны. Если «.ft I» добавляется перед «.ie», результат считается ложным, потому что первое «|» дает курсивное начертание «|», вместо латинского.

Чтобы сравнить строки без обработки, примените «\?».

.ie
"\?|\?"\?\fR|\fP\?" \
true
.el \
false
= false
Поскольку данные, защищенные символом «\?», считываются в режиме копирования, допускается неполный ввод.

.ds a \[
.ds b \[
.ie
’\?\*a\?’\?\*b\?’ \
true
.el \
false
= true
«r xxx»

Истинно, если имеется числовой регистр с именем «xxx».

«d xxx»

Истинно, если строка, макрос, перенаправление или запрос определены с именем «xxx».

«m xxx»

Истинно, если существует цвет с именем «xxx».

«c g»

Истинно, если доступен глиф «g»; «g» — это символ ASCII или специальный символ «\N’xxx’», «\(gg» или «\[ggg])». Условие также верно, если «g» был определен запросом «char».

«F font»

Истинно, если существует шрифт с именем «font». «Font» обрабатывается так же, как с помощью запроса «ft», без фактического монтирования.

«S style»

Истинно, если был зарегистрирован стиль «style».

Обратите внимание, что эти операторы нельзя комбинировать с другими операторами, такими как «:» или «&». Только ведущее «!» (без пробела между восклицательным знаком и оператором) может быть использовано для отрицания результата.

.nr xxx 1
.ie !r xxx \
true
.el \
false
= false
Пробел после «!» всегда нулевой (правило введено для совместимости с troff Unix).

.nr xxx 1
.ie ! r xxx \
true
.el \
false
= r xxx true
Допускается опустить пробел перед аргументами операторов «r», «d» и «c».

Конструкция if‐else

В gtroff есть конструкция if‐then‐else, однако это сложные для понимания операторы.

• Request: «.if» expr anything

Запрос вычисляет выражение «expr» и «anything»(остаток строки), если «expr» дает значение больше нуля (истина). Аргумент «anything» интерпретируется так, как если бы находился на отдельной строке, начальные пробелы не обрабатываются.

.nr xxx 1
.nr yyy 2
.if
((\n[xxx] == 1) & (\n[yyy] == 2)) true
= true
• Request: «.nop» anything

Выполняет действие «anything», аналогично запросу «.if 1».

• Request: «.ie» expr anything

• Request: «.el» anything

Применяет запросы «ie» и «el» для записи if‐then‐else. Первый запрос — это часть «if», второй — часть «else».

.ie n .ls 2 \’’ double‐spacing in nroff
.el .ls 1 \’’ single‐spacing in troff
• Escape: «\{»

• Escape: «\}»

Во многих случаях конструкция if (или if‐else) выполняет более одного запроса. Функция включается с помощью escape‐последовательности «\{» (должна начинать первую строку) и «\}» (заканчивает строку).

.ie t \{\
. ds lq
. ds rq
’’
.\}
.el \{\
. ds lq ""
. ds rq
""
.\}

Цикл while

Программа «gtroff» предоставляет циклическую конструкцию «while», она применяется так же, как запросы «if» и другие подобные.

• Request: «.while» expr anything

Вычислит выражение «expr» и повторно выполнит «anything» (оставшуюся часть строки), пока «expr» не станет равным 0.

.nr a 0 1
.while (\na < 9)
\{\
\n+a,
.\}
\n+a
=
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Тело запроса «while» обрабатывается так же, как тело запроса «de». Gtroff временно сохраняет его в макросе, который удаляется после выхода из цикла. Алгоритм способен значительно замедлить макрос, если тело запроса «while» (внутри макроса) большое. Поэтому, когда макрос выполняется, тело «while» анализируется и снова сохраняется как временный макрос.

.de xxx
. nr num 10
. while
(\n[num] > 0) \{\
. \’’ many lines of code
. nr num ‐1
. \}
..
Традиционное и часто хорошее решение: применить рекурсивный макрос, он анализируется только один раз во время определения.

.de yyy
. if (\n[num] > 0)
\{\
. \’’ many lines of code
. nr num ‐1
. yyy
. \}
..
.
.de xxx
. nr num
10
. yyy
..
Обратите внимание, что количество доступных уровней рекурсии установлено равным 1000 (постоянное значение gtroff, заданное во время компиляции).

Закрывающая фигурная скобка тела while должна заканчивать строку.

.if 1 \{\
. nr a 0 1
.
while (\n[a] < 10) \{\
. nop \n+[a]
.\}\}
= unbalanced \{ \}
• Request: «.break»

Выход из цикла. Не путайте с запросом «br» (разрыв строки).

• Request: «.continue»

Завершит текущую итерацию цикла и немедленно запустит следующую.

Добавление файлов

Программа gtroff предоставляет несколько запросов на включение файлов.

• Request: «.so» file

Запрос считывает указанный «file» и включает его вместо запроса «so». Это помогает работать с большими документами, например, позволяет хранить каждую главу в отдельном файле.

Поскольку gtroff заменяет «so» содержимым «file», следует понимать, как добавляется файл и заканчиваются ли данные символами новой строки, знаком конца файла.

Примечание. Путь поиска «file» можно контролировать с помощью параметрра командной строки «‐I».

• Request: «.pso» command

Запрос читает стандартный вывод «command» и включает его вместо запроса «pso».

Запрос вызывает ошибку при работе в безопасном режиме. Используйте опцию «‐U» для активации небезопасного режима.

Комментарий новой строки для запроса «so» действителен и для «pso».

• Request: «.mso» file

Запрос идентичен запросу «so», за исключением того, что gtroff ищет указанный «file» в каталогах макросов (параметрр командной строки «‐m»). Если имя файла имеет форму «name.tmac» и не найдено, «mso» пытается включить «tmac.name» и наоборот. Если файл не существует, выдается предупреждение.

• Request: «.trf» file

• Request: «.cf» file

Прозрачный вывод содержимого «file». Каждая строка выводится так, как если бы ей предшествовала последовательность «\ !», однако строки не подлежат интерпретации режима копирования. Если файл не заканчивается строкой, добавляется новая строка (только для запроса «trf»).

Например, чтобы определить макрос «x» в файле «f»:

.ev 1
.di x
.trf f
.di
.ev
Вызов «ev» необходим, чтобы текущая неполная строка не стала частью переадресации.

И «trf», и «cf», если применяются диверсии (отклонения), встраивают объект в отклонение, что при повторном чтении вызывает прозрачное копирование содержимого «file». В troff Unix «file» немедленно копируется на выход независимо от того, включена ли диверсия: алгоритм считается ошибочным.

В то время как «cf» копирует содержимое «file» полностью необработанным, «trf» запрещает символы, такие как NUL, если они не являются допустимыми входными символами gtroff.

Запросы вызывают разрыв строки.

• Request: «.nx» [file]

Запрос заставит gtroff продолжить обработку файла‐аргумента. Если аргумент не указан, виртуальный указатель переместится в конец файла.

• Request: «.rd» [prompt [arg1 arg2 ... ]]

Чтение из стандартного ввода и включение прочитанного, как если бы оно было частью входного файла. Текст читается до тех пор, пока не встретится пустая строка.

Если стандартным вводом является устройство TTY (клавиатура), выведет приглашение в поток ошибок, а затем добавит двоеточие (или выдаст звуковой сигнал BEL).

С помощью запросов «nx» и «rd» легко настраивается шаблон письма.

.ce
\*(td
.sp 2
.nf
.rd
.sp
.rd
.fi
Body of letter.
.bp
.nx
repeat.let
При запуске файл будет перенаправлен. Обратите внимание, что запросы, включенные в этот файл, выполняются так, как если бы они были частью бланка письма. Последним блоком ввода станет запрос «ex», заставляющий groff прекратить обработку.

Trent A. Fisher
708 NW 19th Av., #202
Portland, OR 97209
Dear Trent,
Len Adollar
4315 Sierra Vista
San Diego, CA 92103
Dear Mr. Adollar,
.ex
• Request: «.pi» pipe

Запрос направляет вывод gtroff в команду оболочки, указанную как «pipe». Запрос должен быть выполнен до того, как gtroff начнет печать.

Запрос «pi» вызывает ошибку при работе в безопасном режиме. Используйте опцию «‐U» для активации небезопасного режима.

Разрешены множественные вызовы «pi», создающие цепочку.

.pi foo
.pi bar
...
Обратите внимание, промежуточный вывод gtroff передается указанным командам. Следовательно, вызов groff без опции «‐Z» приведет к фатальной ошибке.

• Request: «.sy» cmds

• Register: «\n[systat]»

Запрос выполняет команду оболочки, указанную в «cmds». Вывод не сохраняется.

Запрос вызывает ошибку при работе в безопасном режиме.

Следующий фрагмент кода добавит текущее время в документ.

.sy perl ‐e ’printf ".nr H %d\n.nr M
%d\n.nr S %d\n",\
(localtime(time))[2,1,0]’ >
/tmp/x\n[26525]
.so /tmp/x\n[26525]
.sy rm
/tmp/x\n[26525]
\nH:\nM:\nS
Используйте запрос «af», чтобы получить отформатированный вывод.

.af hours 00
.af minutes 00
.af
seconds 00
\n[hours]:\n[minutes]:\n[seconds]
Регистр «systat» содержит возвращаемое значение функции «system()», выполненной во время последнего запроса «sy».

• Request: «.open» stream file

• Request: «.opena» stream file

Запросы открывают указанный «file» для записи и связывают с ним «stream» (поток).

Запрос «opena» похож на «open», но если файл существует, файл будет дополнен. (Как в команде >> в OS семейства Unix.)

И «open», и «opena» вызывают ошибку при работе в безопасном режиме.

• Request: «.write» stream data

• Request: «.writec» stream data

Запись в файл, связанный с указанным потоком («stream»). Поток должен быть открыт.

Запрос «writec» похож на «write», но добавляет новую строку к данным.

• Request: «.writem» stream xx

Запишет содержимое макроса или строки «xx» в файл, связанный с указанным потоком («stream»).

Аргумент «xx» читается в режиме копирования, т.е. отформатированные элементы игнорируются.

• Request: «.close» stream

Закрывает указанный «stream»; поток больше не является приемлемым аргументом для запроса «write».

Ниже простой макрос для записи указателя.

.open idx test.idx
.
.de IX
.
write idx \n[%] \
..
.
.IX test entry
.
.close idx
• Escape: «\V» e

• Escape: «\V(» ev

• < Escape: «\V[» env «]»

Последовательности интерполируют содержимое указанной переменной окружения «env» (односимвольное имя «e», двухсимвольное «ev»), возвращаемое функцией «getenv». «\V» интерпретируется в режиме копирования.

Доступ к постпроцессорам

Существуют две escape‐последовательности, передающие информацию непосредственно в постпроцессор, они очень полезные для встраивания POSTSCRIPT в документ.

• Request: «.device» xxx

• Escape: «\X’xxx’»

Запрос и последовательность вставляют аргумент в вывод, предшествующий «x X».

Экранированные символы «\&», «\)», «\%» и «\:» игнорируются внутри «\X», «\» и «\~», преобразуются в символы одиночного пробела. Все остальные escape‐последовательности (кроме «\», обратная косая черта) вызывают ошибку.

В отличие от «\X», запрос «device» обрабатывает аргумент в режиме копирования.

Если в файле DESC установлено ключевое слово «use_charnames_in_special», специальные символы больше не вызывают ошибку, но выводятся дословно. Кроме того, обратная косая черта представлена как «» («use_charnames_in_special» в настоящее время используется только grohtml).

• Request: «.devicem» xx

• Escape: «\Y» n

• Escape: «\Y(» nm

• Escape: «\Y[name]»

Примерно эквивалентно «\X’\*[name]’» (односимвольное имя «n», двухсимвольное «nm»). Однако содержимое строки или макроса «name» не интерпретируется; также определено, что «name» это макрос, содержащий символы новой строки. Однако не допускается, чтобы аргумент «\X» содержал символы новой строки.

Включение новых строк требует расширения выходного формата troff Unix.

Дополнительные команды

В этом разделе описаны запросы gtroff, которые не могут быть отнесены к какой‐либо другой категории руководства.

• Request: «.nm» [start[inc[space[indent]]]]

Запрос выводит номера строк, где «start» — номер «следующей» строки вывода, «inc» указывает, какие номера строк печатаются. Например, значение 5 подразумевает вывод только тех номеров строк, которые кратны 5. Аргумент «space» — пространство, которое должно быть оставлено между числом и текстом, по умолчанию одноразрядное пространство. Четвертый аргумент — отступ номеров строк, по умолчанию равный нулю. И «space», и «indent» задаются как кратные цифровым пробелам, значения могут быть отрицательными. Без аргументов номера строк отключаются.

Программа gtroff резервирует три цифры для номера строки с выравниванием по правому краю, также добавляется значение, заданное «indent»; выходные строки объединяются без уменьшения длины. В зависимости от значения смещения страницы по горизонтали (регулируется запросом «po»), номера строк, длина которых превышает зарезервированное место, выступают влево, либо вся строка смещается вправо.

Параметры, соответствующие отсутствующим аргументам, не изменяются. Любой нецифровой аргумент (любой аргумент, начинающийся с символа, допустимого в качестве разделителя для идентификаторов) считается отсутствующим.

Если нумерация строк была отключена вызовом «nm» без аргумента, ее можно повторно активировать с помощью запроса «.nm +0», при этом применяются ранее заданные параметрры.

Параметры «nm» связаны с окружением. Текущий номер строки вывода доступен в числовом регистре «ln».

.po 1m
.ll 2i
This test shows how line
numbering works with groff.
.nm 999
This test shows how line
numbering works with groff.
.br
.nm xxx 3 2
.ll
‐\w’0’u
This test shows how line numbering works with groff.
.nn 2
This test shows how line numbering works with groff.
This test shows how
line numbering works
999 with groff. This
1000 test shows how line
1001
numbering works with
1002 groff.
This test shows how
line
numbering
works with groff.
This test shows how
1005 line
numbering
works with groff.
• Request: «.nn» [skip]

Запрос временно отключит нумерацию строк. Аргумент — количество строк, которые не следует нумеровать, по умолчанию 1.

• Request: «.mc» glyph [dist]

Запрос выведет «знак поля» справа от текста. Первый аргумент ‐ глиф вывода. Второй аргумент — расстояние от правого поля. Если аргумент отсутствует, используется ранее установленное значение (по умолчанию 10pt). Для длинных текстовых строк (длина текста + «dist»), символ поля добавляется непосредственно к строкам. Без аргументов символ поля отключен.

Чтобы обеспечить совместимость с troff AT&T вызов «mc» не может быть немедленно отменен, и по крайней мере к одной строке будет добавлен символ.

.ll 1i
.mc \[br]
.mc
xxx
.br
xxx
В пустых строках и строках, созданных запросом «tl», символ поля не выводится. Он связан с текущей средой.

Запрос полезен для маркировки измененного текста, и, собственно, программы «nrchbar» и «changebar» облегчают процесс.

.ll 3i
.mc |
This paragraph is
highlighted with a margin
character.
.sp
Note that
vertical space isn’t marked.
.br
\&
.br
But
we can fake it with xxx’
test:5: backtrace: macro test’
• Request: «.psbb» filename

• Register: «\n[llx]»

• Register: «\n[lly]»

• Register: «\n[urx]»

• Register: «\n[ury]»

Запросы встраивают ограничивающую рамку изображения POSTSCRIPT, найденного в «filename». Файл должен соответствовать «Соглашениям о структурировании документов» (Document Structuring Conventions); команда ищет комментарий «%%BoundingBox», извлекает значения ограничительной рамки в числовые регистры «llx», «lly», «urx» и «ury». Если возникает ошибка (например, «psbb» не может найти комментарий «%%BoundingBox»), четыре числовых регистра устанавливаются в ноль.

Путь поиска для «filename» можно контролировать с помощью параметрра командной строки «‐I».

Внутренние преобразования gtroff

Программа gtroff обрабатывает ввод в три этапа. Один или несколько входных символов преобразуются во «входной токен». Затем токены преобразуются в «выходной узел». Наконец, выходные узлы транслируются в промежуточный язык, понятный всем устройствам вывода.

Перед выполнением первого шага gtroff преобразует определенные управляющие последовательности в зарезервированные входные символы (недоступные для пользователя); такие зарезервированные символы применяются для внутренней обработки, поэтому не все символы допустимы для ввода.

Например, входная строка «fi\[:u]» транслируется в символьный маркер «f», символьный маркер «i» и специальный маркер «:u» (умляут). Позже токены символов «f» и «i» объединяются в один выходной узел, создающий глиф лигатуры «fi» (при условии, что текущий шрифт имеет глиф для этой лигатуры), то же самое происходит с «:u». Все узлы выходных глифов связаны с настройкой шрифта: размером, шириной и т.д.

В процессе форматирования gtroff самостоятельно добавляет узлы для управления потоком данных.

Макросы, диверсии, строки собирают элементы в два связанных списка: список входных токенов, которые были переданы необработанными, и список выходных узлов.

Обратите внимание, запрос «chop» уменьшает количество элементов в макросе, строке, диверсии на единицу. Исключениями считаются маркеры ввода «совместимости» и «игнорирование совместимости». Запрос «substring» также игнорирует входные токены.

Некоторые запросы типа «tr» или «cflags» работают только с идентификаторами глифов; связанный с ними глиф можно изменить, не разрушая ассоциацию. Особенность можно использовать для замены глифов.

.fchar \[foo] foo
.tr x \[foo]
Предположим, что мы устанавливаем дополнительный специальный шрифт «bar», имеющий глиф «foo».

.special bar
.rchar \[foo]
Поскольку глифы, определенные с помощью «fchar», ищутся перед глифами в специальных шрифтах, мы должны вызвать «rchar», чтобы удалить определение запасного глифа. Поэтому в примере «x» соответствует реальному глифу «foo».

Аргументы макроса и запроса сохраняют режим совместимости.

.cp 1 \’’ switch to compatibility mode
.de xx
\
..
.cp 0 \’’ switch compatibility
mode off
.xx caf\[’e]
= caf\xE9
Поскольку при вызове «de» включен режим совместимости, макрос «xx» активирует его при выполнении. Аргумент «В» наследует статус режима совместимости, который был активен в момент вызова «xx».

После расширения параметрров маркеры сохранения и восстановления совместимости удаляются.

Отладка

Процессор gtroff сложно отладить, но есть несколько полезных функций и стратегий отладки.

• Request: «.lf» line [filename]

Запрос изменит номер строки или имя файла, которое gtroff будет использовать для вывода сообщений об ошибках и предупреждений. Здесь «line» номер входной строки.

Без аргументов запрос игнорируется.

Запрос применяется как средство отладки для документов, разбитых на множество файлов. Файлы объединяют с помощью «soelim» и других препроцессоров. Обычно запрос не вызывается вручную.

Обратите внимание, что реализации «troff» (включая исходную версию AT&T) не всегда однозначно обрабатывают «lf». Например, «line» меняет номер «текущей» строки.

• Request: «.tm» string

• Request: «.tm1» string

• Request: «.tmc» string

Запросы выводят «string» в режиме копирования на стандартный вывод ошибок.

Запрос «tm» игнорирует начальные пробелы «string»; «tm1» обрабатывает аргумент аналогично запросу «ds», ведущая двойная кавычка в «string» удаляется, чтобы разрешить начальные пробелы.

Запрос «tmc» похож на «tm1», но не добавляет новую строку.

• Request: «.ab» [string]

Запрос аналогичен «tm», но программа gtroff прекращает обработку. Без аргумента выводится предупреждение «user abort».

• Request: «.ex»

Запрос «ex» заставляет gtroff прекратить обработку.

.if \n(DB .tm debugging output
Для активации введите следующую команду.

groff ‐rDB=1 file
Если известно, что ошибок много, gtroff можно заставить подавить форматированный вывод с помощью флага «‐z».

• Request: «.pev»

Выведет содержимое текущей среды или всех определенных в настоящее время сред (как именованных, так и пронумерованных) на «stderr».

• Request: «.pm»

Выведет всю таблицу символов на «stderr». Имена всех определенных макросов, строк и отклонений печатаются вместе с их размером в байтах. Так как gtroff иногда сам добавляет узлы, возвращаемый размер может быть больше ожидаемого.

Запрос отличается от запроса troff Unix: «gtroff» сообщает размеры отклонений, игнорирует дополнительный аргумент для вывода только суммы размеров, размер не возвращается в блоках по 128 символов.

• Request: «.pnr»

Выводит имена и содержимое всех определенных в настоящее время числовых регистров на «stderr».

• Request: «.ptr»

Выводит названия и позиции всех ловушек, кроме отвлекающих ловушек и ловушек входной строки, на «stderr». Пустые слоты в списке ловушек также выводятся, потому что они могут повлиять на приоритет последующих ловушек.

• Request: «.fl»

Запрос заставит gtroff немедленно очистить вывод. В настоящее время запрос не реализован. В отличие от troff Unix, вывод TTY также передается драйверу устройства («grotty»), что делает нетривиальной задачу интерактивной коммуникации.

Запрос вызывает разрыв строки.

• Request: «.backtrace»

Выводит обратную трассировку входного стека в стандартный поток ошибок.

.de xxx
. backtrace
..
.de yyy
. xxx
..
.
.yyy
Опция «‐b» команды gtroff вызывает вариант данного запроса для каждой ошибки.

• Register: «\n[slimit]»

Включает числовой регистр «slimit», чтобы установить максимальное количество объектов во входном стеке. Если «slimit» меньше или равен 0, считается, что он не установлен.

Значение по умолчанию 1000, это константа времени компиляции.

• Request: «.warnscale» si

Установит индикатор масштабирования, используемый в предупреждениях, на значение «si». Допустимые значения для «si»: «u», «i», «c», «p» и «P». При запуске программы установлено значение «i».

• Request: «.spreadwarn» [limit]

Заставит gtroff выдавать предупреждение, если дополнительный пробел, вставленный между словами в строке вывода, больше или равен «limit». Отрицательное значение заменяется на ноль, ни один аргумент не включает и не выключает предупреждение без изменения «limit». Индикатор масштабирования по умолчанию «m». При запуске деактивирован, «limit» установлен на 3m.

.spreadwarn 0.2m
Здесь вызывается предупреждение, если gtroff должен добавить 0,2m или более для каждого пробела в строке.

Этот запрос активен, только если текст выровнен по обоим полям с помощью запроса «.ad b».

Программа gtroff имеет параметрры командной строки для печати дополнительных предупреждений («‐w») и для вывода данных трассировки («‐b») при возникновении предупреждения или ошибки. Вывод подробных предупреждений «‐ww».

• Request: «.warn» [flags]

• Register: «\n[.warn]»

Контроль уровня проверяемых предупреждений. Опция «flags» ‐ сумма чисел, связанных с каждым предупреждением, которое должно быть включено, все остальные предупреждения отключены. Например, «.warn 0» отключает все предупреждения, а «.warn 1» отключает все предупреждения, кроме предупреждения об отсутствующих глифах. Если аргумент не указан, все предупреждения включены.

Доступный только для чтения числовой регистр «.warn» содержит текущий уровень предупреждения.

Предупреждения и ошибки

Предупреждения, которые может вывести gtroff, делятся на категории. Имя, связанное с каждым предупреждением, используется опциями «‐w» и «‐W», номер используется запросом «warn» и регистром «.warn».

«char»

«1»

Несуществующие глифы. Включено по умолчанию.

«number»

«2»

Недопустимые числовые выражения. Включено по умолчанию.

«break»

«4»

В режиме заливки линии, которые нельзя разорвать так, чтобы их длина была меньше длины линии. Предупреждение включено по умолчанию.

«delim»

«8»

Отсутствуют или не совпадают закрывающие разделители.

«el»

«16»

Использование запроса «el» без соответствующего запроса «ie».

«scale»

«32»

Бессмысленное масштабирование индикаторов.

«range»

«64»

Аргументы вне допустимого диапазона.

«syntax»

«128»

Сомнительный синтаксис числовых выражениях.

«di»

«256»

Запрос «di» или «da» без аргумента.

«mac»

«512»

Использование неопределенных строк, макросов и диверсий. Когда используется неопределенная строка, макрос или диверсия, строка автоматически определяется как пустая. Таким образом, в большинстве случаев выдается не более одного предупреждения.

«reg»

«1024»

Использование неопределенных числовых регистров. Когда применяется регистр с неопределенным номером, регистр автоматически определяется как имеющий значение 0.

«tab»

«2048»

Использование символа табуляции вместо числа.

«right‐brace»

«4096»

Использование «\}» там, где ожидалось число.

«missing»

«8192»

Запросы, в которых отсутствуют необязательные аргументы.

«input»

«16384»

Недопустимые вводимые символы.

«escape»

«32768»

Нераспознанные управляющие последовательности. Когда встречается нераспознанная escape‐последовательность «\X», escape‐символ игнорируется и выводится «X».

«space»

«65536»

Отсутствует пробел между запросом или макросом и его аргументом. Предупреждение выдается, когда встречается неопределенное имя длиннее двух символов, а первые два символа имени составляют определенное имя. Запрос или макрос не вызывается. При появлении этого предупреждения макрос автоматически не определяется. Включено по умолчанию. Предупреждение никогда не выводится в режиме совместимости.

«font»

«131072»

Несуществующие шрифты. Включено по умолчанию.

«ig»

«262144»

Недопустимые escape‐последовательности в тексте игнорируются при запросе «ig».

«color»

«524288»

Предупреждения, связанные с цветом.

«file»

«1048576»

Отсутствуют файлы. Запрос «mso» выдает это предупреждение, когда запрошенный файл макроса не существует. Включено по умолчанию.

«all»

Все предупреждения, кроме «di», «mac» и «reg». Предполагается, что охватывает все предупреждения традиционных пакетов макросов.

«w»

Все предупреждения.

Особенности программы troff

GNU troff имеет ряд особенностей, вызывающих несовместимость с документами, написанными с помощью старых версий troff. Например, длинные имена несовместимы с troff Unix.

Также troff Unix интерпретирует «\*[» или «\n[» как ссылку на строку или числовой регистр, называемый «[». Однако в GNU troff это обычно интерпретируется как начало длинного имени. В режиме совместимости GNU troff интерпретирует длинные имена традиционным способом (они не распознаются как имена).

• Request: «.cp» [n]

• Request: «.do» cmd

• Register: «\n[.C]»

Если аргумент «n» отсутствует или отличен от нуля, включается режим совместимости, в противном случае режим выключен.

Доступный только для чтения числовой регистр «.C» равен 1, если включен режим совместимости, 0 в противном случае.

Режим совместимости также можно включить с помощью параметрра командной строки «‐C».

Запрос «do» выключает режим совместимости при выполнении как команды gtroff. Однако режим не отключается при обработке самого макроса.

.do fam T
(Выполняется запрос «fam» при включенном режиме совместимости.)

Программа gtroff восстанавливает предыдущую настройку совместимости перед интерпретацией любых файлов, полученных с помощью «cmd».

Две другие функции контролируются «‐C».

.ds xx ’
\w’abc\*(xxdef’
В режиме совместимости возвращается строка «72def’»; без «‐C» результирующая строка будет «168» (при условии, что устройство вывода TTY).

Последовательности «\f», «\H», «\m», «\M», «\R», «\s» и «\S» прозрачны в начале строки только в режиме совместимости.

.de xx
Hello!
..
\fB.xx\fP
(Выводится «Hello!» жирным шрифтом в режиме совместимости, в противном случае «.xx».)

GNU troff не позволяет использовать управляющие последовательности «\|», «\^», «\&», «\{», «\}», «\SP», «\’», «‘», «\‐», «\_», «\ !», «\%», «\c» в именах строк, макросов, ловушек, регистров, шрифтов или окружений; программа troff Unix разрешает эти последовательности. Управляющая последовательность «\A» помогает избегать применения этих последовательностей в именах.

В troff Unix запрос «ps» игнорирует индикаторы масштаба.

.ps 10u
(Устанавливает размер пункта на 10pt, тогда как в GNU troff устанавливаетcz в 10 масштабированных пунктов.)

В GNU troff существует фундаментальное различие между неформатированными входными символами и форматированными выходными глифами. Все, что влияет на вывод глифа, хранится в узле глифа. Как только глиф‐узел построен, на него не влияют любые последующие выполняемые запросы, включая запросы «bd», «cs», «tkf», «tr» или «fp». Обычно глифы строятся из входных символов непосредственно перед добавлением глифа в текущую строку вывода.

Макросы, диверсии и строки — это, по сути, объекты одного и того же типа, они содержат списки вводимых символов и узлов глифов в любой комбинации. Узел глифа не ведет себя как входной символ при обработке макросов; он не наследует каких‐либо специальных свойств, которые мог иметь входной символ.

.di x
.br
.di
.x
Здесь каждая пара входных обратных косых черт превращается в одну выходную обратную косую черту, результирующие выходные черты не интерпретируются как escape‐символы при повторном чтении. Программ troff Unix интерпретировала бы их как управляющие символы, на выходе оставляя лишь «\».

Правильный способ выводить обратную косую черту — применить escape‐последовательность «\e», что всегда выводит один escape‐символ. Метод работает как в GNU troff, так и в Unix troff.

Чтобы сохранить управляющую последовательность в переадресации, используйте либо «\ !», либо «\?».

Препроцессоры

Программа groff включает несколько препроцессоров, например, находящиеся в свободном доступе препроцессоры geqn, gtbl, gpic, ggrn, grap, gchem, grefer, gsoelim, preconv.

Постпроцессор grotty

Постпроцессор «grotty» транслирует вывод GNU troff в форму, пригодную для работы с устройствами, подобными пишущим машинкам. Полностью задокументирован на странице руководства.

Постпроцессор «grotty» принимает следующие параметрры командной строки.

«‐b»

Отменяет зачеркивание жирных символами. Игнорируется, если не указана опция «‐c».

«‐B»

Не подчеркивает глифы, выделенные жирным курсивом. Игнорируется, если «‐c» не используется.

«‐c»

Применяет наложение и отключает цвета для печати на устаревших телетайп‐принтерах.

«‐d»

Не отображает строки, игнорирует все escape‐последовательности «\D».

«‐f»

Использует в выводе символы управления подачей страницы.

«‐F dir»

Ищет каталог «dir/dev.name» перед поиском файлов шрифтов и описаний с учетом «name» целевого устройства.

«‐h»

Применяет горизонтальные табуляции из 8 символов пробела.

«‐i»

Запрашивает курсивные глифы терминала. Игнорируется, если активен параметрр «‐c».

«‐r»

Выделение глифов курсивом. Игнорируется, если «‐c» активен.

«‐u»

Не подчеркивает глифы, выделенные курсивом. Игнорируется, если «‐c» не активен.

«‐U»

Не зачеркивает глифы, выделенные полужирным курсивом. Игнорируется, если «‐c» не используется.

«‐v»

Выведет номер версии программы.

Режим «‐c» для устройств вывода TTY означает, что подчеркивание выполняется с помощью последовательностей «_» и «^H» (символ возврата) перед фактическим символом подчеркивания. Таким образом, выводится символ подчеркивания, затем курсор перемещается назад на одну позицию и повторно печатает символ (как на пишущей машинке). Современный терминал не способен интерпретировать подобную команду. Поэтому требуется программа‐пейджер («less»), которая переводит символы последовательности ISO 6429 SGR.

Постпроцессор grops

Постпроцессор «grops» транслирует вывод GNU troff в форму для работы устройств Adobe POSTSCRIPT. Полностью задокументирован на странице руководства.

Постпроцессор «grops» принимает следующие параметрры командной строки.

«‐b flags»

Применяет параметрры обратной совместимости, заданные «flags», как описано на странице руководства «grops». Отменяет команду «broken» в файле DESC.

«‐c n»

Выводит «n» копий каждой страницы.

«‐F dir»

Добавляет каталог «dir/dev.name» перед путем поиска файлов шрифта, описания устройства, учитывая «name» целевого устройства (обычно «ps»).

«‐g»

Требует от принтера рассчитать длину страницы. Это помогает при печати вертикально центрированных страниц, когда размеры бумаги определяются во время печати.

«‐I path ...»

Учитывает каталог «path» для поиска включенных файлов, указанных с относительными путями. Текущий каталог считается альтернативным.

«‐l»

Применяет альбомную ориентацию.

«‐m»

Разрешает ручную регулировку.

«‐p papersize»

Установит размеры страницы. Отменяет команды «papersize», «paperlength» и «paperwidth» в файле DESC.

«‐P prologue»

Использует аргумент «prologue» в пути к шрифту вместо «prologue» по умолчанию. Переопределяет переменную среды «GROPS_PROLOGUE».

«‐w n»

Установит толщину линии n / 1000em. Переопределяет значение по умолчанию n = 40.

«‐v»

Выводит версию программы.

Встроенный POSTSCRIPT

Последовательность выхода:

:: «\X’ps: import file llx lly urx ury width [height]’»

Размещает прямоугольник указанной «width», содержащий рисунок POSTSCRIPT из файла «file»; ограничивает прямоугольник вывода от «llx», «lly» до «urx», «ury» (в координатах POSTSCRIPT) в точке вставки. Если аргумент «height» не указан, масштабируется пропорционально.

Управляющая последовательность используется внутри макрокоманды «PSPIC».

Постпроцессор gropdf

Постпроцессор «gropdf» транслирует вывод GNU troff в форму, подходящую для устройств Adobe PDF.

Постпроцессор «gropdf» принимает следующие параметрры командной строки.

«‐d»

Создает несжатые PDF‐файлы, содержащие отладочные комментарии.

«‐e»

Встраивает все применяемые шрифты в PDF, даже если это базовые шрифты Adobe.

«‐F dir»

Ищет каталог «dir/dev.name» перед путем поиска файлов шрифта, пролога и описания устройства, с учетом «name» целевого устройства (обычно «pdf»).

«‐y foundry»

Изменяет шрифт.

«‐l»

Применяет альбомную ориентацию.

«‐p papersize»

Установит размеры страницы. Отменяет команды «papersize», «paperlength» и «paperwidth» в файле DESC.

«‐v»

Выводит версию программы.

«‐s»

Добавит строку комментария статистики в конец PDF‐файла, т.е. количество страниц в документе. Ghostscript в этом случае выводит ошибку.

«‐u filename»

«Ggropdf» обычно включает CMap ToUnicode с любым шрифтом, созданным с использованием «text.enc» в качестве файла кодировки, что упрощает поиск слов, содержащих лигатуры. Но допускается включать собственный CMap, указывая «filename» или отключая CMap.

Команды PDF

:: «\X’pdf: pdfpic file alignment width [height] [linelength]’»

Размещает прямоугольник заданной «width» (высоты), содержащий PDF из файла «file» нужной «width» и «height». Если аргумент «height» отсутствует или равен нулю, масштабируется пропорционально. Если «alignment» равен «‐L», рисунок выравнивается по левому краю. Если «‐C» или «‐R», следует указать «linelength» больше ширины. Если «width» равен нулю, ширина масштабируется пропорционально высоте.

Постпроцессор grodvi

Постпроцессор «grodvi» транслирует вывод GNU troff в выходной формат DVI, совместимый с системой подготовки документов TeX. Полностью задокументирован на странице руководства.

Постпроцессор «grodvi» принимает следующие параметрры командной строки.

«‐d»

Отключает «tpic» для команд рисования.

«‐F dir»

Размещает каталог «dir/dev.name» перед путем поиска файлов шрифтов и описания устройства, с учетом «name» целевого устройства (обычно «dvi»).

«‐l»

Применяет альбомную ориентацию.

«‐p papersize»

Установит размеры страницы. Отменяет команды «papersize», «paperlength», «paperwidth» в файле DESC.

«‐v»

Выводит версию программы.

«‐w n»

Установит толщину линии n / 1000em. Переопределяет значение по умолчанию n = 40.

Постпроцессор grolj4

Постпроцессор «grolj4» транслирует вывод GNU troff в выходной формат PCL5, пригодный для печати на принтере HP LaserJet 4. Полностью задокументирован на странице руководства.

Постпроцессор «grolj4» принимает следующие параметрры командной строки.

«‐c n»

Выводит «n» копий каждой страницы.

«‐F dir»

Поместит каталог «dir/dev.name» перед путем поиска файлов описания шрифта и устройства, с учетом «name» целевого устройства (обычно «lj4»).

«‐l»

Применит альбомную ориентацию.

«‐p size»

Задает размеры страницы. Допустимые размеры («size»): «letter», «legal», «executive», «a4», «com10», «monarch», «c5», «b5», «d1».

«‐v»

Выведет номер версии программы.

«‐w n»

Установит толщину линии n / 1000em. Переопределяет значение по умолчанию n = 40.

Специальная команда «\D’R dh dv’» рисует горизонтальный прямоугольник из текущей позиции в позицию со смещением [dh, dv].

Постпроцессор grolbp

Постпроцессор «grolbp» транслирует вывод GNU troff в выходной формат LBP, пригодный для печати на принтерах Canon CAPSL. Полностью задокументирован на странице руководства.

Постпроцессор «grolbp» принимает следующие параметрры командной строки.

«‐c n»

Выводит «n» копий каждой страницы.

«‐F dir»

Поместит каталог «dir/dev.name» перед путем поиска файлов шрифта, пролога и описания устройства, учитывая «name» целевого устройства (обычно «lbp»).

«‐l»

Применит альбомную ориентацию.

«‐o orientation»

Применит «книжную» или «альбомную» ориентации.

«‐p papersize»

Установит размеры страницы.

«‐w n»

Установит толщину линии n / 1000em. Переопределяет значение по умолчанию n = 40.

«‐v»

Выводит номер версии программы.

«‐h»

Выведет справку.

Постпроцессор grohtml

Внешний интерфейс «grohtml», состоящий из препроцессора «pre‐grohtml» и драйвера устройства «post‐grohtml», транслирует вывод GNU troff в HTML. Следует всегда вызывать «grohtml» командой groff с опцией «‐Thtml». Если файлы не указаны, «grohtml» будет читать стандартный ввод. Имя файла «‐» также заставит «grohtml» читать стандартный ввод. Вывод HTML записывается в стандартный вывод. Когда «grohtml» запускается groff, параметрры могут быть переданы постпроцессору с помощью опции «‐P».

Программа «grohtml» вызывается дважды. При первом проходе изображения, уравнения и таблицы визуализируются с помощью устройства «ps», затем вывод в формате HTML генерируется устройством «html».

Программа «grohtml» всегда записывает вывод в кодировке «UTF‐8», имеет встроенные объекты для несоставных символов Unicode. Однако groff может выдавать предупреждения о неизвестных спецсимволах, если их не удается найти при первом проходе. Предупреждения можно игнорировать, если специальные символы не входят в таблицы или уравнения. В этом случае глифы символов также должны быть определены для устройства «ps».

Устройство вывода полностью задокументировано на странице руководства «grohtml».

Постпроцессор «grohtml» принимает следующие параметрры командной строки.

«‐a bits»

Использует количество «bits» (1, 2 или 4) для сглаживания текста. По умолчанию bits=4.

«‐a0»

Не сглаживает текст.

«‐b»

Применит белый фон.

«‐D dir»

Будет сохранять отрендеренные изображения в каталоге «dir».

«‐F dir»

Ищет каталог «dir/dev.name» перед путем поиска файлов шрифта, пролога и описания устройства, с учетом «name» целевого устройства (обычно «html»).

«‐g bits»

Использует количество «bits» (1, 2 или 4) для сглаживания рисунков. По умолчанию bits=4.

«‐g0»

Отключает сглаживание для рисунков.

«‐h»

Применит элемент «B» для заголовков разделов.

«‐i resolution»

Использует «resolution» для визуализированных изображений. По умолчанию resolution = 100dpi.

«‐I stem»

Задает «stem name» изображений. По умолчанию «stem» определен как «grohtml‐XXX» (XXX — идентификатор процесса).

«‐j stem»

Размещает каждый раздел в отдельный файл с именем «stem‐n.html» (где «n» номер созданного раздела).

«‐l»

Оглавление не создается.

«‐n»

Создает простые идентификаторы фрагментов.

«‐o offset»

Вставит вертикальный отступ «offset» перед изображениями.

«‐p»

Отображение прогресса рендеринга страницы в «stderr».

«‐r»

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

«‐s size»

Задает базовый размер шрифта, который будет изменяться с помощью элементов BIG и SMALL.

«‐S level»

Создаст отдельные файлы для разделов на уровне «level».

«‐v»

Выведет номер версии программы.

«‐y»

Создает подпись groff после валидатора, если он есть.

Специальные регистры и строки grohtml

• Register: «\n[ps4html]»

• String: «\*[www‐image‐template]»

Регистры «ps4html» и «www‐image‐template» определяются препроцессором «pre‐grohtml». Препроцессор «pre‐grohtml» читает ввод troff, размечает встроенные уравнения и передает результат далее.

troff ‐Tps ‐rps4html=1 ‐dwww‐image‐
template = template
troff ‐Thtml
troff ‐Txhtml
Устройство POSTSCRIPT используется для создания всех файлов изображений (опция «‐Thtml» передает все уравнения в «geqn»); «ps4html» позволяет наборам макросов игнорировать плавающие блоки, нижние колонтитулы и заголовки.

В реестре «www‐image‐template» указано имя шаблона пользователя или имя по умолчанию.

Промежуточные форматы вывода

В этом разделе описывается промежуточный формат вывода GNU troff. Вывод создается gtroff до того, как происходит загрузка в программу постпроцессора устройства.

Поскольку «groff» является программой‐оболочкой «gtroff», автоматически вызывающей постпроцессор, вывод не способен полноценно отображаться. Поэтому его называют «промежуточным». Программа groff предоставляет опцию «‐Z» для запрета постобработки, при этом промежуточный вывод отправляется на стандартное устройство.

Также термин «вывод troff» описывает вывод gtroff, а «промежуточный вывод» относится к языку, который принимается синтаксическим анализатором, подготавливающим этот вывод для постпроцессоров. (Синтаксический анализатор лучшесправляется с пробелами и реализует форматирование устаревших элементов.)

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

Промежуточный вывод довольно читабелен, но это не касается вывода troff AT&T.

Язык промежуточного формата ограниченный. Единственными элементами считаются команды с аргументами или без них. В этом разделе термин «команда» всегда относится к промежуточному языку вывода и никогда не применяется к языку форматирования документа gtroff. Также известны команды позиционирования и ввода текста, команды рисования и управления устройством.

Пробелы и табуляторы

Программа troff AT&T встраивает пробелы по сложным алгоритмам. Однако синтаксический анализатор вывода gtroff разумно относится к пробелам. Символы пробела, то есть символы табуляции, пробела и новой строки, всегда имеют определенное значение. Они никогда не печатаются, потому что интервалы внутри вывода задаются командами позиционирования.

Любая последовательность символов пробела или табуляции рассматривается как один синтаксический пробел. Он разделяет команды и аргументы, но требуется только тогда, когда может возникнуть конфликт между кодом команды и аргументами без пробела. Чаще всего это происходит, если встречаются имена команд переменной длины, аргументы, списки аргументов или объединения команд. Команды и аргументы с известной фиксированной длиной не должны разделяться синтаксическим пробелом.

Разрыв строки также является синтаксическим элементом. За каждым аргументом команды может следовать пробел, комментарий или символ новой строки. Поэтому «синтаксический разрыв строки» определяется как состоящий из необязательного синтаксического пробела, за которым необязательно следует комментарий и символ новой строки.

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

Команды для рисования и управления устройствами имеют более сложную структуру ‐ некоторые распознают длинные имена команд, а некоторые принимают переменное количество аргументов. Команды «D» и «x» были разработаны для запроса синтаксического разрыва строки после последнего аргумента. Только одна команда «x X» имеет аргумент, который может занимать несколько строк, в остальных случаях аргументы не могут быть разделены разрывом строки.

Строки, содержащие только пробел или комментарий, могут встречаться везде, но они игнорируются.

Командные аргументы

Некоторые команды принимают целочисленные аргументы, которые, как предполагается, представляют значения в единицах измерения, но буква для соответствующего индикатора шкалы не записывается в аргументах команды. Большинство команд предполагает индикатор масштаба «u» (базовая единица), некоторые используют «z» (единица масштабирования устройства), в то время как другие принимают только целые числа.

Обратите внимание, что одиночные символы могут иметь установленный восьмой бит. Названия символов и шрифтов могут быть произвольной длины. Символ, который должен быть напечатан, всегда находится в текущем шрифте. Строковый аргумент заканчивается пробельным символом (пробелом, табуляцией или знаком новой строки); встроенный символ «’» рассматривается как часть аргумента, а не как начало команды комментария. Целочисленный аргумент заканчивается следующим нецифровым символом, затем он считается первым символом следующего аргумента или команды.

Опредение промежуточного документа

Правильный выходной документ состоит из двух частей: «пролога» и «тела».

Задача пролога ‐ установить общие параметрры устройства с помощью трех точно заданных команд. Пролог gtroff гарантированно состоит из следующих трех строк (именно в таком порядке):

x T «device»
x res «n» «h» «v»
x init
Обратите внимание, что синтаксический анализатор промежуточного формата вывода может пропускать дополнительные пробелы и комментарии даже в прологе.

Основной раздел для обработки данных документа – это тело. Синтаксически это последовательность любых команд, отличных от используемых в прологе. Обработка прекращается, как только встречается первая команда «x stop»; последняя строка любого промежуточного вывода «gtroff» всегда содержит эту команду.

Семантически тело ориентировано на страницы. Новая страница запускается командой «p». Команды позиционирования, записи и рисования всегда выполняются на текущей странице, они не могут выполняться перед первой командой «p». Абсолютное позиционирование (команды «H» и «V») производится относительно текущей страницы, все остальное позиционирование выполняется относительно текущего местоположения на этой странице.

Команды промежуточного вывода

В этом разделе описаны команды промежуточного вывода AT&T troff и gtroff.

«anything»<end of line>

Комментарий. Игнорируются любые символы от «’» до следующего символа новой строки.

Команда является единственной формой комментирования промежуточного вывода. Каждому комментарию может предшествовать произвольный синтаксический пробел; каждая команда может быть завершена комментарием.

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

Разделяющий синтаксический пробел необходим только в том случае, если два целочисленных аргумента конфликтуют или если предыдущий аргумент заканчивается строковым аргументом.

«C xxx»<whitespace>

Выводит специальный символ с именем «xxx». Завершающий синтаксический пробел, разрыв строки необходимы, чтобы разрешить имена глифов произвольной длины. Глиф печатается в текущей позиции, размер глифа считывается из файла шрифта. Положение печати не изменяется.

«c g»

Выводит глиф «g» в текущей позиции печати, размер глифа считывается из файла шрифта. Положение печати не изменяется.

«f n»

Установит для шрифта номер «n» (неотрицательное целое число).

«H n»

Перемещение вправо на абсолютную позицию по вертикали «n».

«h n»

Переместит «n» (неотрицательное целое число) на «u» по горизонтали вправо. Оригинальное руководство troff также допускает отрицательные значения для «n», но gtroff не поддерживает эту форму записи.

«m color‐scheme [component ...]»

Задает цвет текста (глифов), линий и контура графических объектов; аналогичная команда для заливки цветом графических объектов вызывается «DF». Цветовые компоненты указываются как целые аргументы от 0 до 65536. Количество цветовых компонентов и их значения различаются для разных цветовых схем. Эти команды генерируются управляющей последовательностью gtroff «\m».

«mc cyan magenta yellow»

Установит цвет с помощью цветовой схемы CMY, включающую 3 цветовых компонента: «голубой», «пурпурный» и «желтый».

«md»

Установит цвет по умолчанию (в большинстве случаев черный). Нет аргументов.

«mg gray»

Задает оттенок серого, аргумент ‐ целое число от 0 (черный) до 65536 (белый).

«mk cyan magenta yellow black»

Установит цвет, используя цветовую схему CMYK, имеющую 4 цветовых компонента: «голубой», «пурпурный», «желтый» и «черный».

«mr red green blue»

Установит цвет в цветовой схеме RGB: «красный», «зеленый» и «синий».

«N n»

Выведет глиф с индексом «n» (неотрицательное целое число) текущего шрифта. Является расширением gtroff.

«n b a»

Сообщит устройству о разрыве строки, но команда не выполняет позиционирование. В troff AT&T целочисленные аргументы «b» и «a» информировали о пробеле до и после текущей строки, чтобы сделать промежуточный вывод удобочитаемым. В groff они игнорируются, но предусмотрены из соображений совместимости.

«p n»

Начало новой страницы в распечатке. Номер страницы установлен на «n». Эта страница полностью независима от ранее обработанных страниц, даже если они имеют тот же номер. Вертикальное положение на отпечатке автоматически устанавливается равным 0. Позиционирование, запись и рисование выполняются относительно страницы, поэтому перед любой командой должна быть введена команда «p».

«s n»

Установит размер точки в «n» масштабированных точек (единица измерения «z»). Ранее программа troff AT&T использовала единицы измерения «p».

«t xxx»<whitespace>

«t xxx dummy‐arg»<whitespace>

Выведет слово, т.е. последовательность символов «xxx», представляющую выходные глифы, имена которых состоят из одиночных символов, заканчивающихся пробелом или разрывом строки; необязательный второй целочисленный аргумент игнорируется.

Первый глиф должен быть напечатан в текущей позиции, затем текущая горизонтальная позиция должна быть увеличена на ширину первого глифа и так далее для каждого глифа. Ширина глифов считывается из файла шрифта, масштабируется для текущего размера и округляется до кратного горизонтального разрешения.

С помощью этой команды нельзя выводить специальные символы (используйте команду «C» для специальных символов). Команда является расширением gtroff для устройств, у которых файл DESC содержит ключевое слово «tcommand».

«u n xxx»<whitespace>

Добавляет кернинг. Результат такой же, как для команды «t», однако после печати каждого глифа текущая позиция по горизонтали увеличивается на сумму ширины глифа и «n» (целое число в основных единицах «u»). Команда является расширением gtroff, используется только для устройств, файл DESC которых содержит ключевое слово «tcommand».

«V n»

Перемещение вниз на абсолютную позицию по вертикали «n» (неотрицательное целое число в основных единицах «u») относительно верхнего края текущей страницы.

«v n»

Перемещение на «n» базовых единиц «u» вниз (n — целое неотрицательное число). Оригинальное руководство Unix troff также допускает отрицательные значения для «n».

«w»

Сообщает о дополняемом пробеле для удобочитаемости.

Команды для работы с графикой

Каждая команда графики или рисования в промежуточном выводе начинается с буквы «D», за которой следует один или два символа, определяющие субкоманду; за символом следует фиксированное или переменное количество целочисленных аргументов, разделенных одним символом пробела. За командой «D» в той же строке не может следовать другая команда, кроме комментария, поэтому «D» завершается синтаксическим разрывом строки.

Вывод gtroff руководствуется классическим правилам работы с пробелами, но синтаксический анализатор допускает пробел между командными буквами, что делает пробел перед первым аргументом необязательным.

Некоторые графические команды могут принимать переменное количество аргументов. В данном случае это целые числа, представляющие размер, измеренный в основных единицах «u». Аргументы, называемые «h1», «h2», «hn» обозначают горизонтальные расстояния, где положительное значение смещает в правую сторону, отрицательное в левую. Аргументы, называемые «v1», «v2», «vn» обозначают расстояния по вертикали, где положительное подразумевает смещение вниз, отрицательное вверх. Все расстояния являются смещениями относительно текущего местоположения.

Каждая графическая команда напрямую соответствует аналогичной управляющей последовательности gtroff «\D».

Предполагается, что команды «D» относятся к конкретному устройству. Аргументы анализируются как строки, вся информация отправляется в постпроцессор.

«D~ h1 v1 h2 v2 ... hn vn»<line break>

Рисует B‐сплайн от текущей позиции до смещения [«h1», «v1»], затем до смещения [«h2», «v2»], и до [«hn», «vn»]. Команда принимает переменное количество пар аргументов; текущая позиция перемещается в конечную точку нарисованной кривой.

«Da h1 v1 h2 v2»<line break>

Рисует дугу из текущей позиции в [«h1», «v1»]+[«h2», «v2»] с центром в [«h1», «v1»]; затем перемещает текущую позицию в конечную точку дуги.

«DC d»<line break>

«DC d dummy‐arg»<line break>

Рисует сплошной круг с текущим цветом заливки диаметром «d» (целое число в основных единицах «u») с крайней левой точкой в текущей позиции; затем перемещает текущую позицию в крайнюю правую точку круга. Необязательный второй целочисленный аргумент игнорируется.

«Dc d»<line break>

Рисует линию окружности диаметром «d» (целое число в основных единицах «u») с крайней левой точкой в текущем положении; затем перемещает текущую позицию в крайнюю правую точку круга.

«DE h v>»<line break>

Рисует сплошной эллипс текущим цветом заливки с горизонтальным диаметром «h» и вертикальным диаметром «v» (целые числа в основных единицах «u») с крайней левой точкой в текущей позиции; затем перемещает в крайнюю правую точку эллипса.

«De h v»<line break>

Рисует очерченный эллипс с горизонтальным диаметром «h» и вертикальным диаметром «v» (целые числа в основных единицах измерения «u») с крайней левой точкой в текущей позиции; затем перемещает указатель в крайнюю правую точку эллипса.

«DF color‐scheme [component ...»<line break>

Задает цвет заливки для сплошных объектов с разными цветовыми схемами; «m» ‐ аналогичная команда для установки цвета текста, линейной графики и контура графических объектов. Цветовые компоненты указываются как целые аргументы от 0 до 65536. Количество цветовых компонентов и их значение различаются для разных цветовых схем. Эти команды генерируются управляющими последовательностями gtroff «\D’F’» и «\M».

«DFc cyan magenta yellow»<line break>

Задает цвет заливки для сплошных объектов рисования, применяется цветовая схема CMY с 3 цветовыми компонентами: «голубой», «пурпурный» и «желтый».

«DFd»<line break>

Установит цвет заливки для сплошных объектов рисования на значение цвета по умолчанию (в большинстве случаев черный). Нет аргументов.

«DFg gray»<line break>

Установит цвет заливки для сплошных объектов рисования в оттенок серого, заданный аргументом, где аргумент целое число от 0 (черный) до 65536 (белый).

«DFk cyan magenta yellow black»<line break>

Установит цвет заливки для сплошных объектов рисования с помощью цветовой схемы CMYK, имеющей 4 цветовых компонента: «голубой», «пурпурный», «желтый» и «черный».

«DFr red green blue»<line break>

Установит цвет заливки для сплошных объектов рисования с помощью цветовой схемы RGB, имеющей 3 цветовых компонента: «красный», «зеленый» и «синий».

«Df n»<line break>

Аргумент «n» должен быть целым числом в диапазоне от ‐32767 до 32767.

• 0 <= «n» <= 1000

Установит цвет заливки сплошных объектов рисования в оттенок серого, где 0 соответствует белому, 1000 (по умолчанию) черному, иные значения — это промежуточные оттенки серого. Устаревшая команда.

• n < 0 или n > 1000

Установит цвет заливки на цвет, который в данный момент используется для текста и контура.

mg 0 0 65536
Df ‐1
(Синий цвет.)

«Dl h v»<line break>

Проводит линию от текущей позиции до смещения h, v (целые числа в основных единицах u); затем устанавливает текущую позицию в конец нарисованной линии.

«Dp h1 v1 h2 v2 hn vn»<line break>

Рисует многоугольную линию от текущей позиции до смещения [«h1», «v1»], затем до смещения [«h2», «v2»] и т.д. По историческим причинам положение изменяется путем добавления суммы всех аргументов с нечетным индексом к фактическому положению по горизонтали и четных к положению по вертикали.

«DP h1 v1 h2 v2 hn vn»<line break>

Рисует сплошной многоугольник с текущим цветом заливки.

«Dt n»<line break>

Установит текущую толщину линии в «n» (целое число в основных единицах «u»), если n > 0; если n = 0, выбирается наименьшая доступная толщина линии; если n < 0, то установит толщину линии, пропорциональную размеру точки (значение до того, как была указана первая команда Dt). По историческим причинам горизонтальное положение изменяется путем добавления аргумента к фактическому горизонтальному положению, в то время как вертикальное положение не изменяется. Хотя это не имеет смысла, алгоритм сохранен для совместимости со старыми версиями.

Команды контроля устройств

Каждая команда управления устройством начинается с буквы «x», за которой следует пробел (необязательный или произвольный пробел, табуляция в «gtroff») и буква или слово субкоманды; перед каждым аргументом (если есть) должен стоять синтаксический пробел. Все команды «x» заканчиваются синтаксическим разрывом строки, за командой управления устройством не может следовать другая команда в той же строке (кроме комментария).

Подкоманда в основном представляет собой одну букву, но для повышения читаемости ее можно записать как слово, т.е. как произвольную последовательность символов, заканчивающихся табуляцией, пробелом или символом новой строки. Все символы слова субкоманды, кроме первого, игнорируются. Например, gtroff выводит команду инициализации «x i» как «x init», а команду разрешения «x r» как «x res».

В дальнейшем элемент синтаксиса <line break> подразумевает синтаксический разрыв строки.

«xF name»<line break>

«F» имя файла. Используйте «name» в качестве предполагаемого имени для текущего файла отчета об ошибках.

«xf n s»<line break> Опция «f» подразумевает шрифт. Смонтирует позицию шрифта «n» (неотрицательное целое число) со шрифтом с именем «s» (текстовое слово).

«xH n»<line break>

Здесь «Н» это высота. Установит высоту глифа на «n» (положительное целое число в точках «z»). Версия troff AT&T использует единицы измерения «p».

«xi»<line break>

Здесь «i» это инициализация. Инициализирует устройство. Третья команда пролога.

«xp»<line break> Пауза. В оригинальном руководстве Unix troff предполагается, что устройство будет приостановлено и перезагружено.

«xr n h v»<line break>

Буква «r» означает «разрешение».

Разрешение — «n», тогда как «h» — минимальное движение по горизонтали, а «v» — минимальное движение по вертикали, возможное с этим устройством; все аргументы являются положительными целыми числами в основных единицах «u» на дюйм. Это вторая команда пролога.

«xS n»<line break>

«S» означает «Slant». Установливает наклон на «n» (целое число в основных единицах «u»).

«xs»<line break>

Здесь «s» подразумевает остановку. Завершает обработку текущего файла; выдается как последняя команда промежуточного вывода troff.

«xt»<line break>

Создает информацию о трейлере, если она есть. В gtroff игнорируется.

«xT xxx»<line break>

«T» означает «Typesetter».

Установит имя устройства как слово «xxx», последовательность символов, заканчивающуюся следующим пробелом. Возможные имена устройств совпадают с именами из варианта groff ‐T. Это первая команда пролога.

«xu n»<line break>

Буква «u» означает «подчеркивание».

Настраивает подчеркивание пробелов. Если «n» равно 1, начинается подчеркивание пробелов; если «n» равно 0, подчеркивание прекращается. Необходимо для запроса «cu» в режиме nroff, игнорируется в противном случае. Команда является расширением gtroff.

«xX anything»<line break>

Здесь «x» подразумевает «X‐escape». Отправляет строку «anything» на устройство без интерпретации. Если строка, следующая за этой командой, начинается с символа «+», строка интерпретируется как продолжение, «+» игнорируется, но на устройство отправляется символ новой строки. Остальная часть строки отправляется без интерпретации. То же самое относится ко всем последующим строкам, пока первый символ строки не является символом «+». Эта команда генерируется управляющей последовательностью gtroff «\X». Функция продолжения строки является расширением gtroff.

Устаревшие команды

В troff AT&T запись одного глифа в основном выполняется с помощью очень странной команды, которая сочетает в себе горизонтальное перемещение и один символ, дающий имя глифа. Он не имеет кода команды, но представлен 3‐символьным аргументом, состоящим из двух цифр и одного символа.

«dd g»

Перемещает вправо «dd» (ровно две десятичные цифры) основных единиц «u», затем напечатаете глиф «g» (представленный как одиночный символ).

В gtroff разрешено добавлять произвольное синтаксическое пространство вокруг и внутри этой команды. Только когда предыдущая команда в той же строке заканчивается аргументом переменной длины, разделяющий пробел обязателен. В troff AT&T используются большие группы этих и других команд, в основном без пробелов, что делает такой вывод почти не читаемым .

Для современных устройств с высоким разрешением команда не имеет смысла, поскольку ширина глифов может стать намного больше двух десятичных цифр. В gtroff она используется только для устройств «X75», «X75‐12», «X100» и «X100‐12». Для других устройств команды «t» и «u» обеспечивают лучшую функциональность.

Промежуточный вывод

В этом разделе представлены промежуточные выходные данные, созданные из одного и того же ввода для трех разных устройств.

• High‐resolution device «ps»

Стандартный вывод gtroff, если не задана опция «‐T».

shell> echo "hell world" | groff ‐Z ‐T ps
x T ps
x res 72000 1 1
x init
Этот вывод можно передать в «grops», чтобы получить его представление в виде файла POSTSCRIPT.

• Low‐resolution device «latin1»

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

• AT&T «troff» output

Поскольку монитор компьютера имеет очень низкое разрешение по сравнению с современными принтерами, промежуточный вывод для устройств X Window может использовать специальную команду перехода и запись с двузначным смещением.

shell > echo "hell world" | groff ‐Z ‐T X100
x T X100
x res 100 1 1
x init
Вывод можно передать в «xditview» или «gxditview».

Совместимость вывода

Промежуточный язык вывода AT&T troff был впервые задокументирован в руководстве Unix troff, но с более поздними дополнениями, задокументированными в «A Typesetter‐independent TROFF» и написанном Брайаном Керниганом.

Формат промежуточного вывода gtroff совместим с этой спецификацией, но за исключением следующих особенностей.

Классическая независимость от квазиустройств не реализована: старое оборудование сильно отличалось от того, что мы используем сегодня. Так что устройства groff тоже принципиально отличаются от troff AT&T. Например, устройство POSTSCRIPT компании AT&T называется «post» и имеет разрешение всего 720 единиц на дюйм, подходящее для принтеров 20‐летней давности, в то время как устройство «ps» groff имеет разрешение 72000 единиц на дюйм. Возможно, реализуя некий механизм масштабирования, аналогичный классической независимости от устройства, groff мог бы эмулировать устройство AT&T.

Команда B‐сплайна «D~» правильно обрабатывается парсером промежуточного вывода, но процедуры рисования не реализованы в некоторых программах постпроцессора.

Аргумент команд «s» и «x H» имеет неявную единицу измерения точки «z» в gtroff, в то время как troff AT&T предполагает «p». Это совместимое расширение, так как оба блока совпадают для всех устройств без параметрра «sizescale» в файле DESC, включая все постпроцессоры от AT&T и текстовые устройства groff. Немногочисленные устройства groff с параметрром «sizescale» либо не существуют для troff AT&T, либо имеют другое название, либо имеют другое разрешение. Так что конфликты маловероятны.

Изменение позиции после команд «Dp», «DP» и «Dt» нелогично, но так как старые версии gtroff использовали эту возможность, то она сохранена из соображений совместимости.

Среды и окружения

Окружение содержит большинство параметрров, управляющих обработкой текста. Окружение может быть определено как среда и в этом случае допускается переключаться между средами. По умолчанию gtroff обрабатывает текст в окружении 0.

Окружение описывает следующие данные.

1. Параметры шрифта: размер, семейство, стиль, высота и наклон глифа, размер интервала, в том числе интервала между предложениями.

2. Параметры страницы: длина строки, длина заголовка, вертикальный интервал, межстрочный интервал, отступ, нумерация строк, центрирование, выравнивание по правому краю, подчеркивание, данные переноса.

3. Режим заполнения и настройки строк.

4. Позиции табуляции, символы табуляции и заставки, escape‐символы, индикаторы отсутствия разрыва и дефиса, данные символов полей.

5. Данные частично собранных строк.

6. Входные ловушки.

7. Цвет рисунка и заливки.

Средам могут быть присвоены произвольные имена, но старые версии troff поддерживали среды с именами «0», «1» и «2».

• Request: «.ev» [env]

• Register: «\n[.ev]»

Запрос позволяет переключиться на другую среду. Аргумент «env» — имя среды переключения. Без аргументов gtroff переходит в предыдущую среду. Количество именованных сред не ограничено, они создаются при первом обращении к ним. Доступный только для чтения регистр «.ev» содержит имя или номер текущей среды. Это строковый регистр.

Обратите внимание, что вызов «ev» (с аргументом) помещает предыдущую активную среду в стек. Если, скажем, вызываются окружения «foo», «bar» и «zap» (именно в таком порядке), то первый запрос «ev» без параметрра переключается обратно на окружение «bar» (выталкивается из стека), а второй вызов переключается на среду «foo».

.ev footnote‐env
.fam N
.ps 6
.vs 8
.ll ‐.5i
.ev
...
.ev footnote‐env
\(dg Note the large, friendly letters.
.ev
• Request: «.evc» env

Скопирует среду «env» в текущую среду.

Следующие данные среды не копируются: частично заполненные строки; статус, была ли прервана предыдущая строка; количество строк, оставшихся до центрирования, выравнивания по правому краю или подчеркивания (с подчеркнутыми пробелами или без них); статус, активен ли временный отступ; входные ловушки и связанные с ними данные.

Режим нумерации строк отключен, его можно повторно активировать с помощью запроса «.nm + 0». Количество последовательных строк указывается через дефис (установлено равным нулю).

• Register: «\n[.w]»

• Register: «\n[.cht]»

• Register: «\n[.cdp]»

• Register: «\n[.csk]»

Регистр «\n[.w]» содержит ширину последнего глифа, добавленного в текущую среду.

Регистр «\n[.cht]» содержит высоту последнего глифа, добавленного в текущую среду.

Регистр «\n[.cdp]» содержит глубину последнего глифа, добавленного в текущую среду. Положительное значение для глифов ниже базовой линии.

Регистр «\n[.csk]» содержит «наклон» (правее центра глифа, где gtroff поставит ударение) последнего глифа, добавленного в текущую среду.

• Register: «\n[.n]»

Регистр «\n[.n]» содержит длину предыдущей строки вывода в текущей среде.

Подавление вывода

• Escape: «\O» num

Последовательность отключит или включит вывод в зависимости от значения «num».

Значения могут быть следующими.

«\O0»

Отключает отправку любых глифов в драйвер устройства при условии, что выход происходит на внешнем уровне (см. «\O[3]» и «\O[4]»). Движение не подавляется, «\O[0]» определенно как движение вверх.

«\O1»

Включает вывод глифов при условии, что экранирование происходит на внешнем уровне.

«\O0» и «\O1» также сбрасывают регистры «opminx», «opminy», «opmaxx» и «opmaxy» на ‐1. Эти четыре регистра отмечают верхний левый и нижний правый углы поля, которое включает в себя все написанные глифы.

Hello \O[0]world \O[1]this is a test.
«\O2»

Разрешает вывод при условии, что экранирование происходит на внешнем уровне, а также записывает в «stderr» номер страницы и четыре регистра, охватывающих ранее записанные глифы с момента последнего вызова «\O».

«\O3»

Начинает уровень вложенности. При запуске gtroff находится на внешнем уровне. Текущий уровень содержится в доступном только для чтения регистре «.O».

«\O4»

Конец уровня вложенности. Текущий уровень содержится в доступном только для чтения регистре «.O».

«\O[5 P filename]»

Последовательность специфична для «grohtml». При условии, что выход происходит на внешнем уровне вложенности, запишет «filename» в «stderr». Положение изображения «P» должно быть указано как «l», «r», «c» или «i» (слева, справа, по центру, в ряд), «filename» связано с созданием встроенного изображения.

Создание макросов

Макросы — это наборы текстовых и встроенных команд, которые можно вызывать несколько раз в процессе обработки текста. Макросы применяют для создания общих операций. Однако неопределенный макрос воспринимается препроцессором как пустой.

• Request: «.de» name [end]

• Request: «.de1» name [end]

• Request: «.dei» name [end]

• Request: «.dei1» name [end]

Здесь запросы определят новый макрос с именем «name». Gtroff копирует строки во внутренний буфер, пока не встретит строку «..» (две точки). Если присутствует необязательный второй аргумент «de», он считается запросом закрытия макроса, вместо запроса «..».

После первой точки в строке, содержащей завершающий токен, может быть пробел (либо «.», либо «end»). Не вставляйте символ табуляции сразу после «..», иначе он не будет распознан как знак завершения макроса.

Ниже пример макроса «P» вызывающего разрыв строки и вставляющего пробел по вертикали. Макрос можно применять для разделения абзацев.

.de P
.br
.sp .8v
..
В следующем примере макрос определяется внутри другого макроса. Помните, что расширение должно быть защищено дважды: один раз для чтения макроса и один раз для выполнения.

\# a dummy macro to avoid a warning
.de end
..
.
.de foo
.de bar end
.nop
\f[B]Hello !\f[]
.end
..
.
.foo
.bar Joe
= "Hello Joe!"
Поскольку «\f» не имеет расширения, нет необходимости защищать его обратной косой чертой. Если бы мы определили еще один макрос внутри «bar», перед «$1» потребовалось бы восемь обратных слешей (slash).

Запрос «de1» отключает режим совместимости при выполнении макроса. При входе текущий режим совместимости сохраняется и восстанавливается при выходе.

.nr xxx 12345
.
.de aa
The value
of xxx is \n[xxx].
..
.de1 bb
The value of xxx is
\n[xxx].
..
.
.cp 1
.
.aa
warning: number register \’
.tm =\’
.tm
=\$^’
..
.foo " This is a "test"
= test"’
=
= "This is a test"
= $^=abc’ is \w’abc’u.
= The
length of the string \&’.
Запрос «dei» косвенно определяет макрос. То есть он расширяет строки с именами «name», «end» перед выполнением добавления.

.ds xx aa
.ds yy bb
.dei xx yy
Код эквивалентен следующему.

.de aa bb
Запрос «dei1» похож на «dei», но с отключенным режимом совместимости во время выполнения макроса.

Если включен режим совместимости, «de»«dei») ведут себя аналогично «de1» («dei1»).

Обратите внимание, что идентификаторы макросов используются совместно с идентификаторами строк и переадресаций.

• Request: «.am» name [end]

• Request: «.am1» name [end]

• Request: «.ami» name [end]

• Request: «.ami1» name [end]

Запросы аналогичны «de», за исключением того, что добавляются к макросу с именем «name».

Например, чтобы ранее определенный макрос «P» форматировал отступы вместо блочных абзацев, добавьте необходимый код в макрос.

.am P
.ti +5n
..
Запрос «am1» выключает режим совместимости при выполнении фрагмента макроса. Токен «сохранение совместимости» вставляется в начало добавленного кода, а токен «восстановление совместимости» в конец.

Запрос «ami» добавляется косвенно, gtroff расширяет строки с именами «name» или «end» перед выполнением добавления.

Запрос «ami1» аналогичен запросу «ami», но при выполнении заданного макроса отключается режим совместимости.

При помощи «trace.tmac» вы можете отслеживать «am» и «am1».

Запросы «de», «am», «di», «da», «ds» и «as» (и другие варианты) создают новый объект только в том случае, если имя макроса, перенаправление или строка в настоящее время не определены или установлены как запрос; обычно они изменяют значение существующего объекта.

• Request: «.return» [anything]

Выход из макроса с немедленным возвратом к вызывающему запросу.

При вызове с аргументом происходит перенаправление из текущего макроса на макрос уровнем выше. Это применяется для определения макроса‐оболочки «return» в «trace.tmac».

Режим копирования

Когда программа gtroff читает текст макроса или строки, то текст копируется (включая строки запроса, исключая escape‐последовательности) во внутренний буфер. Экранирования преобразуются во внутреннюю форму, за исключением «\n», «\$», «\*», «» и «\RET», которые транслируются и вставляются в текст там, где были обнаружены. Подобное поведение называется «режимом копирования».

Например, вы можете указать, когда escape‐последовательности должны транслироваться: либо во время копирования, либо во время применения, также изолировать escape‐последовательности дополнительной обратной косой чертой. Сравните с командами «\def» и «\edef» в TeX.

В следующем примере выводятся числа 20 и 10.

.nr x 20
.de y
.nr x 10
\&\nx
\&\nx
..
.y

Параметры макроса

Аргументы макроса или строки можно проверить с помощью различных escape‐последовательностей.

• Register: «\n[.$]»

Запрос показывает количество аргументов, переданных макросу или строке. Это числовой регистр, доступный только для чтения.

Обратите внимание, что запрос «shift» может изменить значение.

Любой аргумент можно получить с помощью одной из следующих escape‐последовательностей.

• Escape: «$n»

• Escape: «$(nn»

• Escape: «$[nnn]»

Последовательности выводят n‐й, nn‐й или nnn‐й аргумент. Как обычно, первая форма принимает только одно число (больше нуля), вторая — двузначное число (больше или равно 10), а третья ‐ любое положительное целое число (больше нуля). Макросы и строки могут иметь неограниченное количество аргументов. Обратите внимание, что из‐за режима копирования используются две обратные косые черты, чтобы предотвратить интерполяцию до тех пор, пока макрос не будет вызван.

• Request: «.shift» [n]

Сдвигает аргументы на одну позицию или на столько позиций, сколько указано «n». После выполнения запроса аргумент «i» становится аргументом «i ‐ n»; аргументы с первого по «n» больше не доступны. Сдвиг на отрицательную величину в настоящее время не поддерживается.

Регистр «.$» корректируется соответствующим образом.

• Escape: «$*»

• Escape: «$@»

В некоторых случаях удобно использовать все аргументы сразу (например, чтобы передать их макросу). Экранирование «\$*» объединяет все аргументы, разделенные пробелами. Последовательность «\$@» объединяет все аргументы, каждый из которых заключен в двойные кавычки и разделен пробелами.

• Escape: «$^»

Обрабатывает параметрры макроса, как если бы они были аргументом запроса «ds» или подобных запросов.

.de foo
.tm =\’
.tm =\’
.tm $^= This is a ’
= This is a test"’
= " This is a
"test"’
Эта последовательность полезна для макросов (например, «trace.tmac»), переопределяющих запросы и макросы для отладочных целей.

• Escape: «./trans»«»

Имя, используемое для вызова текущего макроса. Запрос «als» позволяет назвать макрос более чем одним именем.

Если макрос вызывается как строка (внутри другого макроса), значение «\$0» не изменяется.

.de foo
.tm $0
..
.als foo bar
.
.de aaa
.foo
..
.de bbb
.
bar
..
.de ccc
\*[foo]\
..
.de
ddd
\*[bar]\
..
.
.aaa
= foo
.bbb
= bar
.ccc
= ccc
.ddd
= ddd

Ловушки

Ловушки — это локации, при достижении которых вызывается указанный макрос. Ловушки могут располагаться в любом месте на странице, в заданном месте в текущей переадресации, в пустой строке, после определенного количества строк ввода или в конце ввода.

Ловушка срабатывает, если выполняется соответствующий макрос.

Ловушки страницы

«Ловушки местоположения страницы» выполняют действие, когда gtroff достигает или проходит определенное место на странице по вертикали. Ловушки местоположения применяются во многих случаях, в том числе для настройки верхних и нижних колонтитулов, форматирования текста в несколько столбцов, установки сносок.

• Request: «.vpt» flag

• Register: «\n[.vpt]»

Запросы включают вертикальную ловушки, если «flag» не равен нулю, в противном случае отключают. Ловушки вертикального положения устанавливаются запросами «wh» или «dt». Ловушки, установленные запросом «it», не считаются ловушками вертикального положения. Параметр, управляющий включением ловушек, является глобальным. По умолчанию ловушки вертикального положения включены. Текущая настройка доступна в регистре только для чтения «.vpt».

• Request: «.wh» dist [macro]

Установит ловушку местоположения страницы. Положительные значения «dist» устанавливают ловушку относительно верха страницы; отрицательные значения устанавливают ловушку относительно нижней части страницы. Индикатор масштабирования «v», значения «dist» всегда округляются, чтобы быть кратными вертикальному разрешению (заданному в регистре «.V»).

Аргумент «macro» — это имя макроса, аргумент будет выполняться при срабатывании ловушки. Если «macro» отсутствует, первая ловушка удаляется (если есть) из «dist».

Ниже пример макросов для оформления верхних и нижних колонтитулов.

.de hd \’’ Page header
’ sp .5i
.tl ’Title’’date’
’ sp .3i
..
.
.de fo \’’
Page footer
’ sp 1v
. tl ’’%’’
’ bp
..
.
.wh 0 hd \’’ trap at top of the page
.wh ‐1i fo \’’
trap one inch from bottom
Ловушка внизу страницы игнорируется, ее можно сделать активной перемещая вверх или увеличивая длину страницы, чтобы ловушка оказалась на странице.

Отрицательные значения всегда используют текущую длину страницы; они не преобразуются в абсолютное вертикальное положение.

.pl 5i
.wh ‐1i xx
.ptr
= xx ‐240
.pl 100i
.ptr
= xx ‐240
В одной локации может быть несколько ловушек: ловушки должны быть определены в разных местах, а затем перемещены запросом «ch». В противном случае вторая ловушка заменит первую. Ранее определенные ловушки скрывают более поздние, если перемещаются в ту же позицию.

.de a
. nop a
..
.de b
. nop b
..
.de c
. nop c
..
.
.wh 1i a
.wh 2i b
.wh 3i c
.bp
= a b c
.ch b 1i
.ch c 1i
.bp
= a
.ch a 0.5i
.bp
= a b
• Register: «\n[.t]»

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

• Request: «.ch» macro [dist]

Изменит местоположение ловушки. Первый аргумент — имя макроса, который будет вызываться в ловушке, второй аргумент — новое местоположение ловушки. Обратите внимание, что параметрры указываются в обратном порядке, как в запросе «wh». Это полезно для создания сносок, чтобы освободить для них пространство внизу страницы.

Индикатор масштабирования «dist» по умолчанию «v». Если «dist» отсутствует, ловушка удаляется.

• Register: «\n[.ne]»

Числовой регистр «.ne», доступный только для чтения, содержит количество места, необходимого для последнего запроса «ne», вызвавшего срабатывание ловушки. Полезно в сочетании с регистром «.trunc».

Поскольку регистр «.ne» устанавливается только ловушками, нет особого смысла применять его вне макросов ловушек.

• Register: «\n[.trunc]»

Доступный только для чтения регистр содержит объем вертикального пространства. Другими словами, в момент срабатывания ловушки он представляет собой разницу между вертикальным положением без применения ловушки и с применением.

Регистр «.trunc» устанавливается только ловушками.

• Register: «\n[.pe]»

Доступный только для чтения регистр, он определяется как 1, пока страницавызывается запросом «bp» (или после ввода).

Вне ловушек этот регистр всегда равен нулю.

В следующем примере второй вызов «x» вызывается «bp».

.de x
\&.pe=\n[.pe]
.br
..
.wh 1v x
.wh 4v x
A line.
.br
Another line.
.br
= A line.
.pe=0
Another line.
.pe=1
Диверсии и ловушки обычно не взаимодействуют. Например, если ловушка вызывает макрос заголовка во время вывода диверсии, эффект не виден до тех пор, пока диверсия не завершится (за исключением ввода, защищенного с помощью «\ !).» или «\?»).

Ловушки внутри диверсий

• Request: «.dt» [dist macro]

Запрос установит ловушку внутри диверсии. Аргумент «dist» — расположение ловушки (идентично запросу «wh»; индикатор масштабирования по умолчанию — «v»), «macro» — имя вызываемого макроса. При вызове без аргументов ловушка удаляется.

Обратите внимание, что существует только одна отвлекающая ловушка.

Числовой регистр «.t» работает при переадресациях.

Ловушки строки

• Request: «.it» n macro

• Request: «.itc» n macro

Запросы установят ловушку на строке, где «n» — количество строк ввода, которое может быть прочитано до срабатывания ловушки; «macro» — вызываемый макрос. Строки запроса не считаются строками ввода.

.de B
. it \ B‐end
. ft B
..
.
.de B‐end
. ft R
..
Запрос «itc» идентичен «itc», но прерванная текстовая строка (заканчивающаяся на «\c») не считается отдельной строкой.

Запросы связаны с текущей средой, переключение в другую среду отключает текущую ловушку ввода, возврат в среду активирует ее, восстанавливая количество уже обработанных строк.

Ловушка пустой строки

• Request: «.blm» macro

Установит ловушку пустой строки. Программа gtroff выполняет «macro», когда встречает пустую строку во входном файле.

Ловушки специальных символов

• Request: «.lsm» macro

• Register: «\n[lsn]»

• Register: «\n[lss]»

Установит ловушку с ведущими пробелами. Программа gtroff выполняет «macro», когда встречает начальные пробелы в строке ввода, неявный разрыв строки подавляется. Однако строка, состоящая только из пробелов, рассматривается как пустая, возможно, с учетом макроса пустой строки, установленного запросом «blm».

Перед вызовом макроса из строки ввода удаляются начальные пробелы. Количество удаленных пробелов хранится в регистре «lsn»; горизонтальный пробел хранится в регистре «lss». Обратите внимание, что «lsn» и «lss» доступны, даже если не задан макрос начального пробела.

Ловушка конца строки

• Request: «.em» macro

Установит ловушку в конце ввода, «macro» выполняется после обработки последней строки входного файла.

Например, если в документе должен быть раздел внизу последней страницы, можно использовать запрос «em».

.de approval
\c
. ne 3v
.
sp (\n[.t]u ‐ 3v)
. in +4i
. lc _
. br
Approved:\t\a
. sp
Date:\t\t\a
..
.
.em approval
Символ «\c» в приведенном выше примере нуждается в объяснении. По историческим причинам для совместимости с AT&T troff макрос завершается, как только он вызывает разрыв страницы, также в частично собранной строке нет данных.

Предположим, что в приведенном выше макросе нет символа «\c», страница заполнена и завершена запросом «br». Теперь запрос «ne» вызывает запуск новой страницы, что, в свою очередь, приводит к немедленному закрытию «troff» по только что описанным причинам.

В следующем примере показано, как добавить три строки, а затем начать новую страницу.

.de EM
.pl +1v
\c
.ne 2
line one
.br
\c
.ne 2
line two
.br
\c
.ne 2
line three
.br
.pl ‐1v
\c
’bp
..
.em EM
Обратите внимание, что конкретная функция влияет только на первый возможный разрыв страницы, вызванный макросом конца; дальнейшие разрывы страниц, создаваемые макросом, обрабатываются нормально.

Другое возможное использование запроса «em» — заставить gtroff выдать одну большую страницу вместо нескольких страниц. Например, может потребоваться создать длинный текстовый файл для вывода на экран.

.de adjust‐page‐length
. br
. pl
\n[nl]u \’’ \n[nl] holds the current vert. position
..
.
.de single‐page‐mode
. pl 99999
. em adjust‐
page‐length
..
.
.\’’ activate the above code
.single‐page‐mode
Поскольку существует только одна ловушка конца ввода, и другие пакеты макросов могут уже применять ее, лучше не использовать ее.

Диверсии, перенаправления

В gtroff можно «перенаправлять» текст в именованную область хранения. Из‐за сходства с макросами иногда говорят, что текст хранится в макросе. Текст выводится после определенных действий, что полезно для хранения блоков текста на одной странице, создания сносок, оглавлений и указателей.

• Request: «.di» macro

• Request: «.da» macro

Запросы начинают диверсию. Принимают в качестве аргумента имя макроса, чтобы перенаправить на него последующий текст. Макрос «da» добавляется к существующей переадресации.

Макросы «di» или «da» без аргумента завершат диверсию.

Текущая частично заполненная строка включена в переадресацию. Обратите внимание, что переключение на пустую среду (с запросом «ev») позволяет избежать включения строки.

• Request: «.box» macro

• Request: «.boxa» macro

Начать (или добавить) диверсию, например, запросы «di» and «da». Запросы «box» и «boxa» не включают частично заполненную строку.

Before the box.
.box xxx
In the box.
.br
.box
After the box.
.br
= Before the box.
After the box.
.xxx
= In the box.
Before the diversion.
.di yyy
In the
diversion.
.br
.di
After the diversion.
.br
=
After the diversion.
.yyy
= Before the diversion. In the
diversion.
Запросы «box» или «boxa» без аргумента заканчивают диверсию.

• Register: «\n[.z]»

• Register: «\n[.d]»

Диверсии могут быть вложенными. Доступный только для чтения регистр «.z» содержит название текущей диверсии, это строковый регистр. Доступный только для чтения числовой регистр «.d» содержит текущую позицию по вертикали.

• Register: «\n[.h]»

Регистр соответствует базовой линии текста самой нижней строки на странице.

.tm .h==\n[.h], nl==\n[nl]
=
.h==0, nl==‐1
This is a test.
.br
.sp 2
.tm
.h==\n[.h], nl==\n[nl]
= .h==40, nl==120
Как видно из предыдущего примера, пустые строки не учитываются в возвращаемом значении регистра «.h».

• Register: «\n[dn]»

• Register: «\n[dl]»

После завершения переадресации числовые регистры чтения‐записи «dn» и «dl» содержат размер переадресации по вертикали и горизонтали. Обратите внимание, что учитываются только обработанные строки.

.\’’ Center text both horizontally &
vertically
.
.\’’ Enclose macro definitions in .eo and
.ec
.\’’ to avoid the doubling of the backslash
.eo
.\’’ macro .(c starts centering mode
.de (c
. br
.
ev (c
. evc 0
. in 0
. nf
. di @c
..
.\’’ macro .)c terminates centering mode
.de )c
. br
. ev
. di
. nr @s
(((\n[.t]u ‐ \n[dn]u) / 2u) ‐ 1v)
. sp \n[@s]u
. ce 1000
. @c
. ce 0
. sp \n[@s]u
. br
. fi
. rr @s
. rm @c
..
.\’’ End of
macro definitions, restore escape mechanism
.ec
• Escape: «\ !»

• Escape: «\?» anything «\?»

Последовательности предотвращают интерпретацию запросов, макросов и экранирований при чтении. «Прозрачно» встраивают заданный текст. Используются с макросами, которые не следует вызывать до тех пор, пока фактически не будет выведен перенаправленный текст.

Последовательность «\ !» прозрачно встраивает текст до конца строки. Экранирующий символ «\?» встраивает текст до следующего появления экранного символа «\?».

\?«anything»\?
Здесь «anything» не может содержать символы новой строки; используйте «\ !», чтобы вставить их. Последовательность «\?» также распознается в режиме копирования и транслируется во внутренний код. Именно этот код считается завершающим.

.nr x 1
.nf
.di d
\?\??\\\\nx\\?\?\?
.di
.nr x 2
.di e
.d
.di
.nr x 3
.di f
.e
.di
.nr x 4
.f
Обе последовательности читают данные в режиме копирования.

Если в перенаправлении верхнего уровня используется «\ !», его аргумент напрямую встраивается в промежуточный вывод gtroff. Что можно использовать, например, для управления постпроцессором, который обрабатывает данные перед их отправкой драйверу устройства.

Экран «\?» применяется на верхнем уровне, не производит никакого вывода, аргументы игнорируются.

• Request: «.output» string

Запрос выводит «string» непосредственно на промежуточный выход gtroff (в зависимости от интерпретации режима копирования); это похоже на алгоритм последовательности «\ !», используемой на верхнем уровне. Начальная двойная кавычка в «string» убрана, чтобы сохранить пробелы.

Запрос нельзя применять до начала первой страницы, но если вы получили сообщение об ошибке, вставьте «.br» перед запросом «output». Без аргумента «output» игнорируется.

Применяйте с осторожностью! Обычно запрос требуется только для разметки перед постпроцессором.

• Request: «.asciify» div

Запрос «отформатирует» перенаправление, указанное «div». Символы ASCII или транслируемые с помощью запроса «trin» символы пробела и некоторые escape‐последовательности обрабатываются как обычные символы.

.tr @.
.di x
@nr n 1
.br
.di
.tr
.asciify x
.x
• Request: «.unformat» div

Запрос «unformat» не форматирует пробелы и табуляции между словами. Неформатированные вкладки обрабатываются как входные токены, пробелы растягиваются.

Вертикальный размер строк не сохраняется, однако информация о глифе (шрифт, размер шрифта, ширина интервала и т.д.) сохраняется.

Символы и шрифты

Gtroff способен встраивать шрифты в любой точке текста. Базовым набором считаются шрифты «R», «I», «B», «BI» (Roman, Italic, Bold и Bold Italic). Для устройств без вывода TTY также существует по крайней мере один символьный шрифт, содержащий различные специальные символы (греческие буквы, математические знаки).

Настройки шрифтов

В программе имеются многочисленные запросы для настройки шрифтов.

• Request: «.ft» [font]

• Escape: «\f» f

• Escape: «\f(» fn

• Escape: «\f[» font «]»

• Register: «\n[.sty]»

Запрос «ft», экранирование «\f» изменяют текущий шрифт на указанный «font» (односимвольное имя «f», двухсимвольное «fn»).

Если «font» является именем (как указано в запросе «sty» или с помощью команды «styles» в файле «DESC»), он применяется с текущим семейством шрифтов с помощью запроса «fam», escape‐последовательности «\F» или команды «family» в файле «DESC».

Без аргумента или с буквой «P» в качестве аргумента запрос «.ft» переключает на предыдущий шрифт. Аналогичного результата можно добиться с помощью последовательности «\f[]». Поддерживаются старые формы синтаксиса «\fP» или «\f[P]».

Шрифты обычно указываются как строки в верхнем регистре, содержащие от 1 до 4 символов, или содержащие аббревиатуру, акроним имени шрифта. Это не ограничение, но принятые условные соглашения.

В приведенном ниже примере создаются две идентичные строки для шрифтов.

eggs, bacon,
.ft B
spam
.ft
and sausage.
eggs, bacon, \fBspam\fP and
sausage.
Обратите внимание, что «\f» не создает входной маркер в gtroff. Как следствие, допускается применять его в запросах «mc» (один символ в качестве аргумента) для изменения шрифта на лету.

.mc \f[I]x\f[]
Текущее имя стиля можно посмотреть в доступном только для чтения строковом регистре «.sty»; если текущий шрифт не является стилем, возвращается пустая строка. Регистр связан с окружением (средой).

• Request: «.ftr» f [g]

Заменяет шрифт «f» на шрифт «g». Всякий раз, когда шрифт с именем «f» упоминается в управляющей последовательности «\f», в условных операторах «F» и «S» или в запросах «ft», «ul», «bd», «cs», «tkf», «special», «fspecial», «fp», «sty» применяется шрифт «g». Если «g» отсутствует или равен «f», операция отменяется.

Обратите внимание, невозможно объединять подмену шрифтов в цепочке опций.

.ftr XXX TR
.ftr XXX YYY
.ft XXX
= warning: can’t find font Bar’
.ft 0 \’’ switch to font at
position 0
.fam Foo \’’ activate family FooBar’
• Request: «.fzoom» f [zoom]

• Register: «\n[.zoom]»

Увеличивается шрифт «f» на коэффициент «zoom», последний должен быть неотрицательным целым числом, кратным 1/1000. Запрос полезен для настройки размера шрифта по отношению к другим шрифтам. В приведенном ниже примере шрифт «CR» увеличен на 10% (коэффициент масштабирования равен 1,1).

.fam P
.fzoom CR 1100
.ps 12
Palatino and \f[CR]Courier\f[]
Отсутствующее или нулевое значение «увеличения» совпадает со значением 1000, что подразумевает отказ от масштабирования.

Увеличение шрифта полностью прозрачно в troff; изменение коэффициента масштабирования не вызывает никакого эффекта, за исключением того, что размеры глифов, пробелов (слов), кернов и т.д. затронутого шрифта корректируются соответствующим образом.

Коэффициент масштабирования текущего шрифта доступен в числовом регистре только для чтения «.zoom». Регистр возвращает ноль, если увеличение не задано.

Семейство шрифтов

Из‐за разнообразия доступных шрифтов в gtroff ввели понятие «семейства шрифтов» и «стилей шрифтов». Шрифты задаются как объединение семейства шрифтов и стиля. Указание шрифта без части семейства приводит к тому, что gtroff применяет стиль текущего семейства.

В настоящее время шрифты для устройств «‐Tps», «‐Tpdf», «‐Tdvi», «‐Tlj4», «‐Tlbp» и шрифты оконной системы X11 настроены для работы с этим механизмом. По умолчанию gtroff применяет семейство Times со стилями «R», «I», «B» и «BI».

Таким образом, можно использовать четыре основных стиля и выбрать любое другое семейство шрифтов в командной строке.

• Request: «.fam» [family]

• Register: «\n[.fam]»

• Escape: «\F» f

• Escape: «\F(» fm

• Escape: «\F[» family «]»

• Register: «\n[.fn]»

Переключает семейство шрифтов на «family» (односимвольное имя «f», двухсимвольное «fm»). Если аргумент не указан, возвращается предыдущее семейство шрифтов. Подобного эффекта можно добиться с помощью последовательности «\F[]». Обратите внимание, что последовательность «\FP» не работает.

Значение при запуске считается равным «T». Текущее семейство шрифтов указано в доступном только для чтения числовом регистре «.fam»; регистр связан с текущей средой.

spam,
.fam H \’’ helvetica family
spam, \’’ used font is family H + style R = HR
.ft B
\’’ family H + style B = font HB
spam,
.fam T \’’
times family
spam, \’’ used font is family T + style B = TB
.ft AR \’’ font AR (not a style)
baked beans,
.ft R
\’’ family T + style R = font TR
and spam.
Обратите внимание, что «\F» не создает входной маркер в gtroff. Поэтому его можно использовать в запросах типа «mc» для изменения семейства шрифтов в процессе работы программы.

.mc \F[P]x\F[]
Регистр «.fn» содержит текущее «настоящее» имя шрифта. Это строковый регистр. Если текущий шрифт является стилем, значение «\n[.fn]» будет конкатенацией имени семейства и стиля.

• Request: «.sty» n style

Запрос связывает «style» с позицией шрифта «n». Позиция шрифта может быть связана либо со шрифтом, либо со стилем. Текущий шрифт — это индекс позиции шрифта, а также шрифт или стиль. Например, если текущий шрифт равен 1 и позиция шрифта 1 связана со стилем «R», а текущее семейство шрифтов «T», то используется шрифт «TR». Если текущий шрифт не является стилем, то текущее семейство игнорируется. Если запросы «cs», «bd», «tkf», «uf» или «fspecial» применяются к стилю, они вместо этого применяются к члену текущего семейства, соответствующему этому стилю. Аргумент «n» должен быть неотрицательным целым числом.

Семейство по умолчанию можно установить с помощью опции «‐f». Команда «styles» в файле «DESC» определяет, какие позиции шрифта (если таковые имеются) изначально связаны со стилями, а не со шрифтами. Например, настройкой по умолчанию для шрифтов считается POSTSCRIPT.

styles R I B BI
.sty 1 R
.sty 2 I
.sty 3 B
.sty
4 BI
Запрос «fam» и последовательность «\F» всегда проверяют правильность текущей позиции шрифта. Иногда проверка приводит к неожиданным результатам, если текущая позиция шрифта связана со стилем.

.sty \n[.fp] Bar
.fam Foo
=
warning: can’t find font Bar’
.ft 0 \’’ switch to font at
position 0
.fam Foo \’’ activate family FooBar’
Позиция шрифта по умолчанию 1. Для устройства POSTSCRIPT установлена связь со стилем «R», поэтому gtroff пытается открыть «FooR».

Решением проблемы может быть использование фиктивного шрифта.

.fp 0 dummy TR \’’ set up dummy font at
position 0
.sty \n[.fp] Bar \’’ register style Foo’
.ft Bar \’’ switch to font \’
. tm =\’
. tm
=\$^’
..
.foo " This is a "test"
= =test"’
=
=" This is a " "test""’
= $^=abc’ is \w’abc’u.
= The
length of the string \&’.

Позиции шрифта

Чтобы обеспечить совместимость со старыми фотонаборными устройствами и версиями «troff», в программу «gtroff» ввели понятие шрифтовых «позиций», на которые монтируются различные шрифты.

• Request: «.fp» pos font [external‐name]

• Register: «\n[.f]»

• Register: «\n[.fp]»

Запрос смонтирует шрифт «font» в позицию «pos» (неотрицательное целое число). На числовую позицию допускается ссылаться с помощью команд изменения шрифта. При запуске gtroff устанавливает позицию шрифта 1.

Текущий шрифт доступен в числовом регистре только для чтения «.f». Регистр позволяет запоминать шрифт для последующего вызова. Регистр связан со средой.

.nr save‐font \n[.f]
.ft B
...
text text text ...
.ft \n[save‐font]
Номер следующей свободной позиции шрифта доступен в регистре только для чтения «.fp».

.fp \n[.fp] NEATOFONT
Шрифты, не перечисленные в файле «DESC», автоматически монтируются в следующую доступную позицию шрифта при обращении к ним. Если шрифт должен быть смонтирован явным образом с помощью запроса «fp», его можно смонтировать на первую неиспользуемую позицию шрифта в регистре «.fp». Хотя gtroff не имеет встроенных ограничений, не разрешается монтировать шрифт в позиции, число которых намного больше (> 1000), чем любое используемое в настоящее время.

Запрос «fp» имеет необязательный третий аргумент. Этот аргумент определяет внешнее имя шрифта для поиска файла описания. Второй аргумент задает внутреннее имя шрифта, оно применяется для ссылки на шрифт gtroff после монтирования. Если третьего аргумента не существует, то в качестве внешнего имени устанавливается внутреннее имя. Функция позволяет применять шрифты с длинными именами в режиме совместимости.

Запрос «ft», escape‐последовательность «\f» допускают альтернативные формы синтаксиса для доступа к позициям шрифта.

• Request: «.ft» nnn

• Escape: «\f» n

• Escape: «\f(» nn

• Escape: «\f[nnn]»

Запрос и последовательности изменят текущую позицию шрифта на «nnn» (позиция из одной цифры «n», из двух цифр «nn»), число должно быть неотрицательным целым числом.

Если «nnn» связан со стилем (установлено запросом «sty» или командой «styles» в файле «DESC»), используется значение в текущем семействе шрифтов. Последнее определяется с помощью запроса «fam», последовательности «\F» или командой «family» в файле «DESC».

this is font 1
.ft 2
this is font 2
.ft \’’ switch back to font 1
.ft 3
this is font 3
.ft
this is font 1 again

Глифы и символы

Глиф ‐ графическое представление символа. В то время как символ — это абстрактная сущность, содержащая семантическую информацию, глиф можно увидеть на экране монитора или на бумаге. Символ имеет несколько форм для представления глифов. Например, символ «А» может быть напечатан как прямым, так и курсивным шрифтом, что дает два разных глифа; иногда символы сопоставляются с одним глифом (т.н. «лигатура»).

Символ ‐ это именованный глиф. В gtroff все имена глифов определяются в файле шрифта. Если пользователь запрашивает глиф, которого нет в этом файле, gtroff ищет упорядоченный список «специальных шрифтов». По умолчанию устройство вывода POSTSCRIPT поддерживает два специальных файла шрифтов «SS» (символы с наклоном) и «S» (обычные символы), первый просматривается перед вторым. Некоторые устройства вывода используют другие имена для специальных шрифтов. Шрифты, смонтированные с помощью ключевого слова «fonts» в файле «DESC», доступны для глобального применения. Чтобы установить дополнительные специальные шрифты локально (т.е. для определенного шрифта), применяется запрос «fspecial».

Также программа gtroff ищет заданный символ по известным правилам, описанным ниже.

fonts 3 0 0 FOO
Команда монтирует шрифт «foo» в позиции шрифта 3. Предполагается, что «FOO» является специальным шрифтом, содержащим глиф «foo», и что шрифт еще не загружен.

Список доступных символов зависит от устройства.

man ‐Tdvi groff_char > groff_char.dvi
Список с устройством вывода DVI. Не все версии программы «man» поддерживают опцию «‐T».

groff ‐Tdvi ‐mec ‐man groff_char.7 >
groff_char.dvi
Имена глифов, не указанные в groff_char, получаются алгоритмически с помощью упрощенной версии алгоритма Adobe Glyph List (AGL).

Глиф для символа Unicode U+XXXX[X[X]], который не является составным символом, называется uXXXX[X[X]]. «X» должен быть шестнадцатеричной цифрой в верхнем регистре. Примеры: «u1234», «u008E», «u12DB8». Наибольшее значение Unicode 0x10FFFF.

Должно быть не менее четырех цифр «Х»; при необходимости добавляются ведущие нули после «u». Не допускается заполнение нулями кодов символов больше 0xFFFF. Суррогаты (т. е. значения Unicode больше 0xFFFF, представленные кодами символов из области U+D800‐U+DFFF) не допускаются.

:: «u» «component1» «_» «component2» «_» «component3»

Пример: «u0045_0302_0301».

Для простоты все составные символы Unicode должны быть максимально разложены, как форма нормализации D в стандарте. Например, «u00CA_0301» не считается допустимым именем глифа, поскольку U+00CA (латинская заглавная буква E) может быть разложен на U+0045 и U+0302. Таким образом, «u0045_0302_0301» — это название глифа U+1EBE (латинская заглавная буква с ударением).

Программа groff поддерживает таблицу декомпозиции всех алгоритмически полученных имен составных глифов. Например, «u0100» автоматически разбивается на «u0041_0304».

• Escape: «\(nm»

• Escape: «\[ name ]»

• Escape: «\[ component1 component2 ]»

Последовательности вставляют символ «name» (двухсимвольное имя «nm») или составной глиф с компонентными глифами «component1», «component2» и т.д. Специального синтаксиса для односимвольных имен нет. Если значение «name» не определено, генерируется предупреждение «char», экранирование игнорируется.

Программа groff разрешает применять «\[...]» с более чем одним компонентом по следующим правилам: любой компонент, найденный в GGL, преобразуется в форму «uXXXX»; любой компонент "uXXXX", найденный в списке разложимых глифов, декомпозируется, а полученные элементы объединяются с помощью вставки «_», при этом отбрасываются начальные «u» во всех элементах, кроме первого; проверка существования какого‐либо компонента не выполняется.

«\[A ho]»

«A» сопоставляется с «u0041», «ho» сопоставляется с «u02DB», таким образом, окончательное имя глифа будет «u0041_02DB».

«\[^E u0301]»

«\[^E aa]»

«\[E a^ aa]»

«\[E ^ ’]»

«^E» отображается как «u0045_0302», окончательное имя глифа «u0045_0302_0301»

Невозможно определить глифы с именами типа «A ho» в файле шрифта groff. Следует определить «u0041_0328».

• Escape: «\C’» xxx «’»

Глиф с именем «xxx». Обычно удобно записывать «\[«xxx», но форма «\C» совместима с более новыми версиями AT&T troff.

• Request: «.composite» from to

Сопоставит имя глифа «from» с именем глифа «to», если применяется в «\[...]» с более чем одним компонентом.

Сопоставление основано только на именах глифов, проверка любого глифа не выполняется.

Набор сопоставлений для многих акцентов можно найти в файле «composite.tmac», он загружается при запуске процессора.

• Escape: «\N’n’»

Глиф с кодом «n» текущего шрифта. Число «n» может быть любым неотрицательным десятичным целым числом. Как правило, устройства понимают глифы с кодами от 0 до 255, но устройство вывода Unicode применяет коды в диапазоне 0‐65535. Если текущий шрифт не содержит глифа с таким кодом, поиск специальных шрифтов выполняется в другом файле. Управляющую последовательность «\N» можно применять с запросом «char».

.char \[phone] \f[ZD]\N’37’
Код каждого глифа указан в четвертом столбце файла описания шрифта после команды «charset». Можно включить безымянные глифы в файл описания шрифта, используя имя «‐‐‐»; но escape‐последовательность «\N» единственный способ включить их. (Кернинг не применяется к глифам, доступ к которым осуществляется с помощью «\N».)

Кернинг (англ. kerning) при наборе текста — избирательное изменение интервала между буквами в зависимости от их формы.

Некоторые управляющие последовательности напрямую отображаются как специальные глифы.

• Escape: «\’»

Обратная косая черта, за которой следует символ апострофа, символ ASCII 0x27 (символ EBCDIC 0x7D). То же, что «\[аа]», акут. Акут (лат. acutus), острое ударение, в старой орфографии острецо — диакритический знак над буквой.

• Escape: «‘»

Обратная косая черта, за которой следует символ ASCII 0x60 (обычно символ EBCDIC 0x79). То же, что «\[ga]», «серьезное» ударение.

• Escape: «\‐»

То же, что и «\[‐]», знак минус в текущем шрифте.

• Escape: «\_»

То же, что и «\[ul]», символ подчеркивания.

• Request: «.cflags» n c1 c2 ...

Вводимые символы имеют определенные свойства, связанные с ними. Эти свойства можно изменить с помощью запроса «cflags». Первый аргумент — сумма желаемых флагов, остальные аргументы — символы, обладающие этими свойствами. Можно опустить пробелы между знаками или символами. Вместо отдельных символов вы также можете использовать классы символов.

«1»

Заканчивает предложения (изначально этим свойством обладают символы «.?!»).

«2»

Перед символом можно разбивать строки (изначально у символов нет такого свойства). Работает только в том случае, если символы до и после имеют ненулевые коды переноса (как указано в запросе «hcode»). Назначьте значение 64, чтобы переопределить это поведение.

«4»

Строки могут разрываться после символа (этим свойством обладают символы «‐», «\[hy]» и «\[em]»). Работает только в том случае, если символы до и после имеют ненулевые коды переноса (как указано в запросе «hcode»). Используйте значение 64, чтобы переопределить поведение.

«8»

Символ перекрывается по горизонтали, если используется в качестве элемента построения горизонтальной линии. Изначально символы «\[ul]», «\[rn]», «\[ru]», «\[radicalex]», и «\[sqrtex]» обладают этим свойством.

«16»

Перекрывается по вертикали, если используется в качестве элемента построения вертикальной линии. Этим свойством обладает символ «\[br]».

«32»

Символ конца предложения, за которым следует любое количество символов с определенным свойством. Рассматривается как конец предложения, если за ним следует перевод строки или два пробела. Другими словами, символ является «прозрачным» при распознавании конца предложения ‐ это то же самое, что нулевой коэффициент пробела в TeX (символы «"’)]*», «\[dg]», «\[rq]», и «\[cq]» обладают этим свойством).

«64»

Игнорирует значения кода переноса окружающих символов. Используется в сочетании со значениями 2 и 4; изначально у символов нет этого свойства. Например, если вам нужна автоматическая точка останова после короткого тире в числовых диапазонах, таких как «3000‐5000», вставьте следующее.

.cflags 68 \(en
Обратите внимание, в этом случае возможна некачественная компоновка. Лучшим решением вместо изменения значения «cflags» считается вставка «\:» сразу после дефиса в местах, где действительно нужна точка останова.

«128»

Запретит разрыв строки перед символом, но разрешит его после. Работает только с флагами 256 и 512 (см. ниже) и не действует в противном случае.

«256»

Запретит разрыв строки после символа, но разрешит его перед символом. Работает только в сочетании с флагами 128 и 512, в противном случае игнорируется.

«512»

Разрешит разрыв строки до или после символа. Применяется только с флагами 128 и 256, в противном случае игнорируется.

В отличие от флагов 2 и 4, флаги 128, 256 и 512 применяются попарно. Если, например, левый символ имеет значение 512, а правый символ — 128, разрыв строки не вставляется. Если мы используем значение 6 вместо левого символа, разрыв строки после символа не может быть подавлен, поскольку правый соседний символ не анализируется.

• Request: «.char» g [string]

• Request: «.fchar» g [string]

• Request: «.fschar» f g [string]

• Request: «.schar» g [string]

Запросы определят новый глиф «g» как «string» (строка может быть пустой). Каждый раз, когда необходимо вывести глиф «g», «string» обрабатывается во временной среде, результат заключен в единый объект. Режим совместимости выключен, а escape‐символ установлен на «\» во время обработки «string». Любое выделение, интервалы, кернинг применяются к объекту, а не к отдельным символам в «string».

Глиф, определенный этими запросами, может применяться так же, как обычный глиф, предоставленный устройством вывода. В частности, допускается транслировать другие символы с помощью запросов «tr» или «trin»; глиф можно сделать ведущим по запросу «lc»; также можно рисовать, используя управляющие последовательности «\l» и «\L»; слова, содержащие глиф, могут быть правильно расставлены через дефис, если глифу назначается код переноса запросом «hcode».

Существует специальная функция антирекурсии: применение «g» в определении глифа обрабатывается как обычные символы и символы, не определенные с помощью «char».

Обратите внимание, что запросы «tr» и «trin» приоритетные, если «char» обращается к одному и тому же символу.

.tr XY
X
= Y
.char X Z
X
= Y
.tr XX
X
= Z
Запрос «fchar» определяет глиф: gtroff проверит наличие глифов, определенных с помощью «fchar», только если не сможет найти глиф в текущем шрифте.

Запрос «fschar» определяет резервный глиф для шрифта «f»: gtroff проверяет наличие глифов, определенных с помощью «fschar» после списка шрифтов, объявленных как специальные шрифты запросом «fspecial», но перед списком шрифтов, объявленных глобальными специальными шрифтами.

Наконец, запрос «schar» определяет глиф глобального резерва: gtroff проверяет наличие глифов, определенных с помощью «schar», после списка шрифтов, объявленных как глобальные специальные шрифты запросом «special», но перед поиском специальных шрифтов.

• Request: «.rchar» c1 c2 \x85

• Request: «.rfschar» f c1 c2 ...

Первый запросы удалит определения глифов «c1», «c2». Отменяется эффект запросов «char», «fchar» или «schar». Допускается опустить пробел между аргументами. Запрос «rfschar» удаляет определение глифа, определенного с помощью «fschar» для глифа f.

Классы символов

Классы полезны при работе с текстами на языках Восточной Азии, таких как китайский, японский и корейский, где количество необходимых символов намного больше, чем в европейских языках, и где большие наборы символов имеют одинаковые свойства.

• Request: «.class» n c1 c2 ...

В groff «класс символов» (или просто класс) — это набор символов, сгруппированных по некоторому пользовательскому предпочтению. Запрос «class» определяет классы, чтобы другие запросы могли ссылаться на все символы, принадлежащие этому набору, как на одно имя класса. В настоящее время только запрос «cflags» способен обрабатывать классы символов.

Запрос «class» принимает имя класса, за которым следует список сущностей. В простейшей форме объекты представляют собой символы.

.class [prepunct] , : ; > }
Поскольку имена классов и глифов находятся в одном и том же пространстве имен, рекомендуется начинать и заканчивать имя класса символами «[» и «]», чтобы избежать конфликтов с обычными символами groff, а также пользовательскими символами. В частности, наличие «]» в имени символа препятствует использованию «\[...]», поэтому для доступа к классу с таким именем необходимо применить escape‐последовательность «\C».

Вы также можете использовать специальную нотацию диапазона символов, состоящую из начального символа или символа, за которым следует «‐», конечный символ. Программа gtroff преобразует эти два имени символа в значения Unicode, которые дают начальное и конечное значения диапазона. Если это не удается, определение класса пропускается.

Классы могут быть вложенными:

.class [prepunctx] \C’[prepunct]’
\[u2013]‐\[u2016]
Здесь класс «prepunctx» содержит класс «prepunct», как определено выше (набор «, : ; > }»), и символы в диапазоне от «U+2013» до «U+2016В».

Если вы хотите добавить «‐» к классу, символ должен быть первым значением в списке аргументов.

Обратите внимание, что нельзя использовать имена классов в определениях диапазонов.

Обычно запрос «class» применяется для управления правилами переноса строк, как определено в запросе «cflags».

Например, чтобы запретить разрывы строк перед символами, принадлежащими классу «prepunctx», вы можете написать следующее.

.cflags 2 \C’[prepunctx]’

Специальные шрифты

Специальные шрифты содержат символы, недоступные в обычных наборах шрифтах. Например, шрифт Symbol является специальным шрифтом.

Gtroff предоставляет два запроса на добавление дополнительных специальных шрифтов. Но обычно только устройства без TTY включают специальные шрифты.

• Request: «.special» [ s1 s2 ... ]

• Request: «.fspecial» f [ s1 s2 ... ]

Первый запрос создает определения специальных шрифтов. А запрос «fspecial» включает специальные шрифты только тогда, когда активен шрифт «f». Изначально списки пустые.

Вызовы «special» или «fspecial» перезаписываются; без аргументов конкретный список специальных шрифтов определяется как пустой. Специальные шрифты ищутся в том порядке, в котором записываются.

Модификации шрифтов

5.17.7 Artificial Fonts

Есть ряд запросов и последовательностей для искусственного создания шрифтов. Хотя это во многом пережиток дней, когда устройства вывода не имели разнообразия шрифтов и когда «nroff» и «troff» были самостоятельными программами.

• Escape: «\H’height’»

• Escape: «\H’+height’»

• Escape: «\H’‐height’»

• Register: «\n[.height]»

Изменяется (увеличивается, уменьшается) высота текущего шрифта, но не ширина. Если «height» равна нулю, восстанавливается исходная высота. Индикатор масштабирования по умолчанию «z».

Числовой регистр «.height», доступный только для чтения, содержит высоту шрифта, установленную в «\H».

В настоящее время функцию поддерживают только устройства «‐Tps» и «‐Tpdf».

Обратите внимание, что «\H» не создает входной маркер gtroff. Как следствие, регистр можно использовать в запросах «mc» для изменения шрифта в процессе работы.

.mc \H’+5z’x\H’0’
В режиме совместимости gtroff ведет себя иначе: если используется приращение или уменьшение, оно всегда происходит относительно текущего размера в пунктах, а не относительно ранее выбранной высоты шрифта.

.cp 1
\H’+5’test \H’+5’test
Здесь дважды печатается слово «test» с одинаковой высотой шрифта ‐ на пять пунктов больше, чем текущий размер шрифта.

• Escape: «\S’» slant «’»

• Register: «\n[.slant]»

Наклон текущего шрифта на «slant» градусов. Положительные значения наклоняют шрифт вправо. Возможны только целые значения.

Числовой регистр «.slant», доступный только для чтения, содержит значения наклона шрифта, заданного «\S».

В настоящее время функцию поддерживают только устройства «‐Tps» и «‐Tpdf».

Обратите внимание, что «\S» не создает входной маркер в gtroff.

.mc \S’20’x\S’0’
Этот запрос неправильно задокументирован в оригинальном руководстве Unix troff: наклон всегда устанавливается как абсолютное значение.

• Request: «.ul» [lines]

Запрос «ul» обычно подчеркивает последующие строки, если используется устройство вывода TTY. В противном случае строки печатаются курсивом. Единственным аргументом является количество подчеркиваемых строк ввода, без аргумента подчеркнута следующая строка. Если «lines» равны нулю или отрицательны, действие «ul» прекращается (если запрос был активен). Запросы и пустые строки не учитываются при подсчете количества подчеркнутых строк ввода.

Сначала «ul» сохраняет текущий шрифт и активирует подчёркнутый шрифт. В пределах действия запроса «ul» можно менять шрифты, но после последней строки, затронутой «ul», сохраненный шрифт восстанавливается.

Количество строк, которые нужно подчеркнуть, связано с текущим окружением. Шрифт подчеркивания можно изменить с помощью запроса «uf».

Запрос «ul» не подчеркивает пробелы.

• Request: «.cu» [lines]

Запрос «cu» похож на «ul», но подчеркивает пробелы (если используется устройство вывода TTY).

• Request: «.uf» font

Установит шрифт подчеркивания (глобально), используемый «ul» и «cu». По умолчанию шрифт в позиции 2. «Font» может быть либо неотрицательной позицией шрифта, либо названием шрифта.

• Request: «.bd» font [offset]

• Request: «.bd» font1 font2 [offset]

• Register: «\n[.b]»

Искусственно создается полужирный шрифт, каждый глиф выводится дважды с небольшим смещением.

Доступны две формы синтаксиса.

1. Имитирует полужирный шрифт. Первый аргумент задает шрифт для выделения жирным шрифтом, а второй — количество основных единиц минус один, на которое смещаются два глифа. Если второй аргумент отсутствует, выделение отключается.

«Font» может быть либо неотрицательной позицией шрифта, либо названием шрифта. Значение «offset» доступно в регистре только для чтения «.b», если активен специальный шрифт. В запросе «bd» единицей измерения по умолчанию считается «u».

2. Условно имитирует полужирную форму. Выделяет шрифт «font1» на «offset», только если шрифт «font2» является текущим шрифтом. Команду можно применять несколько раз, чтобы установить разные значения толщины для текущих шрифтов. Если второй аргумент отсутствует, толщина для этого конкретного текущего шрифта не устанавливается.

Влияет только на специальные шрифты, настроенные с помощью команды «special» в файлах шрифтов или с помощью запроса «fspecial».

• Request: «.cs» font [width [em‐size]]

Переключение в режим постоянного пробела глифа и обратно. Если активировано, ширина каждого глифа составляет width / 36ems. Размер em задается абсолютно, как «em‐size»; если аргумент отсутствует, значение em берется из текущего размера шрифта (установленного в запросе «ps»), когда шрифт используется. Без второго и третьего аргумента режим постоянного пробела глифа деактивируется.

Индикатор масштабирования по умолчанию для «em‐size» «z», целое число для «width».

Лигатуры и кернинг

Лигатуры — это группы символов, которые соединяются вместе, т.е. создается единый глиф. Например, буквы «f» и «i» могут образовывать лигатуру «fi», как в слове file. Это придает более чистый вид (хотя и ненавязчивый) распечатке. Обычно лигатуры недоступны в шрифтах для устройств вывода TTY.

Большинство шрифтов POSTSCRIPT поддерживают лигатуры fi и fl. Наборщик CAT, для которого создавалась программа AT&T troff, также поддерживал лигатуры «ff», «ffi» и «ffl». Продвинутые наборщики или «экспертные» шрифты могут включать лигатуры для «ft» и «ct», хотя GNU troff их не поддерживает.

Проверяется только текущий шрифт на наличие лигатур и кернов; ни специальные шрифты, ни объекты, определенные с помощью запроса «char», не принимаются во внимание.

• Request: «.lg» [flag]

• Register: «\n[.lg]»

Включит или выключит лигатурный механизм: если параметрр не равен нулю или отсутствует, лигатуры включены, в противном случае отключены. По умолчанию включено. Текущий режим лигатуры можно найти в доступном только для чтения числовом регистре «.lg» (устанавливается в 1 или 2, если лигатуры включены, в противном случае 0).

Установка режима лигатуры на 2 включает двухсимвольные лигатуры (fi, fl и ff) и отключает трехсимвольные лигатуры (ffi и ffl).

«Попарный кернинг» — еще один тонкий механизм набора текста, который изменяет расстояние между парой глифов для улучшения читаемости. В большинстве случаев (но не всегда) расстояние уменьшается. Шрифты, похожие на шрифт пишущей машинки, и шрифты для терминалов, где все глифы имеют одинаковую ширину, не используют кернинг.

• Request: «.kern» [flag]

• Register: «\n[.kern]»

Включит или выключит кернинг. Если параметрр отличен от нуля или отсутствует, включитпопарный кернинг, в противном случае отключит его. Доступный только для чтения числовой регистр «.kern» устанавливается в 1, если включен попарный кернинг, в противном случае 0.

Если файл описания шрифта содержит информацию о парном кернинге, глифы этого шрифта кернингуются. Кернинг между двумя глифами можно запретить, поставив между ними «\&» и «V\&A».

Кернинг увеличивает или уменьшает расстояние между глифами. Это может быть удобно, например, если вам нужно втиснуть длинное слово в одну строку или растянуть текст, чтобы заполнить узкую колонку. Его следует использовать с большой осторожностью, поскольку обычно считается плохой типографикой, если читатель замечает эффект.

• Request: «.tkf» f s1 n1 s2 n2

Включатся трековый кернинг для шрифта «f». Если текущий шрифт «f», ширина каждого глифа увеличивается на величину от «n1» до «n2» (значения «n1», «n2» могут быть отрицательными); если текущий размер точки меньше или равен «s1», ширина увеличивается на «n1»; если она больше или равна «s2», ширина увеличивается на «n2»; если размер точки больше или равен «s1» и меньше или равен «s2», увеличение ширины является линейной функцией размера точки.

Индикатор масштабирования по умолчанию: «z» для «s1» и «s2», «p» для «n1» и «n2».

Обратите внимание, что величина кернинга дорожки добавляется даже к самому правому глифу в строке; поэтому для больших значений рекомендуется увеличить длину на ту же величину, чтобы компенсировать это.

Иногда при наборе букв разных шрифтов требуется больше или меньше места на границах строки.

• Escape: «\/»

Увеличит ширину предыдущего глифа, чтобы интервал между этим и следующим глифом был правильным, если следующий глиф является буквой или знаком латинского алфавита. Например, если за курсивом «f» сразу следует римская правая скобка, то во многих шрифтах верхняя правая часть «f» перекрывает верхний левый угол правой скобки. Используйте эту escape‐последовательность, когда за курсивным глифом сразу следует латинский глиф без промежуточного пробела. Это небольшое пространство также называется «курсивной коррекцией».

• Escape: «\,»

Изменит интервал между следующим глифом, чтобы интервал между этим и предыдущим глифом был правильным, если предыдущий глиф является латинским глифом. Используйте эту управляющую последовательность, когда за римским глифом сразу следует курсивный глиф без промежуточного пробела. По аналогии с вышеизложенным, это пространство можно было бы назвать «коррекцией левого курсива», но этот термин не используется.

• Escape: «\»

• Escape: «\&»

Вставит невидимый символ нулевой ширины. Предотвращает вставку лишнего пробела после символа конца предложения.

Test.
Test.
= Test. Test.
Test.\&
Test.
= Test. Test.
Предотвращает интерпретацию управляющего символа в начале строки ввода.

.Test
= warning: [’ not defined
= The
value of xxx is 0xxx].
\*(bb
= The value of xxx is 12345.
Предотвращает кернинг между двумя глифами.

• Escape: «\.»

Эта последовательность аналогична «\&», за исключением того, что она ведет себя как символ, объявленный в запросе «cflags» прозрачным, чтобы отметить конец предложения.

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

.de xxx
\)\
..
.de
yyy
\&\
..
This is a test.\c
.xxx
This is a test.
= This is a test.’ This is a test.
This
is a test.\c
.yyy ’
This is a test.
= This is a
test.’ This is a test.

Размеры строк

Gtroff использует два размера для строк текста, шрифтов, интервалов по вертикали. Так, «type size» приблизительно равен высоте самого высокого глифа. «Вертикальный интервал» (vertical spacing) — это количество места, которое gtroff позволяет разместить в строке текста; обычно примерно на 20% больше, чем текущий размер шрифта. Меньшие соотношения могут привести к плохо читаемому шрифту. По умолчанию gtroff использует 10pt шрифт с 12pt интервалом.

Разница между размером шрифта и вертикальным интервалом известна наборщикам как «лидинг» (leading, произносится как лидинг).

Изменение размеров

5.18.1 Changing Type Sizes

• Request: «.ps» [size]

• Request: «.ps» +size

• Request: «.ps» ‐size

• Escape: «\s» size

• Register: «\n[.s]»

Используйте запрос «ps» или escape‐последовательность «\s», чтобы изменить (увеличить, уменьшить) размер шрифта (в пунктах). Укажите «size» либо как абсолютный размер в точках, либо как относительное изменение текущего размера. Размер 0 (как для «.ps», так и для «\s») или без аргумента (только для «.ps») возвращает к предыдущему.

Индикатор масштабирования по умолчанию «z». Если «size» отрицателен, он устанавливается равным 1u.

Доступный только для чтения числовой регистр «.s» возвращает размер точки в пунктах в виде десятичной дроби. Чтобы получить размер в масштабированных точках, используйте регистр «.ps».

snap, snap,
.ps +2
grin, grin,
.ps +2
wink, wink, \s+2nudge, nudge,\s+8 say no more!
.ps 10
Последовательность «\s» может называться по‐разному. Как и в других escape‐последовательностях, должен быть способ определить, где заканчивается аргумент и начинается текст.

Допустима любая из следующих форм.

«\s n»

Установит размер точки в «n» точек, где «n» должен быть либо 0, либо находиться в диапазоне от 4 до 39.

«\s+n»

«\s‐n»

Увеличит или уменьшит размер пункта на «n» точек, «n» указывается как одна цифра.

«\s(nn»

Установит размер в пунктах «nn», «nn» записывается двумя цифрами.

«\s+(nn»

«\s‐(nn»

«\s(+nn»

«\s(‐nn»

Увеличит или уменьшит размер пункта на «nn» точек, «nn» ‐ две цифры.

Обратите внимание, что «\s» не создает входной маркер в gtroff. Как следствие, форму можно использовать в запросах типа «mc», последний ожидает один символ в качестве аргумента, и применяется для изменения шрифта прямо в процессе работы.

.mc \s[20]x\s[0]
• Request: «.sizes» s1 s2 ... sn [0]

Некоторые устройства могут иметь только определенные размеры, в этом случае gtroff округляет до ближайшего допустимого. (Файл DESC указывает, какие размеры допустимы для устройства.)

Используйте запрос «sizes», чтобы изменить допустимые размеры для текущего устройства вывода. Аргументы в масштабированных пунктах; строка «sizescale» в файле DESC для устройства вывода обеспечивает коэффициент масштабирования. Например, если коэффициент масштабирования равен 1000, то значение 12000 соответствует 12pt.

Каждый аргумент может быть размером в один пункт (например, 12000) или диапазоном размеров (например, 4000‐72000). При желании вы можете закончить список нулем.

• Request: «.vs» [space]

• Request: «.vs» +space

• Request: «.vs» ‐space

• Register: «\n[.v]»

Изменяются (увеличиваются, уменьшаются) интервалы по вертикали на «space». Индикатор масштабирования по умолчанию «p».

Если «vs» вызывается без аргумента, интервал по вертикали сбрасывается до предыдущего значения перед последним вызовом «vs».

Программа gtroff создает предупреждение типа «range», если «space» отрицательный, затем интервал по вертикали устанавливается на наименьшее положительное значение, разрешение по вертикали (как указано в регистре «.V»).

Обратите внимание, что «.vs 0» не сохраняется в диверсиях, так как это не приводит к вертикальному перемещению. Следует явно повторить команду перед вставкой диверсии.

Доступный только для чтения числовой регистр «.v» содержит текущий интервал по вертикали, он связан с текущей средой.

Эффективное расстояние между строками по вертикали состоит из четырех компонентов. Разрыв строки вызывает действия в указанном ниже порядке.

1. Переместит текущую точку по вертикали на дополнительный интервал до вертикальной линии. Это минимальное значение всех escape‐символов «\x» с отрицательным аргументом в текущей строке вывода.

2. Переместит текущую точку по вертикали на расстояние между вертикальными линиями, заданное запросом «vs».

3. Выведет текущую строку.

4. Переместит текущую точку по вертикали на дополнительное пространство после вертикальной линии. Это максимальное значение всех escape‐символов «\x» с положительным аргументом в только что выведенной строке.

5. Переместит текущую точку по вертикали на поствертикальный межстрочный интервал, заданный в запросе «pvs».

Обычно следует применять «vs» или «pvs» вместо «ls» для создания документов с двойным интервалом: «vs» и «pvs» имеют более точную детализацию для вставленного вертикального пробела по сравнению с «ls». Кроме того, некоторые препроцессоры предполагают одинарный интервал.

• Request: «.pvs» [space]

• Request: «.pvs» +space

• Request: «.pvs» ‐space

• Register: «\n[.pvs]»

Изменеятся (увеличивается, уменьшается) поствертикальный интервал на «space». Индикатор масштабирования по умолчанию «p».

Если «pvs» вызывается без аргумента, поствертикальный интервал сбрасывается до предыдущего значения перед последним вызовом «pvs».

Программа gtroff создает предупреждение типа «range», если «space» равен нулю или отрицателен, при этом вертикальное расстояние устанавливается равным нулю.

Доступный только для чтения числовой регистр «.pvs» содержит текущий поствертикальный интервал, связанный с текущей средой.

Дробные размеры

«Масштабированная точка» равна 1 / sizescale точек, где «sizescale» указан в файле DESC (по умолчанию 1). Имеется индикатор масштаба «z», дающий эффект умножения на «sizescale». Запросы и escape‐последовательности в gtroff интерпретируют аргументы, представляющие размер пунктов, как единицы масштабированных точек, но они оценивают каждый такой аргумент, используя индикатор шкалы по умолчанию «z».

Аргументы, обрабатываемые таким образом, являются аргументом запроса «ps», третьим аргументом запроса «cs», вторым и четвертым аргументами запроса «tkf», аргументом escape‐последовательности «\H».

Например, «sizescale» равен 1000; тогда масштабированная точка эквивалентна одной тысячной пункта; запрос «.ps 10.25» эквивалентен «.ps 10.25z» и, таким образом, устанавливает размер точки в 10250 масштабированных точек, что равно 10,25 пункта.

Программа gtroff запрещает использование индикатора шкалы «z» в тех случаях, когда это не имеет смысла. Например, числовое выражение, индикатор шкалы которого по умолчанию не был ни «u», ни «z». Точно так же не имеет смысла применять индикатор масштабирования, отличный от «z» или «u» в числовом выражении, индикатор масштаба которого по умолчанию «z».

Также существует индикатор масштаба «s», он умножает на количество единиц в масштабируемой точке. Например, «\n[.ps]s» равно 1m.

• Register: «\n[.ps]»

Числовой регистр только для чтения, возвращающий размер пункта в масштабированных точках.

Аргумент «.ps» связан с текущим окружением.

• Register: «\n[.psr]»

• Register: «\n[.sr]»

Последний запрошенный размер пункта в масштабированных точках содержится в числовом регистре «.psr», доступном только для чтения. Последний запрошенный размер пункта в виде десятичной дроби можно найти в «.sr». Это строковый числовой регистр, доступный только для чтения.

Обратите внимание, что запрошенные размеры точек не зависят от устройства, в то время как значения, возвращаемые регистрами «.ps» и «.s», зависят. Например, если запрашивается размер пункта 11pt, а запрос «sizes» (или строка «sizescale» в файле DESC) указывает 10,95pt, фактически используется это значение.

Оба регистра связаны с текущей средой.

Escape‐последовательность «\s» имеет следующий синтаксис для работы с дробными размерами шрифта.

«\s[«n»

«\s’«n»’»

Здесь устанавливаются размеры пункта в «n» масштабированных точек; «n» — числовое выражение с индикатором масштаба по умолчанию «z».

«\s[+«n»

«\s[‐«n»

«\s+[«n»

«\s‐[«n»

«\s’+«n»’»

«\s’‐«n»’»

«\s+’«n»’»

«\s‐’«n»’»

Здесь увеличиваются или уменьшаются размеры пункта на «n» масштабируемых точек; «n» — это числовое выражение (которое может начинаться со знака минус) с индикатором масштаба по умолчанию «z».

Файлы настройки

Формат шрифта «gtroff» — это надмножество «ditroff» и более поздних версий troff AT&T. В отличие от формата шрифта «ditroff», в «gtroff» нет связанного бинарного формата, все файлы считаются текстовыми файлами. Имена файлов тесно связаны с именами устройств, например, файлы для устройства «name» хранятся в каталоге «devname».

Кроме того, существует два типа файлов: файл описания устройства под названием «DESC», а также файл для каждого шрифта под названием «f».

Файл описания устройств DESC

Файл «DESC» может содержать описанные ниже типы строк. За исключением ключевого слова «charset», которое должно быть последним, если используется, порядок строк не важен. Однако последние добавленные записи в файле переопределяют предыдущие значения.

«charset»

Эта строка (и все последующие) игнорируется. Правило добавлено из‐за требований обратной совместимости.

«family fam»

Семейство шрифтов по умолчанию «fam».

«fonts n F1 F2 F3 ... Fn»

Шрифты «F1», «Fn» монтируются в позиции шрифта «m + 1», «m + n», где «m» — количество начертаний. Команда может занимать более одной строки. Имя шрифта 0 означает, что в соответствующей позиции не установлено никакого шрифта.

«hor n»

Разрешение по горизонтали составляет «n» машинных единиц. Все горизонтальные величины округляются до кратных.

«image_generator string»

Требуется только для «grohtml». Определяет программу для создания изображений PNG из ввода POSTSCRIPT. В GNU/Linux обычно применяется «gs», но в других системах (например, cygwin) может быть установлена другая программа.

«paperlength n»

Физический вертикальный размер выходного носителя в машинных единицах. Используется устройствами вывода. Устарело. Следует применять «papersize».

«papersize string»

Размер бумаги. Допустимыми значениями для «string» являются типы бумаги ISO «A0» «A7», «B0» «B7», «C0», «C7», «D0» «D7», «DL». Также применяются типы бумаги США: «letter», «legal», «tabloid», «ledger», «statement», «executive», «com10» и «monarch». Регистр не имеет значения для «string», если строка содержит предопределенные типы бумаги. Кроме того, «string» может быть именем файла (например, «/etc/papersize»). Если файл можно открыть, «groff» читает первую строку и проверяет указанные выше размеры бумаги. Наконец, «string» может быть произвольным размером бумаги в формате «длина», «ширина» (без пробелов до и после запятой).

И «длина», и «ширина» должны использовать единицу измерения; действительные значения: «i» для дюймов, «c» для сантиметров, «p» для пунктов и «P» для пайки (например, «12c,235p»). Аргумент, начинающийся с цифры, всегда рассматривается как пользовательский формат бумаги. «Papersize» устанавливает как вертикальный, так и горизонтальный размер выходного носителя. Также допускается указать более одного аргумента. Groff сканирует слева направо и использует первую допустимую спецификацию бумаги.

«paperwidth n»

Физический горизонтальный размер выходного носителя в машинных единицах. Используется устройствами вывода. Устарело. Вместо этого применяется «papersize».

«pass_filenames»

Заставляет «gtroff» выдать имя исходного файла, который в данный момент обрабатывается с помощью промежуточной выходной команды «F». В настоящее время используется только препроцессором «grohtml».

«postpro program»

Вызов «program» в качестве постпроцессора.

postpro grodvi
(Команда заставляет «groff» вызывать «grodvi», если задана опция «‐Tdvi».)

«prepro program»

Вызывает «program» в качестве препроцессора. В настоящее время ключевое слово используется groff только с опцией «‐Thtml» или «‐Txhtml».

«print program»

Применяет «program» в качестве программы‐спулера для печати. Если аргумент опущен, опции «‐l» и «‐L» команды groff игнорируются.

«res n»

На дюйм «n» машинных единиц.

«sizes s1 s2 sn 0»

Подразумевает, что на устройстве установлены шрифты масштабирования «s1», «s2», «sn». Список размеров должен заканчиваться 0 (нулевая цифра). Каждый «si» также может быть диапазоном размеров «m» и «n». Список может занимать более одной строки.

«sizescale n»

Масштабный коэффициент размеров пункта. По умолчанию значение 1. Одна точка масштабирования равна point / n. Аргументы команд «unitwidth» и «sizes» задаются в масштабированных пунктах.

«styles S1 S2 ~ Sm»

Первые позиции шрифта «m» связаны со стилями «S1 ~ Sm».

«tcommand»

Разрешает постпроцессору обрабатывать команды промежуточного вывода «t» и «u».

«unicode»

Указывает, что устройство вывода поддерживает Unicode. Полезно для устройств, которые создают «символьные сущности» вместо глифов.

Если присутствует «unicode», раздел «charset» не требуется в файлах описания шрифта, поскольку используется встроенная в groff обработка Unicode. Однако, если в разделе «charset» есть записи, они либо переопределяют сопоставления по умолчанию для этих конкретных символов, либо добавляют новые сопоставления (обычно для составных символов).

Используется с утройствами и кодировками «‐Tutf8», «‐Thtml» и «‐Txhtml».

«unitwidth n»

Количество в файлах шрифтов указано в машинных единицах для шрифтов, размер которых составляет «n» масштабированных пунктов.

«unscaled_charwidths»

Заставит модуль обработки шрифтов всегда возвращать немасштабированную ширину символов. Необходимо для устройства «grohtml».

«use_charnames_in_special»

Команда заставляет gtroff кодировать специальные символы внутри команд. В настоящее время используется только устройством вывода «grohtml».

«vert n»

Разрешение по вертикали составляет «n» машинных единиц. Все вертикальные величины округляются до кратных этому значению.

Строки «res», «unitwidth», «fonts» и «sizes» являются обязательными. Другие команды игнорируются gtroff, но могут использоваться постпроцессорами для хранения произвольной информации об устройстве в файле «DESC».

Следующие устаревшие ключевые слова распознаются groff, но полностью игнорируются: «spare1», «spare2», «biggestfont».

Файл описания шрифта

Файл шрифта, также называемый файлом описания шрифта, состоит из двух разделов. Первый раздел представляет собой строки, каждая из которых содержит последовательность слов, разделенных пробелами. Первое слово в строке считается ключом, последующие слова содержат значение ключа.

«name f»

Название шрифта «f».

«spacewidth n»

Нормальная ширина пробела «n».

«slant n»

Наклон глифа шрифта «n» градусов.

«ligatures lig1 lig2 ... lign [0]»

Глифы «lig1», «lig2», «lign» являются лигатурами. Возможные лигатуры: «ff», «fi», «fl», «ffi» и «ffl». Для обратной совместимости список лигатур может заканчиваться нулем. Список лигатур не может занимать более одной строки.

«special»

Шрифт «special»: когда запрашивается глиф, отсутствующий в текущем шрифте, он ищется во всех установленных специальных шрифтах.

Другие команды игнорируются gtroff, но могут использоваться постпроцессорами для хранения произвольной информации о шрифте.

Первый раздел может содержать комментарии, начинающиеся с символа «’» и доходящие до конца строки.

Второй раздел включает один или два подраздела. Он должен содержать подраздел «charset», а также может содержать подраздел «kernpairs». Эти подразделы определяются в любом порядке. Каждый подраздел начинается со слова в отдельной строке.

Слово «charset» начинает подраздел набора символов. За строкой «charset» следует последовательность строк. Каждая строка предоставляет информацию для одного глифа. Строка состоит из нескольких полей, разделенных пробелами или символами табуляции.

:: «name» «metrics» «type» «code» [«entity‐name»] [«‐‐» «comment»]

Здесь «name» идентифицирует имя глифа: если «name» одиночный символ «c», он соответствует входному символу gtroff «c»; если имеет форму «\c», где «c» — одиночный символ, то соответствует специальному символу «\[c]», в противном случае ему соответствует специальный символ «\[«name». Если два символа «xx», их можно ввести как «\(xx».

Обратите внимание, что однобуквенные специальные символы не доступны как «\c», единственным исключением является «\‐», который идентичен «\[‐]».

Программа gtroff поддерживает ввод 8‐битных символов, однако некоторые утилиты плохо работают с восьмибитовыми символами. По этой причине существует соглашение, согласно которому имя объекта «char n» эквивалентно единственному входному символу с кодом «n». Например, «char163» будет эквивалентен символу с кодом 163, который является знаком фунта стерлингов в наборе символов ISO Latin‐1. Вы не должны использовать сущности «char n» в файлах описания шрифта, так как они связаны с вводом, а не выводом. В противном случае вы получите жестко закодированные связи между входной и выходной кодировками, что предотвращает использование разных (входных) наборов символов.

Имя «‐‐‐» считается специальным и указывает на то, что глиф безымянный, такие глифы можно использовать только с помощью управляющей последовательности «\N».

Ниже даются варианты типов глифа.

«1»

У глифа есть нисходящий элемент, например, «p».

«2»

У глифа есть надстрочный элемент, например, «b».

«3»

У глифа есть надстрочный элемент, например, «(».

Поле «code» содержит код, который постпроцессор использует для печати глифа. Глиф можно также ввести в gtroff с помощью этого кода и управляющей последовательности «\N». Поле «code» может быть любым целым числом. Если начинается с «0», интерпретируется как восьмеричное; если начинается с «0x» или «0X», интерпретируется как шестнадцатеричное. Обратите внимание, управляющая последовательность «\N» принимает только десятичное целое число.

Поле «entity‐name» содержит строку ASCII, идентифицирующую глиф, который постпроцессор использует для печати глифа «name». Это поле является необязательным и введено для того, чтобы драйвер устройства «grohtml» мог кодировать свой набор символов. Например, глиф «\[Po]» представлен как «£» в HTML 4.0.

Все, что находится в строке после поля «entity‐name» и после «‐‐» игнорируется.

Поле «metrics» имеет следующую форму.

:: «width»[,«height»[,«depth»[,«italic‐correction»[,«left‐italic‐correction»[,«subscript‐correction»]]]]]

Между подполями не должно быть пробелов (здесь они разделены на две строки только для удобства чтения). Предполагается, что отсутствующие подполя равны 0. Все подполя представляют собой десятичные целые числа. Так как нет связанного бинарного формата, значения не обязаны вписываться в переменную типа «char», как в программе ditroff.

Подполе «width» дает ширину глифа.

Подполе «height» дает высоту глифа (вверх ‐ положительное значение); если глиф не выходит за пределы базовой линии, ему следует присвоить не отрицательную, но нулевую высоту.

Подполе «depth» дает глубину глифа, то есть расстояние от базовой линии до самой нижней точки ниже базовой линии, до которой распространяется глиф (вниз ‐ положительное значение); если глиф не простирается ниже базовой линии, ему следует присвоить нулевую глубину.

Подполе «italic‐correction» указывает количество места, добавляемого после глифа, когда за ним сразу следует глиф из латинского шрифта.

Подполе «left‐italic‐correction» указывает количество места, которое должно быть добавлено перед глифом, если ему непосредственно предшествует глиф из римского шрифта.

«Subscript‐correction» определяет количество места, которое должно быть добавлено после глифа перед добавлением нижнего индекса.

Слово «kernpairs» начинает раздел kernpairs. Содержит последовательность строк вида «c1 c2 n».

В случае, когда глиф «c1» появляется рядом с глифом «c2», расстояние между ними должно быть увеличено на «n». Большинство записей в разделе kernpairs имеют отрицательное значение «n».

Перемещение по странице

5.22 Page Motions

• Request: «.mk» [reg]

• Request: «.rt» [dist]

Запрос «mk» может применяться для указания местоположения на странице. Запрос принимает «reg» как аргумент для сохранения текущего местоположения на странице. Без аргумента сохраняет местоположение во внутреннем регистре. Результаты могут использоваться запросом «rt» или «sp» (или escape‐последовательностью «\v»).

Запрос «rt» перемещает внутренний указатель вверх к местоположению, отмеченному последним запросом «mk». Если запрос вызывается с аргументом, указатель переместится к позиции, расстояние от которой до верха страницы равно «dist» (в этом случае нет необходимости в предварительном вызове «mk»). Индикатор масштабирования по умолчанию «v».

Если между запросом «mk» и соответствующим ему запросом «rt» окажется разрыв страницы, «rt» игнорируется.

Ниже простой пример двухколоночного макроса.

.nr column‐length 1.5i
.nr column‐gap 4m
.nr bottom‐margin 1m
.
.de 2c
. br
. mk
. ll
\n[column‐length]u
. wh ‐\n[bottom‐margin]u 2c‐trap
. nr right‐side 0
..
.
.de 2c‐trap
. ie \n[right‐side]
\{\
. nr right‐side 0
. po ‐(\n[column‐
length]u + \n[column‐gap]u)
. \’’ remove trap
. wh
‐\n[bottom‐margin]u
. \}
. el \{\
. \’’ switch to right side
. nr right‐side 1
. po
+(\n[column‐length]u + \n[column‐gap]u)
. rt
.
\}
..
.
.pl 1.5i
.ll 4i
This is a small test
that shows how the
rt request works in combination with mk.
.2c
Starting here, text is typeset in two columns.
Note
that this implementation isn’t robust
and thus not suited for a real
two‐column
macro.
Следующие escape‐последовательности обеспечивают точное управление перемещением по странице.

• Escape: «\v’e’»

Перемещение по вертикали, обычно из текущего места на странице (если не указан оператор абсолютного положения «|»). Аргумент «e» определяет расстояние, на которое следует переместиться; положительное значение ‐ перемещение вниз, отрицательное ‐ вверх. Индикатор масштабирования «v». Однако gtroff продолжит обработку текста в точке, где заканчивается перемещение.

Последовательнось «\v» не работает как ловушка, это позволяет, например, определить макрос ловушки внизу страницы, выводящий текст на полях.

Для вертикального перемещения есть специальные escape‐последовательности.

• Escape: «\r»«»

Перемещение вверх на 1т.

• Escape: «\u»«»

Перемещение вверх 0,5v.

• Escape: «\d»«»

Перемещение вниз на 0,5v.

• Escape: «\h’e’»

Перемещение по горизонтали, обычно из текущего местоположения (если не используется «|»). Аргумент «e» указывает, насколько далеко переместится указатель: положительное значение — вправо, отрицательное — влево. Индикатор масштабирования «m».

Горизонтальный пробел не удаляется в конце строки. Но чтобы вставить отбрасываемый пробел определенной длины, примените запрос «ss».

Существуют специальные escape‐последовательности для горизонтального перемещения.

• Escape: «\SP»«»

Определяет неразрывное и не заполняемое (т.е. не расширяющееся при заполнении) пространство. (Это обратная косая черта, за которой следует пробел.)

• Escape: «\~»

Неразрывный пробел, он растягивается как обычный пробел между словами при корректировке строки.

• Escape: «\|»

Пространство 1/6em. Игнорируется для устройств вывода TTY (округляется до нуля).

Однако, если в текущем файле шрифта определен глиф с именем «\|» (обратите внимание на обратную косую черту в начале), используется ширина этого глифа даже для устройств TTY.

• Escape: «\^»

Пространство 1/12em. Игнорируется устройствами вывода TTY (округляется до нуля).

Однако, если в текущем файле шрифта определен глиф с именем «\^» (обратите внимание на обратную косую черту в начале), используется ширина этого глифа.

• Escape: «\0»

Пробел размером с цифру.

Следующая строка выводит логотип TeX.

.ds TeX
T\h’‐.1667m’\v’.224m’E\v’‐.224m’\h’‐.125m’X
• Escape: «\w’text’»

• Register: «\n[st]»

• Register: «\n[sb]»

• Register: «\n[rst]»

• Register: «\n[rsb]»

• Register: «\n[ct]»

• Register: «\n[ssc]»

• Register: «\n[skw]»

Запросы возвращают ширину «text» в базовых единицах. Это позволяет перемещаться по горизонтали в зависимости от ширины произвольного текста (например, заданного в качестве аргумента макроса).

The length of the string abc’ is 72u.
В «text» могут произойти изменения шрифта, не влияющие на текущие настройки.

После применения «\w» устанавливается несколько регистров.

«st»

«sb»

Регистры содержат значения самой высокой и самой низкой точек базовой линии в «text».

«rst»

«rsb»

Аналогично регистрам «st» и «sb», но учитывается высота и глубина глифов. Значения ниже базовой линии являются отрицательными.

«ct»

Определяются виды глифов, встречающихся в «text».

Возможны следующие варианты.

• 0

Только короткие глифы, без выносных элементов или высоких глифов.

• 1

Хотя бы одно устройство.

• 2

Хотя бы один длинный глиф.

• 3

По крайней мере по одному нижнему и высокому глифу.

«ssc»

Количество горизонтального пространства (возможно отрицательное значение), которое должно быть добавлено к последнему глифу перед нижним индексом.

«skw»

Насколько правее центра последнего глифа в аргументе «\w» должен располагаться центр ударения латинского шрифта (поверх этого глифа).

• Escape: «\k p»

• Escape: «\k( ps»

• Escape: «\k[position]»

Сохраняют текущую позицию по горизонтали во входной строке регистра с именем «position» (односимвольное имя «p», двухсимвольное «ps»). Например, чтобы вернуться к началу строки для выделения.

• Register: «\n[hp]»

Текущая позиция по горизонтали в строке ввода.

• Register: «\n[.k]»

Регистр только для чтения, содержащий текущую позицию вывода по горизонтали (относительно текущего отступа).

• Escape: «\o abc»

Перечеркнутые глифы «a», «b», «c»; глифы центрированы, результирующий интервал является наибольшей шириной глифов.

• Escape: «\z» g

Вывести глиф «g» с нулевой шириной, т.е. без пробела. Применяется, например, чтобы зачеркивать глифы, выровненные по левому краю.

• Escape: «\Z» anything

Выведет «anything», затем восстановит положение по горизонтали и вертикали.

Ниже приведен пример макроса с перечеркнутыми глифами.

.de ST
.nr ww \w’\’
\Z@\v’‐.25m’\l’\n[ww]u’@\
..
.
This is
.ST "a test"
an actual emergency!

Геометрические фигуры

Gtroff предоставляет несколько методов рисования линий и геометрических фигур на странице. Так, если запросы применяются в сочетании с командами перемещения, можно рисовать сложные фигуры. Однако для сложных рисунков запросы могут быть громоздкими, и скорее всего целесообразно включить графические препроцессоры, такие как «gpic» или «ggrn».

Отрисовки выполняются с помощью escape‐последовательностей.

• Escape: «\l l»

• Escape: «\l lg»

Последовательности выводят горизонтальную линию, где «l» — длина линии. Если значение положительное, линия начинается с текущего места и продолжается вправо; конечная точка — новое текущее местоположение. Отрицательные значения обрабатываются иначе: линия начинается в текущем местоположении и рисуется влево, но местоположение не меняется.

Аргумент «l» также может быть указан как абсолютный (т.е. с ведущим «|»), что возвращает к началу входной строки. Индикатор масштабирования по умолчанию «m».

Необязательный второй параметрр «g» — глиф для рисования линии. Если второй аргумент не указан, gtroff использует знак подчеркивания «\[ru]».

Для разделения аргументов, чтобы gtroff не интерпретировал глиф рисунка как индикатор масштабирования, если глиф представлен одним символом, применяется «\&».

.de box
\[br][br]\l’|0\[rn]’\l’|0\[ul]’
..
.box
Обратите внимание, выводится вертикальная линия.

• Escape: «\L l»

• Escape: «\L lg»

Последовательности рисуют вертикальные линии. Параметры аналогичны escape‐последовательности «\l», но индикатором масштабирования по умолчанию является «v». Положительные значения перемещают виртуальный указатель вниз, отрицательные вверх. Глиф по умолчанию «\[br]». Как и в случае вертикального перемещения, обработка текста продолжается там, где заканчивается строка.

This is a \L’3v’test.
• Escape: «\D’» command arg ... «’»

Последовательность «\D» предоставляет различные функции рисования. Обратите внимание, что на символьных устройствах «grotty» поддерживаются только вертикальные и горизонтальные линии; другие устройства могут поддерживать только часть доступных функций рисования.

Индикатор масштабирования по умолчанию для всех субкоманд «\D» определен как «m» по горизонтали и как «v» для расстояний по вертикали. Исключениями являются «\D’f’» и «\D’t’», которые используют «u» по умолчанию, и «\D’Fx», аргументы которого обрабатываются аналогично запросу «defcolor».

«\D’l dx dy’»

Рисует линию от текущего местоположения до относительной точки, заданной («dx», «dy»), где положительные значения означают вправо и вниз соответственно. Конечная точка линии — новое текущее местоположение.

Следующий пример создает рамку вокруг текстовой строки; для простоты поле принимается как фиксированное значение, равное 0,2m.

.de BOX
. nr @wd \w’\’
\h’.2m’\
\h’‐.2m’\v’(.2m ‐
\n[rsb]u)’\
\D’l 0 ‐(\n[rst]u ‐
\n[rsb]u + .4m)’\
\D’l (\n[@wd]u + .4m)
0’\
\D’l 0 (\n[rst]u ‐ \n[rsb]u +
.4m)’\
\D’l ‐(\n[@wd]u + .4m) 0’\
\h’.2m’\v’‐(.2m ‐ \n[rsb]u)’\
\h’.2m’
..
Ширина строки сохраняется в регистре «@wd». Затем рисуются четыре линии, формирующие прямоугольник, смещенный за пределы поля. Регистры «rst» и «rsb» задаются escape‐последовательностью «\w», содержащей наибольшую высоту и глубину всей строки.

«\D’c d’»

Рисует круг диаметром «d» с крайней левой точкой в текущей позиции. После рисования текущее местоположение смещается в самую правую точку круга.

«\D’C d’»

Рисует сплошной круг с параметррами, как у контурного круга. Контур не рисуется.

«\D’e «x» «y»’»

Рисует эллипс с горизонтальным диаметром «x» и вертикальным диаметром «y» с крайней левой точкой в текущем положении. После рисования текущее местоположение располагается в самой правой точке эллипса.

«\D’E x y’»

Рисует сплошной эллипс с теми же параметррами, что и контурный эллипс. Контур не рисуется.

«\D’a dx1 dy1 dx2 dy2’»

Выводит дугу по часовой стрелке из текущего местоположения через два относительных местоположения [«dx1», «dy1»] и [«dx2», «dy2»]. Координаты первой точки относятся к текущему положению, а координаты второй точки к первой точке. После рисования текущая позиция перемещается в конечную точку дуги.

«\D’~ dx1 dy1 dx2 dy2’»

Нарисует сплайн от текущего местоположения до относительной точки [«dx1», «dy1»], а затем до [«dx2», «dy2»] и так далее. Текущая позиция перемещается в конечную точку нарисованной кривой.

«\D’f n’»

Установит оттенок серого на «n», значение будет использоваться для заливки сплошных объектов; «n» должно быть целым числом от 0 до 1000, где 0 соответствует сплошному белому цвету, а 1000 — сплошному черному, промежуточные значения соответствуют оттенкам серого. Применяется к сплошным кругам, сплошным эллипсам и сплошным многоугольникам. По умолчанию используется уровень 1000. Текущая точка перемещается по горизонтали вправо на «n».

Не применяйте эту команду, вместо нее используйте «\M» или «\D’Fg’».

«\D’p dx1 dy1 dx2 dy2’»

Нарисует многоугольник из текущего местоположения в относительное положение [«dx1», «dy1»], затем в [«dx2», «dy2»] и так далее. Текущая позиция изменяется путем прибавления суммы всех аргументов с нечетным индексом к фактической позиции по горизонтали, а четных — к позиции по вертикали.

«\D’P dx1 dy1 dx2 dy2’»

Нарисует сплошной многоугольник с параметррами контурного многоугольника. Контур не рисуется.

Ниже вариант макроса для заполнения фигуры цветом. Обратите внимание, что рамка должна быть нарисована перед текстом, так как цвета в gtroff непрозрачны. Заполненный многоугольник полностью скроет текст.

.de BOX
. nr @wd \w’\’
\h’.2m’\
\h’‐.2m’\v’(.2m ‐
\n[rsb]u)’\
\M[lightcyan]\
\D’P 0
‐(\n[rst]u ‐ \n[rsb]u + .4m) \
(\n[@wd]u +
.4m) 0 \
0 (\n[rst]u ‐ \n[rsb]u + .4m) \
‐(\n[@wd]u + .4m) 0’\
\h’.2m’\v’‐(.2m ‐
\n[rsb]u)’\
\M[]\
\h’.2m’
..
\h’1i’\v’1i’\
\#
increase line thickness
\Z’\D’t 5p’’\
\# draw unfilled polygon
\Z’\D’p 3 3 ‐6 0’’\
\# draw filled polygon
\Z’\D’P 3 3 ‐6 0’’
«\D’t n’»

Установит текущую толщину линии на «n» машинных единиц. Нулевое значение подразумевает наименьшую доступную толщину линии. Отрицательное значение делает толщину линии пропорциональной текущему размеру точки (поведение по умолчанию troff AT&T).

Текущая точка перемещается по горизонтали вправо на «n».

«\D’F scheme color_components’»

Изменит текущий цвет заливки. Здесь «scheme» — одна буква, обозначающая цветовую схему: «r» (rgb), «c» (cmy), «k» (cmyk), «g» (серый) или «d» (цвет по умолчанию). Компоненты цвета используют синтаксис, как в запросе «defcolor»; команда «\D’Fd’» не принимает аргумент.

Примеры.

\D’Fg .3’ \’’ same gray as \D’f
700’
\D’Fr #0000ff’ \’’ blue
• Escape: «\b’» string «’»

Соединяет последовательность глифов по вертикали, центрирует по вертикали на текущей строке. Применяется, чтобы нарисовать, например, большие скобки.

Пример большой открывающей скобки.

\b’\[lt]\[bv]\[lk]\[bv]\[lb]’
Первый глиф находится вверху, последний глиф «string» — внизу. Обратите внимание, что gtroff разделяет глифы по вертикали на 1m, а весь объект центрируется на 0,5m выше текущей базовой линии. Наибольшая ширина глифа используется как ширина всего объекта. Этот алгоритм позиционирования не работает с опцией «‐Tdvi». В последнем случае примените препроцессор «eqn».

Настройки цвета

• Request: «.color» [n]

• Register: «\n[.color]»

Если «n» отсутствует или отличен от нуля, активируются цвета по умолчанию, в противном случае цвет отключен.

Числовой регистр «.color», доступный только для чтения, равен 1, если цвета активны, иначе 0.

Параметр «color» устанавливает глобальный флаг, не создающий токена. Вы должны применять его в начале документа для управления цветным выводом.

Цвета также можно отключить с помощью параметрра командной строки «‐c».

• Request: «.defcolor» ident scheme color_components

Определяет цвет с именем «ident». Аргумент «scheme» может принимать одно из следующих значений: «rgb» (три компонента), «cmy» (три компонента), «cmyk» (четыре компонента), «grey» или «grey» (один компонент).

Компоненты цвета могут быть заданы либо в виде шестнадцатеричной строки, либо в виде целых положительных десятичных чисел в диапазоне 0‐65535. Шестнадцатеричная строка содержит все объединенные компоненты цвета. Она должна начинаться либо с запятой, либо с точки с запятой. Первое указывает шестнадцатеричные значения в диапазоне 0‐255 (они умножаются на 257), второе в диапазоне 0‐65535.

• Примеры: «#FFC0CB» (розовый цвет), «ffff0000ffff» (пурпурный). Значение имени цвета по умолчанию зависит от устройства, обычно это черный цвет. Возможно, что цвет по умолчанию для «\m» и «\M» не идентичен.

Также введен показатель масштабирования «f», который умножает свое значение на 65536, что делает удобным указание компонентов цвета в виде дробей в диапазоне от 0 до 1.

:: .defcolor darkgreen rgb 0.1f 0.5f 0.2f

Обратите внимание, что «f» является индикатором масштабирования по умолчанию для запроса «defcolor», таким образом, указанный выше оператор эквивалентен записи:

:: .defcolor darkgreen rgb 0.1 0.5 0.2

• Request: «.gcolor» [color]

• Escape: «\m» c

• Escape: «\m(» co

• Escape: «\m[» color «]»

• Register: «\n[.m]»

Устанавливаются цвета глифа или рисунка. В следующих примерах показано, как сделать четыре слова красными.

.gcolor red
these are in red
.gcolor
and these words are in black.
\m[red]these are in red\m[] and these
words are in black.
Последовательность «\m[]» возвращает к предыдущему цвету, подобно вызову «gcolor» без аргумента.

Имя текущего цвета рисунка доступно в строковом числовом регистре только для чтения «.m».

Цвет рисунка связан с текущим окружением.

Обратите внимание, что «\m» не создает входной маркер в gtroff. Как следствие, последовательность можно использовать в запросах типа «mc» для изменения цвета на лету.

.mc \m[red]x\m[]
• Request: «.fcolor» [color]

• Escape: «\M» c

• Escape: «\M(» co

• Escape: «\M[» color «]»

• Register: «\n[.M]»

Задает цвет заливки (фона) для объектов, нарисованных с помощью команд «\D’...’».

Красный эллипс можно создать с помощью следующего кода.

\M[red]\h’0.5i’\D’E 2i
1i’\M[]
Последовательность «\M[]» возвращает к предыдущему цвету заливки. Имя текущего цвета заливки доступно в числовом регистре «.M».

Обратите внимание, «\M» несоздает токен ввода в gtroff.


Оглавление

  • Оглавление.
  • Текстовой процессор GNU troff
  • История troff
  • Основные возможности
  • Командная строка
  • Опции командной строки
  • Вывод на устройство
  • Переменные окружения
  • Каталоги макросов
  • Каталоги шрифтов
  • Страница, размер страницы
  • Примеры работы CLI
  • Утилита grod
  • Основные объекты gtroff
  • Текст
  • Перенос слова
  • Соглашения набора
  • Табуляторы
  • Разрыв строки
  • Внутренние соглашения
  • Входные кодировки
  • Единицы измерения
  • Единица измерения по умолчанию
  • Арифметика, логика, выражения, операторы
  • Идентификаторы
  • Встроенные команды
  • Встроенные запросы
  • Аргументы макросов и запросов
  • Встроенные макросы
  • Экранирование
  • Комментарии
  • Числовые регистры
  • Установка регистров
  • Интерполяция регистров
  • Регистры, автоинкремент
  • Переопределение форматов
  • Встроенные регистры
  • Корректировка и наполнение
  • Управление переносами слов
  • Управление пространством
  • Поля и табуляция
  • Лидеры
  • Поля
  • Трансляция символов
  • Режимы troff и nroff
  • Размещение строк
  • Контроль строк
  • Макеты страниц
  • Контроль страницы
  • Строковые переменные
  • Операторы if, ie, while
  • Конструкция if‐else
  • Цикл while
  • Добавление файлов
  • Доступ к постпроцессорам
  • Дополнительные команды
  • Внутренние преобразования gtroff
  • Отладка
  • Предупреждения и ошибки
  • Особенности программы troff
  • Препроцессоры
  • Постпроцессор grotty
  • Постпроцессор grops
  • Встроенный POSTSCRIPT
  • Постпроцессор gropdf
  • Команды PDF
  • Постпроцессор grodvi
  • Постпроцессор grolj4
  • Постпроцессор grolbp
  • Постпроцессор grohtml
  • Специальные регистры и строки grohtml
  • Промежуточные форматы вывода
  • Пробелы и табуляторы
  • Командные аргументы
  • Опредение промежуточного документа
  • Команды промежуточного вывода
  • Команды для работы с графикой
  • Команды контроля устройств
  • Устаревшие команды
  • Промежуточный вывод
  • Совместимость вывода
  • Среды и окружения
  • Подавление вывода
  • Создание макросов
  • Режим копирования
  • Параметры макроса
  • Ловушки
  • Ловушки страницы
  • Ловушки внутри диверсий
  • Ловушки строки
  • Ловушка пустой строки
  • Ловушки специальных символов
  • Ловушка конца строки
  • Диверсии, перенаправления
  • Символы и шрифты
  • Настройки шрифтов
  • Семейство шрифтов
  • Позиции шрифта
  • Глифы и символы
  • Классы символов
  • Специальные шрифты
  • Модификации шрифтов
  • Лигатуры и кернинг
  • Размеры строк
  • Изменение размеров
  • Дробные размеры
  • Файлы настройки
  • Файл описания устройств DESC
  • Файл описания шрифта
  • Перемещение по странице
  • Геометрические фигуры
  • Настройки цвета