固定幅でマニュアルページを印刷する

固定幅でマニュアルページを印刷する

サンプルコマンドの使用

man apropos > outputfile

書式設定されたmanページを含むテキストファイルを作成しますaproposman apropos太字などの画面に直接印刷するのとは若干の違いがあります)。

しかし、生成された出力ファイルの最大行幅を手動で設定して、すべての段落がその幅に一致するようにしたいと思います。

manページは次のように生成されます。たとえば、元のソーステキストファイルの1つの段落を前に配置しようとしましたが、groff複数のページで作業する必要がある場合は、これは簡単ではありません。また、一部の文字は認識されません。.ll 50.gz manman

apropos.1:45: warning: can't find character with input code 195
apropos.1:45: warning: can't find character with input code 168
apropos.1:47: warning: can't find character with input code 178
apropos.1:131: warning: can't find character with input code 169

だから、もっと直接的な方法があるのだろうか。作成中に最大線幅を変更する方法はoutputfile?特別注文がありますか?


編集する:

(以下の注意事項はすべてUbuntu 18.04に関するものです。上記の質問の14.04を含む以前のバージョンではテストできません。)

1行の一時的なソリューションの場合、カスタムMANWIDTH値としてエクスポートされていない場合、2つの間に違いはありません。

$ MANWIDTH=60 man apropos > outputfile

そして

$ COLUMNS=60 man apropos > outputfile

MANWIDTHしかし、原則として、初めて使用する方が良いです。


編集2(質問と厳密には関係ありません):

代わりに、マニュアルページの印刷に永続的な幅設定を適用するには、次のものが必要です。出口変数の推定値です。そして:

$ export MANWIDTH=60
# zero or more additional lines
$ man apropos > outputfile

man apropos端末ウィンドウのサイズ変更方法に関係なく、同じ幅で印刷されます。代わりに、

$ export COLUMNS=60
# zero or more additional lines
$ man apropos > outputfile

ターミナルウィンドウのサイズがexportとの間で調整されていない場合にのみ、以前と同じ結果を提供しますman <page> > outputfile

答え1

MANWIDTH環境変数を使用してください。

MANWIDTH=60 man apropos > apropos.txt

man 2.7.4のマンページには次のように記載されています。

$ MANWIDTHが設定されている場合、その値はマニュアルページをフォーマットする必要がある行の長さとして使用されます。設定しないと、マニュアルページは現在の端末に適した行長にフォーマットされます(使用可能な場合は$ COLUMNS、ioctl(2)値を使用し、両方が使用できない場合は80文字に置き換えます)。

つまり、値をオーバーライドしますCOLUMNSioctlウィンドウサイズが変更されるたびにその値が動的に更新されるため、変更に依存したくありませんCOLUMNS(ここでは機能しますが)。

上書きを使用すると、シェルMANWIDTH起動ファイルに行を追加してCOLUMNS変更を永続的に適用することもできます。export MANWIDTH=60

答え2

COLUMNS環境変数を設定してみてください。 Debian 1.22.3では、バージョン2.7.0.2を使用できますmanmandbgroff

$ COLUMNS=60 man apropos | head
APROPOS(1)          Manual pager utils          APROPOS(1)



NAME
       apropos - search the manual page names and descrip‐
       tions

SYNOPSIS
       apropos [-dalv?V] [-e|-w|-r]  [-s  list]  [-m  sys‐

$ COLUMNS=70 man apropos | head
APROPOS(1)               Manual pager utils               APROPOS(1)



NAME
       apropos - search the manual page names and descriptions

SYNOPSIS
       apropos  [-dalv?V] [-e|-w|-r] [-s list] [-m system[,...]] [-M
       path] [-L locale] [-C file] keyword ...

Ubuntu 14.04バージョンの場合は、次のように書く必要があります。

COLUMNS=60 < /dev/null man apropos | head

ここでstdinが端末の場合、man環境変数は無視されているように見えます(その後、端末デバイスは端末の幅を照会します)。COLUMNS

次のことを試すこともできます。

s=$(stty -g); stty cols 60; man apropos | head; stty "$s"

zsh次のように短縮できます。

STTY='cols 60' man apropos | head

groff手動で呼び出すことでこれを行うことができます。

gzip -dcf "$(man -w apropos)" |
  groff -ekpstR -mtty-char -mandoc -Tutf8 -rLL=60n |
  col -bpx

オプションgroffは次のとおりです。


# Native groff Options

-e     eqn      (equations)
-k     preconv  (encoding for groff)
-p     pic      (pictures)
-s     soelim   (.so requests - source file)
-t     tbl      (format tables)
-R     refer    (bibliography)

# Transparent Options

-mtty-char
      Overrides  the  definition of standard  troff characters  and
      some groff characters for TTY devices. The optical appearance
      is  intentionally inferior  compared to  that  of normal  TTY 
      formatting to allow processing with critical  equipment.

-mandoc
      Use this file  in case you don't know  whether the man macros
      or the mdoc package should be used.    Multiple man pages (in 
      either format) can be handled.

-R     utf8     (output-encoding)


-r     LL=60n   (Number of LL registers)

あなたの入力コードに文字が見つかりませんを使用する-Tascii代わりにを使用してファイルを前処理しているため、エラーが発生します。-Tutf8-kpreconv

答え3

fmt私が知っている限り、すべてのLinuxディストリビューションに存在するこのコマンドを使用できます。

man apropos | fmt -w 70 

70文字で終わります。

答え4

あなたはそれを使用することができますfold

man cp | fold -w 20

20文字(!)ごとに縮小されます。唯一のオプションは「20文字ごとに折りたたみ」なので、単語は半分になります。

これを念頭に置いて、sed次のように使用できます(動的行長を使用)。

man cp | sed 's/.\{20\} /&\n/g'

ランダムな20文字の後に改行文字が追加され、その後にスペース(つまり新しい単語)が追加されます。したがって、行は20文字より長い場合があります。 (20文字の後にスペースが続くため、26文字の単語は26文字の行を生成します。)

sedコマンドから最後のスペースを省略します。

sed 's/\(.\{20\}\) /\1\n/g'

関連情報