LINUX.ORG.RU

[groff] Как применить макросы de


0

0

Имеется файл в формате groff, внутри которого есть локально определённые с помощью директивы .de макросы. Можно ли как-нибудь применить эти макросы к документу, не изменяя в нём более ничего?

Макросы такие:

.de EX \" Begin Example . IP . ft CW . nf . ne \\$1 .. .de EE \" End Example . ft P . fi . PP ..

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

Зачем это нужно? Есть программа po4a, которая позволяет получать из оригинального man-файла файл po, который затем можно локализовать и получить переведённый man. Она понимает только те макросы, которые описаны в groff_man(7).


Лор съел разметку, поэтому повторяю макросы:

.de EX \" Begin Example
.  IP
.  ft CW
.  nf
.  ne \\$1
..
.de EE \" End Example
.  ft P
.  fi
.  PP
..
morbo ()

Что-то я сомневаюсь, что это можно сделать средствами groff. Может быть, какие-то сторонние существуют, чтобы раскрыть макросы по месту и выдать тот же *roff?

groff с опцией -Z может только некий промежуточный формат выводить перед передачей постпроцессору, но формат совершенно не groff'овский.

deroff тоже не то.

Zubok ★★★★★ ()

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

Я думаю, что нужен внешний препроцессор для этого дела. Например, тот же pic весь текст в groff, который к нему не относится, пропускает наружу без изменений, а то, что внутри макросов .PS и .PE, преобразует в groff. Поэтому всегда после препроцессора pic можно увидеть получившийся текст в формате groff.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Ясно, спасибо за ответ. Я тоже перерыл все доки, но так и не нашёл такой функции.

Видимо в случае необходимости придётся писать препроцессор самостоятельно или попытаться каким-то образом вырвать его из исходников groff.

morbo ()
Ответ на: комментарий от morbo

Думаю, что sed/awk/sh с простыми заменами макросов справятся. Надо только им где-то указывать, какие макросы раскрывать, а какие — нет.

Zubok ★★★★★ ()
Ответ на: комментарий от morbo

>Видимо в случае необходимости придётся писать препроцессор самостоятельно или попытаться каким-то образом вырвать его из исходников groff.

Вообще, в общем случае макросы могут быть довольно сложными. С ветвлениями и пр. фишками. В общем случае придется написать целый roff заново. Вообще, да. Проблемка такая встала и в Emacs. Там есть опциональный такой пакетик woman, который реализует рендеринг man самостоятельно без roff. И там вот та же самая проблема:

One problem arose with the significant number of man pages that use `roff' requests in addition to the `man' macros, and since releasing the first version of WoMan I have been continually extending it to support more `roff' requests. WoMan can now format a significant proportion of the man pages that I have tested, either well or at least readably.

То есть вот человек увидел кучу манов, которые выходили за рамки man macros.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

>То есть вот человек увидел кучу манов, которые выходили за рамки man macros.

Чаще встречаются просто ошибки, а не какие-то нестандартные макросы. Например, вместо макроса ".PP" могут написать ".pp" или не заэкранировать многоточие в начале строки, в результате чего это многоточие вопринимается как макрос.

Ещё бывают man'ы, полученные из файлов в формате pod с помощью утилиты pod2man. Их вообще человеку прочитать очень тяжело. Но там можно найти соответствующий скрипт на Perl, из которого получается pod, из которого уже получается man.

morbo ()
Ответ на: комментарий от morbo

>Чаще встречаются просто ошибки, а не какие-то нестандартные макросы. Например, вместо макроса ".PP" могут написать ".pp" или не заэкранировать многоточие в начале строки, в результате чего это многоточие вопринимается как макрос.

Хорошо, что напомнил. Надо будет перепроверить мой 'man s3' в Xorg на подобные ошибки. Запишу себе в TODO.

Zubok ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.