本節ではFreeBSDのLPDスプーリングシステムで印字をおこなうために 必要となるソフトウェアの設定について説明しています.
本節の概要は次のようになります.
/etc/printcap
を変更し, LPDの設定を
おこないます. 「
/etc/printcap ファイル」で, どのように変更するかを
説明しています. オペレーティングシステムのカーネルのコンパイルをおこなうこと によって, 指定されたのデバイスが機能するようになります. シリ アル, または, パラレルインタフェースをプリンタで使用する場合, 必要なデバイスがこの指定の中に含まれていなくてはなりません. したがって, 必要なデバイスがカーネルに組み込まれていない場合, 追 加のシリアル, または, パラレルポートをサポートするために, カー ネルの再コンパイルが必要となるかもしれません.
シリアルポートが現在使用しているカーネルでサポートされている かどうかを調べるためには, 次のように入力します.
dmesg | grep sio
N
ここで, N はシリアルポートの番号を示し, この番号は0から 始まります. 次のような出力があった場合, カーネルはそのポー トをサポートしています.
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A
パラレルポートが現在使用しているカーネルでサポートされている かどうかを調べるためには, 次のように入力します.
dmesg | grep lpt
N
ここで, N はパラレルポートの番号を示し, この番号は0から 始まります. 次のような出力があった場合, カーネルはそのポー トをサポートしています.
lpt0 at 0x378-0x37f on isa
上記の出力が得られない場合, プリンタを使うため, オペレーティ ングシステムにパラレル, または, シリアルポートを認識し, 使用 できるようにするためにはカーネルを変更する必要があります.
シリアルポートをサポートさせるには, 「 FreeBSDカーネルのコンフィグレーション」の節をご覧く ださい. パラレルポートをサポートさせる場合も, その節と, あ わせて, この節に続く節もご覧ください.
/dev
に追加する
カーネルがシリアル, または, パラレルポートを通じての通
信をサポートしていたとしても, システム上で動いているプログ
ラムがデータの送受信をおこなうためのソフトウェアインタフェース
がさらに必要になります. そのインタフェースは,
/dev
ディレクトリにあるエントリに相当します.
/dev
エントリにポートを加えるために
su
コマンドで root になります. suコマンド
でパスワードを聞かれたら, ルート用のパスワードを入力し
ます.
/dev
ディレクトリに移動します.
cd /dev
./MAKEDEV
port
ここで, port は, 作成するポート名です. 1番目
のパラレルポートのときは lpt0
に, 2番目のときは
lpt1
になり, 以降同様になります. 1番目のシリア
ルポートのときは, ttyd0
に, 2番目のときは
ttyd1
になり, これも以降同様となります.
ls -l
port
パラレルインタフェースを使用している場合, FreeBSDでは, 割り込み駆動型にするか, プリンタとの通信の状況をカーネルに監 視させるかのいずれかを選択できます.
割り込み駆動方式は, いくらか高速になりますが, 貴重な IRQ ラインを一つ消費します. うまく機能するものをお使いください.
通信モードを設定するためには2つの方法があります. 1つはカー
ネルを変更することで, もう一つは lptcontrol
プログ
ラムを使用する方法です.
カーネルを設定することによって, 通信モードを変更す る.
lpt0
のエントリを探すか追加してください. 2番目
のパラレルポートを設定するときは, 代わりに lpt1
を使います. 以下, 3番目のポートは lpt2
となってい
きます.
irq
指
定を追加します.
device lpt0 at isa? port? tty irq N vector lptintr
ここで, N はパラレルポート用の IRQ 番号で
す.
irq
を追加
してはいけません.
device lpt0 at isa? port? tty vector lptintr
lptcontrol
で通信モードを設定する場合
lptN
をイベント駆動方式に設定する場合は,
次のように入力します.
lptcontrol -i -u N
lptN
を監視方式に設定する場合は, 次のよう
に入力します.
lptcontrol -p -u N
/etc/rc.local
ファイルに追加
しておくと, システムをブートする度に通信モードを設定する
ことができます. 詳細については, lptcontrol(8) をご覧くだ
さい.
スプーリングシステムの設定に進む前に, オペレーティング システムがプリンタにデータを送ることに成功しているかどうか を確かめるべきでしょう. これにより, 印字がうまくいかないと き, プリンタとの通信が問題なのか, スプーリングシステムが問 題なのかを分けて調べることがかなり容易になります.
プリンタをテストするためには, プリンタに何かのテキストを送
信してみます. 送信した文字をすぐに印字してくれるプリンタに
は, lptest
コマンドを使うと有用です. このコマンドは印
字可能な96文字のASCII文字すべてを96行生成します.
PostScript (または他の言語に対応した) プリンタの場合 は, もっと巧妙なテストが必要になります. 次のような, 簡単な PostScript プログラムを使えば十分でしょう. <hr>
%!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Is this thing working?) show showpage<hr>
注意: このドキュメントでプリンタ用言語を参照するとき は, PostScript のような言語を仮定しており, Hewlett Packard の PCL は考慮していません. PCL は非常に機能的なの ですが, プレインテキストにエスケープシーケンスを混ぜること ができます. PostScript ではプレインテキストを直接印字 することはできません. このような種類のプリンタ言語に対して は, 特別な対応をおこなわなければなりません.
この節では, FreeBSDがパラレルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について説明し ています.
パラレルポートのプリンタをテストするために
su
コマンドで root になります. lptest
コマンドを使います. 次のように入
力してください.
lptest > /dev/lptN
ここで, N はパラレルポートの番号で, 番号は
0から始まります.
cat > /dev/lptN
そして, 一行一行, プログラムを慎重に入力して
下さい. RETUREN または ENTER キーを入力してしま
うと, その行は編集できなくなります. プログラムの
入力が終わったら, CONTROL+Dか, あなたが設定して
いるファイル終了のキーを押してください.
もしくは, プログラムを入力したファイルがある 場合は, 次のように入力してください.
cat file > /dev/lptN
ここで, file はプログラムが格納されていて,
プリンタに送信するファイルの名前です.
これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します.
この節では, FreeBSDがシリアルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について述べられ ています.
シリアルポートのプリンタをテストするために
su
コマンドで root になります. /etc/remote
ファイルを編集します. 次の
エントリを加えてください.
printer:dv=/dev/port:br#bps-rate:pa=parity
ここで, port シリアルポート (ttyd0
,
ttyd1
など) のデバイスエントリで, bps-rateは
プリンタとの通信の転送速度[bit/秒], parityはプリ
ンタとの通信で必要とされるパリティ (even
,
odd
, none
, zero
のいずれか) を表わしていま
す.
次の例は, プリンタをシリアルケーブルでパリティなし, 転送速度19200bpsで第3番目のシリアルポートに接続した場 合です.
<hr>
printer:dv=/dev/ttyd2:br#19200:pa=none<hr>
tip
コマンドでプリンタと接続します. 次のよ
うに入力してください.
tip printer
これがうまくいかなかった場合は, /etc/remote
を
編集して, /dev/ttydN
の代わりに
/dev/cuaaN
を試してみてください.
lptest
コマンドを使います. 次のように入
力してください.
~$lptest
もしくは, プログラムを入力したファイルがある 場合は, 次のように入力してください.
~>file
ここで, file はプログラムが格納されている
ファイル名です. tip
コマンドでファイルを送
信した後は, ファイル終了を表わすキーを入力する必要
があります.
これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します.
/etc/printcap
ファイル
ここまでで, プリンタはコンピュータに接続され, (必要なら) プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ リンタに送信することができているはずです. これで, LPDにプリ ンタへのアクセスを制御させる設定をおこなう準備が整いました.
LPDの設定は /etc/printcap
を編集することでおこないます.
LPDスプーリングシステムはスプーラが使われる毎にこのファイル
を参照します. そのため, ファイルを更新するとすぐにその変更が
反映されます.
printcap
ファイルの書式は簡単です.
/etc/printcap
の編集はお好みのテキストエディタをお
使いください. このファイルの書式は,
/usr/share/misc/termcap
や /etc/remote
といった他のケイパビリティファイルと一致しています. この書式
のついての詳細な情報については cgetent(3) をご覧ください.
スプーラの単純な設定法は, 次のステップでおこないます.
/etc/printcap
ファイルに記述します. これについ
ては, 「
プリンタに名前を付ける」 を参照してください.
sh
の項目を追加することで, ヘッダページの出
力を禁止します (デフォルトは許可). これについては, 「
ヘッダページの印字 を禁止する」 を参照してください.
sd
項目で指定します. これについては, 「
スプーリングディレクトリ の作成」 を参照してください.
/dev
エントリを
設定し, /etc/printcap
の lp
項目でそのエ
ントリを指定します. これについては, 「
プリンタデバイスの特定」 を参照してください.
プリンタをシリアルポートに接続した場合は, fs
,
fc
, xs
, xc
の項目を設定する必要があります.
こちらについては, 「
スプーラのための通信パラメータの設定」
を参照してください.
lpr
コマンドで何かを印字することで設定のテス
トをおこないます.
印字して みよう と
トラブルシューティング を参照してください. 注意: PostScript プリンタのような, プリンタ言語を 使用しているプリンタには, プレインテキストを直接印字させる ことができません. 上にアウトラインを示し, 以下の節で説明す る簡単な設定方法の説明では, そのようなプリンタを設置してい る場合は, プリンタが認識できるファイルだけを印字の対象とし ているという仮定をしています.
多くの場合, 利用者はシステムに設置されているプリンタすべてでプ レインテキストが印字できることを期待しています. 印字作業を おこなうためにLPDのインタフェースを利用するプログラムでも, 通 常, そのような仮定を置きます. プリンタ言語を使用するプリン タを設置しており, そのプリンタ言語で記述されたジョブと, これに加えて, プレインテキストのジョブも印字できるよ うにしたいならば, 上で示した簡単な設定方法に加えて, さら なる設定をおこなうことを強くお勧めします. すなわち, 原始的なプ レインテキストから PostScript (もしくは, 他のプリンタ 言語) に変換するプログラムをインストールしてください. 「 プレインテキス トのジョブを PostScript プリンタで印字する」で, そ れをどのようにおこなえばよいのかが説明されています.
訳注: 日本語を印字したい場合は, プリンタ言語を使用し ていない「日本語プリンタ」についても, プリンタ固有のエスケー プシーケンスを送る必要があります. また, 漢字コードをプリン タが設定しているものに変換したりする必要があり, 各プリンタ 毎に, 日本語用のフィルタが必要になります.
最初の (簡単な) ステップで, プリンタの名前を考えます. プ リンタには別名をいくつか付けることもできるので, 機能的な名前 でも風変わりな名前でもどちらを選んでもまったく問題はありません.
少なくとも1つのプリンタには, /etc/printcap
の中
で, lp
という別名を持たせるべきでしょう. この名前は
デフォルトのプリンタ名になっています. ユーザが環境変数 PRINTER
を設定しておらず, かつ, LPDコマンドのコマンドラインでプリ
ンタの名前が指定されていない場合, lp
がデフォルトのプリ
ンタ名となり, そのプリンタに出力されます.
それから, これは共通の慣習ですが, プリンタの最後の別名には, メーカーやモデル名を含むプリンタの完全な名称をつけることに なっています.
名前と別名のいくつかを決めたら, /etc/printcap
ファ
イルに設定します. プリンタ名は一番左のカラムから書き始めま
す. 別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに
コロンを置きます.
次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと
Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義
されている /etc/printcap
のスケルトンを記しています.
<hr>
# # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:<hr>
この例では, 最初のプリンタに rattan
という名前と別名
として, line
, diablo
, lp
そして
Diablo 630 Line Printer
が付けられています. 別名とし
て lp
があるので, このプリンタはデフォルトのプリンタとなっ
ています. 2番目は bamboo
と名付けられ, 別名として,
ps
と PS
, S
, panasonic
,
Panasonic KX-P4455 PostScript v51.4
が付けられていま
す.
LPDスプーリングシステムでは, デフォルトでジョブ毎にヘッ ダページを印字します. ヘッダページにはジョブを要求したユー ザ名, ジョブが送られたホスト名, そして, ジョブの名前が素晴 らしい大きな文字で印字されています. 残念なことに, この余分 なテキストすべてが, 簡単なプリンタ設定法のデバッグの際に紛れ 込んできてしまいます. このため, ヘッダページの出力を禁止し ておきます.
ヘッダページの出力を禁止するには, /etc/printcap
にあるプリンタのエントリに sh
の項目を追加します. 次
に, sh
を加えた /etc/printcap
の例を示しま
す.
<hr>
# # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:<hr>
この書式を正しく使うための注意をしておきます. 最初の行は左 端のカラムから始まります. それに続く行は TAB ひとつ分だけ 字下げします. 最後の行以外のすべての行は, 行末にバックスラッ シュを記述します.
スプーラの簡単な設定の次のステップでは, スプーリン グディレクトリを作成します. プリンタに送られるジョブ は, その印字が終了するまでこのディレクトリに置かれます. また, 他のたくさんのスプーラもこのディレクトリにファイ ルを置きます.
様々な事情によりスプーリングディレクトリは, 通常, 慣例
として /var/spool
の下に置きます.
また, スプーリングディレクトリの内容はバックアップをす
る必要はありません. mkdir
によってディレクトリを
作るだけでスプーリングディレクトリの復旧は完了します.
スプーリングディレクトリの名前は, これも慣例ですが, 次 のようにプリンタの名前と同じにします.
mkdir /var/spool/printer-name
しかしながら, ネットワーク上に使用可能なプリンタがたく
さんあるならば, LPDで印字するための専用のディレクトリに
スプーリングディレクトリを置きたいと思うかもしれません.
例に出てきたプリンタ rattan
と bamboo
につい
て, この方式を採用すると, 次のようになります.
mkdir /var/spool/lpd
mkdir /var/spool/lpd/rattan
mkdir /var/spool/lpd/bamboo
注意: 各ユーザが印字するジョブのプライバシを守りた いと考えているならば, スプーリングディレクトリを保護し て, これを誰からでもアクセスできないようにしたいと思う かもしれません. スプーリングディレクトリは, deamon ユー ザと daemon グループに所有され, 読み込み, 書き込み, 検 索可能であり, 他からはアクセスできないようにするべきで す. 例題のプリンタに対して, 次のようにすることにしましょ う.
chown daemon.daemon /var/spool/lpd/rattan
chown daemon.daemon /var/spool/lpd/bamboo
chmod 770 /var/spool/lpd/rattan
chmod 770 /var/spool/lpd/bamboo
最後に, /etc/printcap
ファイルで, これらのディ
レクトリの位置を LPD に伝える必要があります. スプーリ
ングディレクトリのパス名は sd
項目で指定します.
<hr>
# # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:<hr>
プリンタ名が最初のカラムから始まっており, そのプリンタ に関して記述される他のエントリは TAB で字下げされてい ること, 各行がバックスラッシュで終わっていることに注意 してください.
sd
によりスプーリングディレクトリが指定されていな
い場合, スプーリングシステムは /var/spool/lpd
デフォルト値として使用します.
「
ポート用エントリ を<tt>/dev</tt> に追加する」では, FreeBSD でプリン
タとの通信に使用される /dev
ディレクトリ内の
エントリを特定します. そして, LPD にその情報を伝えま
す. 印字するジョブを受け取ると, スプーリングシステムは,
(プリンタにデータを渡す義務がある) フィルタプログラムに
代わって指定されたデバイスをオープンします.
/etc/printcap
ファイルで lp
項目を使って
/dev
エントリを記入します.
ここでの例では, rattan
は1番目のシリアルポートに,
bamboo
は6番目のシリアルポートに接続されているこ
とにしましょう. このとき, /etc/printcap
には
次のようになります.
<hr>
# # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:<hr>
/etc/printcap
でプリンタの lp
項目が指定
されていない場合は, LPD はデフォルトとして
/dev/lp
を使用します. /dev/lp
は,
現在の FreeBSD には存在していません.
設置したプリンタがパラレルポートに接続されている場合は, 「 テキストフィルタのインストール」まで読み飛ばしてください. そうでない場合は, 次節の説明に続いてください.
シリアルポートにプリンタを接続した場合, プリンタにデー タを送信するフィルタプログラムに代わり, 通信速度やパリ ティ, その他のシリアル通信パラメータを設定することがで きます. このことによる利点は,
/etc/printcap
を編集するだけで, 様々な
通信パラメータを試してみることができます. フィルタプロ
グラムを再コンパイル必要はありません.
次の /etc/printcap
の項目で, lp
で指定
されたデバイスのシリアル通信パラメータを制御できます.
br#bps-rate
デバイスの通信速度を bps-rate に設定します. ここ で, bps-rate は 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400[bit/秒] のいずれかです.
fc#clear-bits
デバイスをオープンした後で, sgttyb
構造体の
clear-bits フラグビットをクリアします.
fs#set-bits
sgttyb
構造体の clear-bits フラグビットをセッ
トします.
xc#clear-bits
デバイスをオープンした後で, ローカルモードビット clear-bits をクリアします.
xs#set-bits
ローカルモードビット set-bits をセットします.
fc
, fs
, xc
, そして xs
のビットに関
する詳しい情報については,
/usr/include/sys/ioctl_compat.h
を参照してく
ださい.
項目 lp
で指定されたデバイスを LPD がオープンする
とき, LPD は sgttyb
構造体のフラグビットを読み出
します. そして, 項目 fc
の全ビットをクリアします.
次に, 項目 fs
のビットをセットし, その結果を設定
します. ローカルモードビットに関しても同様におこなわれます.
例題のプリンタで6番目のシリアルポートに接続されたプリ ンタの設定を追加してみましょう. 通信速度は38400bpsに設 定します. フラグビットとして, TANDEM, ANYP, LITOUT, FLUSHO, PASS8 をセットします. ローカルモードビットでは, LITOUT と PASS8 フラグをセットします.
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
:sh:sd=/var/spool/lpd/bamboo:\
:lp=/dev/ttyd5:fs#0x82000c1:xs#0x820:
ここまでで, プリンタにジョブを送るために使うテキストフィ
ルタを LPD に設定する準備が整いました. テキストフィ
ルタとは, 入力フィルタとしても知られていますが,
印字するジョブがあるときに LPD が起動するプログラムで
す. LPD がプリンタのためにテキストフィルタを起動する
とき, LPD はフィルタの標準入力からプリントするジョブ
を入力し, フィルタの標準出力に項目 lp
で指定され
たプリンタデバイスを接続します. フィルタは, 標準入力か
らジョブを読み込み, プリンタのための必要な変換をおこなった
後, その結果を標準出力に出力する, これにより印字がなさ
れることを期待されています. テキストフィルタについての
更に詳しい情報については, 「
フィルタはどのよ うに機能しているか」をご覧ください.
ここでの簡単なプリンタ設定では, プリンタにジョブを送るため,
/bin/cat
を実行するだけの簡単なシェルスクリプ
トで間に合います. FreeBSD に標準で付属している
lpf
というフィルタでは, バックスペース文字を使っ
た下線引きの動作をおこなう文字ストリームをうまく扱うことが
できないプリンタのための代替処理をおこなってくれます. もちろん,
他のどんなフィルタプログラムを使っても構いません.
フィルタ lpf
については, 「
テキストフィルタ lpf」で詳しく説明します.
最初に, 簡単なテキストフィルタであるシェルスクリプト
/usr/local/libexec/if-simple
を作ってみましょ
う. 次のテキストをお好みのテキストエディタでファイルに
書き込んでください.
<hr>
#!/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. /bin/cat && exit 0 exit 2<hr> そして, このファイルを実行可能にします.
chmod 555 /usr/local/libexec/if-simple
LPD にこのテキストフィルタを使うことを設定するためには,
/etc/printcap
に if
項目を使って指定しま
す. これまでの /etc/printcap
の例のプリンタ
2台に, このフィルタを加えてみましょう.
<hr>
# # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\ :if=/usr/local/libexec/if-simple: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=/var/spool/lpd/bamboo:\ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\ :if=/usr/local/libexec/if-simple:<hr>
簡単な LPD 設定も終わりにたどり着きました. 残念ながら,
設定はこれでおしまいというわけではありません. なぜなら,
さらに, 設定をテストし, すべての問題点を解決しなくては
ならないからです. 設定をテストするために, 何かを印字し
てみましょう. LPD システムで印字をするためには,
lpr
コマンドを使います. このコマンドは, 印字する
ためのジョブを投入する働きをします.
lpr
コマンドを 「
プリンタとの通信状況を調べる」で紹介した,
あるテスト用のテキストを生成してくれる lptest
プログラムと一緒に使うこともできます.
簡単な LPD 設定をテストするために:
次のように入力してください.
lptest 20 5 | lpr -Pprinter-name
ここで, printer-name は /etc/printcap
で指定したプリンタ名 (もしくはその別名) です. デフォルト
のプリンタを使用する場合は, -P
引数を付けないで
lpr
を打ち込んでください. もう一度述べますが, ポス
トスクリプトを期待しているプリンタをテストするならば,
lptest
を使う代わりに PostScript で書かれたプ
ログラムをプリンタに送ってください. プログラムを送るた
めには, プログラムをファイルに格納して, lpr
file
と打ち込みます.
PostScript プリンタの場合, 送信したプログラムによ
る結果が得られるでしょう. lptest
を使った場合は,
以下のような結果が見られるでしょう.
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678
更にプリンタをテストしたい場合は, (言語ベースのプリン
タのための) もっと大きなプログラムを送信するか, 引数を
変えて lptest
を実行します. 例えば, lptest
80 60
で それぞれ80文字の行を60行生成します.
プリンタがうまく動かなかった場合は, 次の節, 「 トラブルシューティ ング」をご覧ください.
lptest
を使った簡単なテストをおこなった結果, 正しい出
力を得られずに, 以下に示すような出力が得られるかもしれ
ません.
プリンタは上で示されたような印字をおこなったのですが, しばら くして止まってしまい, 動かなくなってしまいました. 印字 された結果をプリンタから取り出すためには, プリンタにある PRINT REMAINING ボタン, また は, FORM FEED ボタンを押す必要があるようです.
この場合は, おそらくジョブはプリントをする前に更にデー タが送られてこないか待ち続けているのでしょう. この問題を解決するためには, プリンタに FORM FEED 文字 (あるいは特定の必要な文字コード) を 送るテキストフィルタを使ってください. プリンタ内部に残っ たデータをプリンタにすぐに印字させるには, 普通は, これ で十分です. 次のジョブが前のジョブの最終ページの中央の どこかから印字を開始させないためにも, 紙の途中で印字の ジョブが終了したかどうかを確認するのは有益です.
シェルスクリプト /usr/local/libexec/if-simple
を次のように変更して, プリンタへジョブを送信した後に
FROM FEED 文字を印字させるようにします.
<hr>
#!/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<hr>
次のような印字結果が得られた.
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
あなたは「階段効果」の新たなる犠牲者になってしま
いました. この原因は, 改行を表わすべき文字がなんであるか
の解釈が混乱していることにあります. UNIX スタイルのオ
ペレーティングシステムでは, 改行文字は ASCII コード10
の line feed (LF) の1文字が使われています. MS-DOS や
OS/2などは ASCII コード10の LF と, ASCII コード
13の文字 (carriage return または CR) をペアで使います.
(訳注:Machintosh では CR のみで表現されています).
大抵のプリンタでは, 改行を表わすために MS-DOS の慣習にしたが
います.
FreeBSD で印字する場合, 印字したテキストは LF 文字だけ が使われていました. プリンタでは LF 文字を見つけると, 紙を1行分送り出しました. しかし, 次の文字を印字するた めの紙の水平方向の位置は維持されました. すなわち, CR 文字が意味することは, 次の文字を印字する位置を紙の左端 に動かすことです.
FreeBSD がプリンタに動作をして欲しいと思っている動作を 以下に示します.
プリンタが CR を受け取ったとき CR 動作 (復帰) をおこなう.
プリンタが LF を受け取ったとき CR + LF 動作 (復帰, 改行) をおこなう.
このように動作させるための方法がいくつかあります.
注意: FreeBSD 以外のオペレーティン グシステムを切り替えて使う場合, CR と LF 文字 の解釈をそのオペレーティングシステムで使われて いるようにプリンタを再設定する必要がある かもしれません. 以下に示す解決方法のいずれかを 選ぶのがよいかもしれませんね.
/etc/printcap
ファ
イルで対象プリンタの fs
項目で CRMOD ビッ
トをセットします.
次に, Hewlett Packard 社の PCL エスケープコー ドに対応しているプリンタのためのテキストフィル タの例を示します. このフィルタでは, プリンタ に LF 文字を LF と CR の2文字として扱わせます. その後に, プリンタにジョブを送ります. 最後に, ジョブの最終ページの紙を排出するため, FROM FEED 文字を送ります. このフィルタは Hewlett Packard 社のほとんどすべてのプリンタで機能するは ずです.
<hr>
#!/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. Writes a form feed character # after printing job. printf "\033&k2G" && cat && printf "\f" && exit 0 exit 2<hr>
ホスト orchid にある /etc/printcap
の
例を以下に示します. ここには, 一番目のパラレル
ポートにプリンタ (Hewlett Packard LaserJet 3Si)
が一台接続されており, そのプリンタ名は
teak
です.
<hr>
# # /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:<hr>
if-simple
の cat の部分
を置き換えればよいわけです. 具体的にどのように
するかは, 読者への練習問題としましょう. プリンタは紙送りをまったくしませんでした. テキストすべての行 がある行の上で重ねて印字されてしまいました.
この問題は, 階段現象とは「正反対」な問題で, ほとんどま れにしか起こりません. FreeBSDでは行末として扱われる LF 文字が, 紙の左端に印字位置を復帰しますが, 紙送りはしな い CR 文字として扱われています.
プリンタの設定スイッチかコントロールパネルを使って, LF と CR の文字を次のような解釈をするようにしてください.
プリンタが CR を受け取ったとき CR 動作 (復帰) をおこなう.
プリンタが LF を受け取ったとき CR + LF 動作 (復帰, 改行) をおこなう.
訳注: LF を CR+LF に置き換える cat コマンドを作る方法
も当然考えられます. そして, このコマンドと,
if-simple
の cat の部分を置き換えればよいわけ
です. 具体的にどのようにするかは, 読者への練習問題とし
ましょう.
印字しているのですが, 各行の2〜3文字が印字されません. プリンタを動かせば動かすほど, もっとたくさんの文字が紛 失されていき, この問題は更に悪くなっていくかもしれませ んでした.
この問題は, シリアルポートを通してコンピュータから送ら れてくるデータの速度に, プリンタがついていけないことに 起因します (この問題は, パラレルポートに接続されたプリ ンタでは発生することはありません). この問題を克服する 方法が2つあります.
fs
で TANDEM ビット
をセットして, FreeBSD にこの機能を使用させて
ください.
fs
で MDMBUF ビットをセッ
トして下さい. それから, プリンタとコンピュータ
を接続しているシリアルケーブルがキャリアフロー
制御用に正しく配線されたものかどうかを確認して
ください.
fs
の NLDELAY と
TBDELAY, CRDELAY, VTDELAY, BSDELA のいくつかのビッ
トを組み合わせて使い, プリンタへ送るデータの流
れに適当な遅延を加えてください. プリンタはランダムなゴミのように見えるものを印字しまし たが, 意図したテキストは印字してくれませんでした.
この問題は, 通常, シリアルポートに接続したプリンタでの
通信パラメータの誤りからくる前項とは別の症状です.
br
項目の通信速度と fs
と fc
項目のパリ
ティビットの設定を共に調べてみてください. また, プリン
タでの設定が /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
を使います.