groff -mandocは「ESC [1m」を生成し、バックスペースを使用して太字のテキストを再入力します。

groff -mandocは「ESC [1m」を生成し、バックスペースを使用して太字のテキストを再入力します。

utf8私はgroffが出力形式の太字のテキストを表示するために別の方法を使用していることを発見しました。

FreeBSD 14では、groffは[1m端末のエスケープコード(ESC、)をエクスポートします。

$ 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をここに示されている以前のバックスペースオーバーライド動作として設定し、それを最新のSGR(同様の)動作grottyに戻す方法とともに、パッチ付きのマニュアルページに文書化します。\e[1m

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

unstable与えられた設定とパッチは、groff 1.23パッケージとUbuntu 23.04にはもう存在しないようです。したがって、これはおそらく前の動作を見ることができる最後のDebianバージョンです。彼らは、上流の groff のデフォルト値に沿って新しい SGR メソッドに切り替えています。

答え2

バックスペースシーケンスを乱用scriptまたはless変換する可能性があります。

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

関連情報