lptest(1) を使った簡単なテストをおこなった結果、 正しい出 力を得られずに、以下に示すような出力が得られるかもしれません。
プリンタは上で示されたような印字を おこなったのですが、しばらくして止まってしまい、 動かなくなってしまいました。 印字された結果をプリンタから取り出すためには、 プリンタにある PRINT REMAINING ボタン、または、FORM FEED ボタンを押す必要があるようです。
この場合は、 おそらくジョブはプリントをする前に 更にデータが送られてこないか待ち続けているのでしょう。 この問題を解決するためには、プリンタに FORM FEED 文字 (あるいは特定の必要な文字コード) を 送るテキストフィルタを使ってください。 プリンタ内部に残ったデータをプリンタにすぐに印字させるには、 普通はこれで十分です。 次のジョブが前のジョブの最終ページの中央の どこかから印字を開始させないためにも、 紙の途中で印字のジョブが終了したかどうかを確認するのは有益です。
シェルスクリプト
/usr/local/libexec/if-simple
を次のように変更して、プリンタへジョブを送信した後に
FORM FEED 文字を印字させるようにします。
#!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. # Writes a form feed character (\f) after printing job. /bin/cat && printf "\f" && exit 0 exit 2
出力された紙には次のように印字されていました。
!"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456
あなたは「階段効果」 の新たなる犠牲者になってしまいました。この原因は、 改行を表わすべき文字がなんであるか の解釈が混乱していることにあります。UNIX® スタイルのオペレーティングシステムでは、改行文字は ASCII コード 10 の line feed (LF) の 1 文字が使われています。MS-DOS® や OS/2® などは ASCII コード 10の LF と、ASCII コード 13 の文字 (carriage return または CR) をペアで使います (訳注: Macintosh では CR のみで表現されています)。大抵のプリンタでは、 改行を表わすために MS-DOS® の慣習にしたがいます。
FreeBSD で印字する場合、印字したテキストは LF 文字だけ が使われていました。プリンタでは LF 文字を見つけると、紙を 1 行分送り出しました。しかし、 次の文字を印字するた めの紙の水平方向の位置は維持されました。すなわち、CR 文字が意味することは、 次の文字を印字する位置を紙の左端に動かすことです。
FreeBSD がプリンタに動作をして欲しいと思っている動作を以下に示します。
プリンタが CR を受け取ったとき | CR 動作 (復帰) をおこなう |
プリンタが LF を受け取ったとき | CR + LF 動作 (復帰、改行) をおこなう |
このように動作させるための方法がいくつかあります。
これらの文字の解釈を変えるために、 プリンタの設定スイッチかコントロールパネルを操作する方法。 どのようにして設定をするかはプリンタのマニュアルを参照してください。
FreeBSD 以外のオペレーティングシステムを切り替えて使う場合、 CR と LF 文字の解釈をそのオペレーティングシステムで使われているようにプリンタを 再設定する必要があるかもしれません。 以下に示す解決方法のいずれかを 選ぶのがよいかもしれませんね。
自動的に LF を CR+LF に変換してくれる
FreeBSD 用のシリアルドライバを入手する方法。
もちろん、このドライバはプリンタ専用に接続される
シリアルポート
のみで動作します。
この機能を許可するためには、
ms#
項目を使い、
対象プリンタの /etc/printcap
ファイルでonlcr
モードを設定します。
LF 文字の扱いを一時的に変更するための エスケープコード をプリンタに送る方法。 プリンタがサポートしているかもしれないエスケープコード については、 プリンタのマニュアルを参照してください。 適切なエスケープコードが見つかったら、 最初にそのコードを送り、次にプリントジョブを送信 するようにテキストフィルタを変更してください。
次に、Hewlett Packard 社の PCL エスケープコードに対応しているプリンタのための テキストフィルタの例を示します。 このフィルタでは、プリンタ に LF 文字を LF と CR の2文字として扱わせます。 その後に、プリンタにジョブを送ります。最後に、 ジョブの最終ページの紙を排出するため、FROM FEED 文字を送ります。このフィルタは Hewlett Packard 社のほとんどすべてのプリンタで機能するはずです。
#!/bin/sh # # hpif - Simple text input filter for lpd for HP-PCL based printers # Installed in /usr/local/libexec/hpif # # Simply copies stdin to stdout. Ignores all filter arguments. # Tells printer to treat LF as CR+LF. Ejects the page when done. printf "\033&k2G" && cat && printf "\f" && exit 0 exit 2
ホスト orchid
の
/etc/printcap
の例を以下に示します。ここには、
一番目のパラレルポートにプリンタ
(Hewlett Packard LaserJet 3Si)
が一台接続されており、そのプリンタ名は
teak
です。
# # /etc/printcap for host orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=/dev/lpt0
:sh:sd=/var/spool/lpd/teak
:mx#0:\ :if=/usr/local/libexec/hpif
:
LF を CR+LF に置き換える cat コマンドを作る方法も当然考えられます。 そして、このコマンドと、if-simple の cat の部分を置き換えればよいわけです。 具体的にどのようにするかは、 読者への練習問題としましょう。
プリンタは紙送りをまったくしませんでした。 テキストすべての行がある行の上で重ねて印字されてしまいました。
この問題は、 階段現象とは 「正反対」 な問題で、 ほとんどまれにしか起こりません。FreeBSD では行末として扱われる LF 文字が、紙の左端に印字位置を復帰しますが、 紙送りはしない CR 文字として扱われています。
プリンタの設定スイッチかコントロールパネルを使って、 LF と CR の文字を次のような解釈をするようにしてください。
プリンタが受け取ったとき | プリンタがおこなう |
---|---|
CR | CR 動作 (復帰) |
LF | CR + LF (復帰、改行) |
LF を CR+LF
に置き換える cat コマンドを作る方法も当然考えられます。
そして、このコマンドと、
if-simple
の cat
の部分を置き換えればよいわけです。
具体的にどのようにするかは、
読者への練習問題としましょう。
印字しているのですが、 各行の 2 〜 3 文字が印字されません。 プリンタを動かせば動かすほど、 もっとたくさんの文字が紛失されていき、 この問題は更に悪くなっていくかもしれませんでした。
この問題は、 シリアルポートを通してコンピュータから送られてくるデータの速度に、 プリンタがついていけないことに起因します (この問題は、パラレルポートに接続された プリンタでは発生することはありません)。 この問題を克服する方法が2つあります。
プリンタが XON/XOFF のフロー制御をサポート
している場合は、項目 ms#
で
ixon
モードをセットして、FreeBSD
にこの機能を使用させてください。
プリンタが Request to Send / Clear to Send
ハードウェアハンドシェイク
(通称 RTS/CTS
) をサポートして
いる場合は、項目 ms#
で
crtscts
モードをセットして下さい。それから、
プリンタとコンピュータを接続しているシリアルケーブルが
ハードウェアフロー制御用に正しく配線されたものかどうかを確認してください。
プリンタはランダムなゴミのように 見えるものを印字しましたが、 意図したテキストは印字してくれませんでした。
この問題は、通常、
シリアルポートに接続したプリンタでの
通信パラメータの誤りからくる前項とは別の症状です。
br
項目の通信速度と
ms#
項目を再確認してください。
また、プリンタでの設定が
/etc/printcap
ファイルで設定した
内容と一致しているかどうかも確認してください。
simple-if のような単純なフィルタだけの状態で、 日本語を含むテキストを印字しようとした場合にも、 シリアルポート、パラレルポートの使用に関係なく、 このような症状は見られます。日本語プリンタの場合、 漢字コードそのもの を送信しただけでその漢字を印字してくれるものは、 少なくとも訳者は見たことがありません。 漢字を印字するための制御 コードを別途送信するフィルタが必要となります。 また、そのようなフィルタを使用していても、 そのフィルタが想定してる漢字コードと異なった文書を プリントしようとしたときもこのような症状は出ます。 もちろん、これはプリンタ用の 言語を持たないプリンタの話で、PostScript® プリンタ などにプレインテキストを送信しても、日本語対応、 非対応に関らず、意味不明な文字列が印字される (もしくは、何も印字されない) ことでしょう。
もしプリンタが何の動作もしないのであれば、
ハード的な問題ではなく、多分 FreeBSD
の中に問題があります。
/etc/printcap
ファイルで、
デバッグしているプリンタのエントリに
(lf
項目で) ログファイルを取るように
設定を追加してください。たとえば、プリンタ
rattan
用のエントリの項目
lf
は次のようになります。
rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan
:\ :lp=/dev/lpt0
:\ :if=/usr/local/libexec/if-simple
:\ :lf=/var/log/rattan.log
次に、もう一度印字をおこなってみます。そして、
発生したと思われるエラーメッセージを見るためにログファイル
(上記の例では、
/var/log/rattan.log
)
を調べます。そこで見られたメッセージを元に、
問題を解決してみてください。
項目 lf
が指定されていない場合、LPD
はデフォルトのログファイルとして
/dev/console
を使います。
本文書、および他の文書は https://download.freebsd.org/ftp/doc/ からダウンロードできます。
FreeBSD に関する質問がある場合には、
ドキュメント を読んだ上で
<questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、
<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。