groff -mandoc 创建“ESC[1m”与使用退格键重打粗体文本

groff -mandoc 创建“ESC[1m”与使用退格键重打粗体文本

我发现 groff 使用不同的方式来指示utf8输出格式的粗体文本。

在 FreeBSD 14 上,groff 为终端发出转义码 (ESC, [1m):

$ printf ".Dd today\n.Sh NAME\n" | groff -mandoc -Tutf8 | od -c
0000000   \n 033   [   1   m   N   A   M   E 033   [   0   m  \n
[...]

在 Linux (debian Bookworm) 上使用退格键和加粗键:

$ printf ".Dd today\n.Sh NAME\n" | groff -mandoc -Tutf8 | od -c
[...]
0000120   N  \b   N   A  \b   A   M  \b   M   E  \b   E  \n

为什么会这样?有没有办法让 Linux groff 也对终端使用 ESC 代码?我已从上到下阅读了 groff 手册页,但找不到更改此行为的选项。

(我需要对结果进行后处理,ESC 代码使这变得更加容易和灵活。)

编辑:解决方案(感谢 @egmont)是阅读 Debian 的 grotty(1) 手册,然后使用以下命令强制 SGR 行为

printf ".Dd today\n.Sh NAME\n" | GROFF_SGR=y groff -mandoc -Tutf8

答案1

Debian Bookworm 将 groff 1.22 配置为您在此处看到的旧退格覆盖行为,并将其记录在其修补的grotty手册页中以及如何恢复到较新的 SGR(\e[1m类似)行为:

printf ".Dd today\n.Sh NAME\n" | GROFF_SGR=y groff -mandoc -Tutf8

似乎给定的配置和补丁不再存在于 的 groff 1.23 包中unstable,以及 Ubuntu 23.04 中。所以这可能是您看到的具有这种旧行为的最后一个 Debian 版本,他们正在切换到新的 SGR 方法,遵循上游 groff 的默认设置。

答案2

您可以滥用scriptless来转换退格序列:

script --return --quiet -c "printf '.Dd today\n.Sh NAME\n' | groff -mandoc -Tutf8 | less" /dev/null | od -c

0000200   1   m   N   A   M   E 033   [   0   m 033   [   m  \r  \n

相关内容