Как использовать Troff для форматирования PDF-документов в Linux

Troff — это минималистичный, но мощный текстовый процессор для систем Linux. Он позволяет легко создавать документы, готовые к печати, компилируя исходные файлы из командной строки. В отличие от LaTeX, Troff невероятно легковесен и предустановлен на большинстве систем Linux. Этот учебник покажет вам, как использовать Troff для форматирования PDF-документов в Ubuntu.
Содержание
- Что такое Troff и почему его использовать
- Установка Troff
- Создание вашего первого документа Troff
- Понимание формата Troff
- Создание жирного, курсивного и подчеркиваемого текста
- Создание новых разделов документа
- Создание списков в Troff
- Создание таблиц с помощью препроцессоров в Troff
- Часто задаваемые вопросы
Что такое Troff и почему его использовать
В базовом смысле, Troff — это программа для обработки текста, которая преобразует скрипты, похожие на код, в печатные документы. В отличие от текстовых процессоров, Troff не полагается на парадигму “WYSIWYG”. Вместо этого он требует от вас использования определенных типов кода для обработки форматирования.

Одним из самых больших преимуществ этого подхода является простота. Базовая установка Troff будет содержать все, что вам нужно для создания документа. Более того, отсутствие графического интерфейса означает, что вы можете создать документ даже через SSH.

Совет: узнайте, как перенаправлять GUI-приложения через SSH в Linux.
Установка Troff
Troff часто предустановлен по умолчанию в большинстве дистрибутивов Linux. Вы можете проверить, установлен ли он в вашей системе, запустив его флаг -h. Это отобразит краткий список всех флагов, которые принимает ваша установка Troff.
troff -h
Существуют случаи, когда дистрибутивы не включают Troff по умолчанию. В этом случае вы можете установить его, найдя пакет “groff”.

Это переосмысленная версия программ Troff и Nroff от проекта GNU, которая включает в себя ряд новых и современных функций.
Вы можете установить groff в Ubuntu, используя следующую команду:
sudo apt install groff
Создание вашего первого документа Troff
Подобно исходному коду, каждый документ Troff является текстовым файлом, который содержит инструкции о том, как создать документ. Эти инструкции включают ширину страницы и полей, а также интервал между буквами и страницами.

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

Одним из самых распространенных макросов, которые вы будете использовать в Troff, является “ms”. Он создаст документ в стиле статьи. Вы можете создать документ ms, используя команду touch:
touch my-first-document.msПоскольку все документы Troff являются текстовыми, вы можете открыть ваш документ, используя текстовый редактор. В моем случае я использую vim. В качестве альтернативы вы можете использовать любой из этих текстовых редакторов для Linux.
vim my-first-document.ms
Понимание формата Troff
Все документы Troff следуют схожей структуре. Каждая команда форматирования, которую вы делаете, должна находиться на отдельной строке в содержимом, которое она пытается отформатировать. Таким образом, типичный документ Troff будет выглядеть примерно так:
.COMMAND1
This is a piece of content in a Troff document.
.COMMAND2
This is a different piece of content in a Troff document.Две из самых основных команд, которые вы будете использовать в ms, это .TL и .PP. Первая преобразует ваш текст в заголовок и центрирует его в вашем документе, в то время как вторая форматирует ваш текст в стиле, похожем на абзац.
Например, следующий фрагмент использует как команды .TL, так и .PP:
.TL
My First Troff Document
.PP
This is content that I want to look like a paragraph in my final document. It is not a very long content but it is my first Troff document and it is something that I am proud of. It is about three sentences long and it should wrap around the document properly.
Отсюда создайте ваш документ, передав ваш файл программе Troff.
groff -ms-Tpdf ./my-first-document.ms > output.pdf
Совет: если вы предпочитаете что-то более простое, узнайте, как писать в формате MLA в Google Docs.
Создание жирного, курсивного и подчеркиваемого текста
Так же, как и в обычном текстовом процессоре, большинство макросов Troff предоставляют ряд команд стиля для настройки вашего документа. Для ms это команды .B, .I, .UL и .BX.
- Команда
.Bизменяет текст на жирный. - Команда
.Iизменяет текст на курсив. .ULи.BX— это команды, которые подчеркивают и обводят текст соответственно.
Подобно командам выше, использование этих в вашем документе требует, чтобы вы отделяли каждый стиль на своей строке:
.TL
My First Troff Document
.PP
This is
.B
content
.R
that I want to look like a paragraph in my final document. [...]В этом примере я создал новую строку перед словом “content” и добавил команду .B, чтобы изменить его на жирный шрифт, затем создал новую строку и добавил команду .R. Это позволяет Troff вернуться к предыдущему стилю.

Важно отметить, что вы всегда должны добавлять команду .R, когда меняете стиль. Например, следующий фрагмент не завершит команду .I, поскольку Troff не увидел .R после нее:
.TL
My First Troff Document
.PP
This is
.I
content
that I want to look like a paragraph in my final document. [...]
Создание новых разделов документа
Подобно LaTeX, Troff также поддерживает разделы и определение иерархии, поэтому вам не нужно упорядочивать и сопоставлять уровень каждого заголовка при редактировании.
Чтобы создать новый раздел в вашем документе, используйте команду .NH, за которой следует название вашего заголовка.
.TL
My First Troff Document
.NH
My First Heading
.PP
This is content that I want to look like a paragraph in my final document.
По умолчанию каждый заголовок Troff имеет значение уровня, которое определяет, как программа структурирует и отображает его содержимое в конечном документе. Зная это, вы можете изменить это значение, чтобы настроить уровень для заголовка.
Например, следующий код создает заголовок уровня 2 сразу под его родителем:
.TL
My First Troff Document
.NH
My First Heading
.NH 2
My First Subheading
.PP
This is content that I want to look like a paragraph in my final document.
Помимо обычных пронумерованных заголовков, Troff также может создавать пустые заголовки, которые все равно будут следовать иерархии уровней документа.
Для этого замените .NH на команду .SH:
.TL
My First Troff Document
.SH
My First Heading
.SH 2
My First Subheading
.PP
This is content that I want to look like a paragraph in my final document.
Совет: узнайте, как изменить поля в Google Docs.
Создание списков в Troff
Простота Troff также позволяет вам подстраивать его поведение под ваши нужды. Например, списки не идут по умолчанию ни в Troff, ни в макросах ms. Несмотря на это, вы все равно можете создать список, комбинируя несколько команд ms.
Каждый список в Troff состоит из трех частей: отступ, маркер и содержимое. Чтобы создать отступ, используйте команды .RS и .RE. Эти команды переместят текущий уровень отступа любого текста внутри них на четыре пробела.
.RS
This is my first item.
.RE
Затем создайте маркер для вашего элемента списка, используя .IP. Это команда “отступ абзаца”, которая фиксирует левый край вашего текста на определенной ширине.
Команда .IP также позволяет вам установить пользовательскую точку маркера и пространство между ней и вашим текстом. В этом случае я устанавливаю свой маркер на “[1]” и даю ему четыре пробела.
.RS
.IP [1]4
This is my first item.
.RE
Теперь скопируйте и вставьте вашу команду .IP, чтобы создать дополнительные элементы списка.
.RS
.IP [1]4
This is my first item.
.IP [2]4
This is my second item.
.IP [3]4
This is my third item.
.RE
Наконец, автоматизируйте этот процесс, создав пользовательский макрос. Например, следующий фрагмент связывает мою команду .IP с .QW:
.de QW
.IP [-]4
..
.RS
.QW
This is my first item.
.QW
This is my second item.
.QW
This is my third item.
.RE
Создание таблиц с помощью препроцессоров в Troff
Одной из особенностей Troff является то, что большинство его функций существуют как “препроцессоры”. В основном это бинарные файлы вне программы, которые работают, создавая “скрипты контейнеров препроцессоров” и преобразуют их в низкоуровневый код Troff.

Tbl — отличный пример препроцессора Troff. Это программа, которая управляет таблицами в документе. Базовый контейнер Tbl выглядит примерно так:
.TS
allbox ;
c c c.
item1 item2 item3
item4 item5 item6
.TE - Команды
.TSи.TEговорят Tbl, что это среда, которую он может читать. - Вторая строка говорит программе, как форматировать эту таблицу.
- Третья строка — это поля, разделенные пробелами, которые определяют количество столбцов и их выравнивание в вашей таблице.
- Четвертая и пятая строки — это поля, разделенные табуляцией, которые содержат содержимое вашей таблицы.

Компиляция документа с Tbl немного отличается от обычного файла Troff. Сначала загрузите ваш файл:
tbl my-first-document.ms > preprocessed.msЗатем передайте вывод программы в Troff:
groff -ms-Tpdf ./preprocessed.ms > output.pdfНаконец, автоматизируйте этот процесс, используя каналы UNIX:
tbl my-first-document.ms | groff -ms-Tpdf> output.pdf
Полезно знать: узнайте больше о каналах UNIX и перенаправлении файлов с помощью sed.
Часто задаваемые вопросы
Можно ли использовать Troff в Windows?
По умолчанию ни Troff, ни Groff официально не портированы на Windows. Тем не менее, вы все равно можете использовать Groff вместе с другими утилитами GNU, установив Подсистему Windows для Linux.
Есть ли у Troff функция отслеживания библиографии?
Да. Refer — это простой препроцессор, который использует внешний файл библиографии для автоматического отслеживания ссылок в документе Troff. Вы можете узнать больше о том, как это работает, посетив его страницу руководства, запустив man refer.
Как я могу исправить ошибку “missing DESC” при компиляции Troff?
Эта проблема, скорее всего, связана с отсутствующей зависимостью в вашей системе или несовпадающим файлом версии. Чтобы исправить это, установите правильный пакет groff из репозитория вашего дистрибутива.
Изображение предоставлено: Simon Hattinga Verscheure через Unsplash. Все изменения и скриншоты сделаны Ramces Red.