FreeBSD ハンドブック : プリンタの利用 : プリンタ設定導入編 : ソフトウェアの設定
Previous: プリンタ機器の設定
Next: プリンタを使う

7.4.2. ソフトウェアの設定

本節ではFreeBSDのLPDスプーリングシステムで印字をおこなうために 必要となるソフトウェアの設定について説明しています.

本節の概要は次のようになります.

  1. プリンタで使用するポートのために, 必要があれば, カー ネルの書き変えをおこないます. 「 カーネルの変更」で, このためにしなくてはなら ないことを説明しています.
  2. パラレルポートを使用している場合は, パラレルポートの ための通信モードの設定します. 詳細は, 「 パラレルポート の通信モードを設定する」で説明しています.
  3. オペレーティングシステムからプリンタにデータが送ら れているかをテストします. 「 プリンタとの通信状況を調べる」で, どのように テストするかの提案をいくつかおこなっています.
  4. ファイル/etc/printcapを変更し, LPDの設定を おこないます. 「 /etc/printcap ファイル」で, どのように変更するかを 説明しています.

7.4.2.1. カーネルの変更

オペレーティングシステムのカーネルのコンパイルをおこなうこと によって, 指定されたのデバイスが機能するようになります. シリ アル, または, パラレルインタフェースをプリンタで使用する場合, 必要なデバイスがこの指定の中に含まれていなくてはなりません. したがって, 必要なデバイスがカーネルに組み込まれていない場合, 追 加のシリアル, または, パラレルポートをサポートするために, カー ネルの再コンパイルが必要となるかもしれません.

シリアルポートが現在使用しているカーネルでサポートされている かどうかを調べるためには, 次のように入力します.

dmesg | grep sioN

ここで, N はシリアルポートの番号を示し, この番号は0から 始まります. 次のような出力があった場合, カーネルはそのポー トをサポートしています.

 
sio2 at 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A

パラレルポートが現在使用しているカーネルでサポートされている かどうかを調べるためには, 次のように入力します.

dmesg | grep lptN

ここで, N はパラレルポートの番号を示し, この番号は0から 始まります. 次のような出力があった場合, カーネルはそのポー トをサポートしています.

lpt0 at 0x378-0x37f on isa

上記の出力が得られない場合, プリンタを使うため, オペレーティ ングシステムにパラレル, または, シリアルポートを認識し, 使用 できるようにするためにはカーネルを変更する必要があります.

シリアルポートをサポートさせるには, 「 FreeBSDカーネルのコンフィグレーション」の節をご覧く ださい. パラレルポートをサポートさせる場合も, その節と, あ わせて, この節に続く節もご覧ください.

ポート用エントリを /dev に追加する

カーネルがシリアル, または, パラレルポートを通じての通 信をサポートしていたとしても, システム上で動いているプログ ラムがデータの送受信をおこなうためのソフトウェアインタフェース がさらに必要になります. そのインタフェースは, /dev ディレクトリにあるエントリに相当します.

/dev エントリにポートを加えるために

  1. su コマンドで root になります. suコマンド でパスワードを聞かれたら, ルート用のパスワードを入力し ます.
  2. /dev ディレクトリに移動します.
    cd /dev
    
  3. 次のように入力します.
    ./MAKEDEV port
    ここで, port は, 作成するポート名です. 1番目 のパラレルポートのときは lpt0 に, 2番目のときは lpt1 になり, 以降同様になります. 1番目のシリア ルポートのときは, ttyd0 に, 2番目のときは ttyd1 になり, これも以降同様となります.
  4. 次を入力し, デバイスのエントリができたか確認し ます.
    ls -l port

パラレルポートの通信モードを設定する

パラレルインタフェースを使用している場合, FreeBSDでは, 割り込み駆動型にするか, プリンタとの通信の状況をカーネルに監 視させるかのいずれかを選択できます.

割り込み駆動方式は, いくらか高速になりますが, 貴重な IRQ ラインを一つ消費します. うまく機能するものをお使いください.

通信モードを設定するためには2つの方法があります. 1つはカー ネルを変更することで, もう一つは lptcontrol プログ ラムを使用する方法です.

カーネルを設定することによって, 通信モードを変更す る.

  1. カーネルコンフィグレーションファイルを変更しま す. lpt0 のエントリを探すか追加してください. 2番目 のパラレルポートを設定するときは, 代わりに lpt1 を使います. 以下, 3番目のポートは lpt2 となってい きます.
  2. ファイルをセーブし, config プログラムを起動 し, カーネルの構築, インストールをおこないます. そして, リ ブートしてください. 詳細は, 「 FreeBSDカーネルのコンフィグレーション」を参照 してください.

lptcontrol で通信モードを設定する場合

これらのコマンドを /etc/rc.local ファイルに追加 しておくと, システムをブートする度に通信モードを設定する ことができます. 詳細については, lptcontrol(8) をご覧ください.

プリンタとの通信状況を調べる

スプーリングシステムの設定に進む前に, オペレーティング システムがプリンタにデータを送ることに成功しているかどうか を確かめるべきでしょう. これにより, 印字がうまくいかないと き, プリンタとの通信が問題なのか, スプーリングシステムが問 題なのかを分けて調べることがかなり容易になります.

プリンタをテストするためには, プリンタに何かのテキストを送 信してみます. 送信した文字をすぐに印字してくれるプリンタに は, lptest コマンドを使うと有用です. このコマンドは印 字可能な96文字のASCII文字すべてを96行生成します.

PostScript (または他の言語に対応した) プリンタの場合 は, もっと巧妙なテストが必要になります. 次のような, 簡単な PostScript プログラムを使えば十分でしょう.


%!PS
100 100 moveto 300 300 lineto stroke
310 310 moveto
/Helvetica findfont 12 scalefont setfont
(Is this thing working?) show
showpage

注意: このドキュメントでプリンタ用言語を参照するとき は, PostScript のような言語を仮定しており, Hewlett Packard の PCL は考慮していません. PCL は非常に機能的なの ですが, プレインテキストにエスケープシーケンスを混ぜること ができます. PostScript ではプレインテキストを直接印字 することはできません. このような種類のプリンタ言語に対して は, 特別な対応をおこなわなければなりません.

パラレルポートのプリンタとの接続を調べる

この節では, FreeBSDがパラレルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について説明し ています.

パラレルポートのプリンタをテストするために

  1. su コマンドで root になります.
  2. プリンタにデータを送ります.

これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します.

シリアルポートのプリンタとの接続を調べる

この節では, FreeBSDがシリアルポートに接続されたプリ ンタと通信できているかどうかを調べる方法について述べられ ています.

シリアルポートのプリンタをテストするために

  1. su コマンドで root になります.
  2. /etc/remote ファイルを編集します. 次の エントリを加えてください.
    printer:dv=/dev/port:br#bps-rate:pa=parity
    ここで, port シリアルポート (ttyd0, ttyd1 など) のデバイスエントリで, bps-rateは プリンタとの通信の転送速度[bit/秒], parityはプリ ンタとの通信で必要とされるパリティ (even, odd, none, zeroのいずれか) を表わしていま す.

    次の例は, プリンタをシリアルケーブルでパリティなし, 転送速度19200bpsで第3番目のシリアルポートに接続した場 合です.


    printer:dv=/dev/ttyd2:br#19200:pa=none
    

  3. tip コマンドでプリンタと接続します. 次のよ うに入力してください.
    tip printer
    
    これがうまくいかなかった場合は, /etc/remoteを 編集して, /dev/ttydNの代わりに /dev/cuaaNを試してみてください.
  4. プリンタにデータを送ります.

これで何かがプリントされることでしょう. 印字されたテキ ストがおかしくても心配しなくても構いません. それについ ては, 後で修正します.

7.4.2.2. スプーラに許可を与える: /etc/printcap ファイル

ここまでで, プリンタはコンピュータに接続され, (必要なら) プリンタと通信できるようにカーネルを変更し, 簡単なデータをプ リンタに送信することができているはずです. これで, LPDにプリ ンタへのアクセスを制御させる設定をおこなう準備が整いました.

LPDの設定は /etc/printcap を編集することでおこないます. LPDスプーリングシステムはスプーラが使われる毎にこのファイル を参照します. そのため, ファイルを更新するとすぐにその変更が 反映されます.

printcap ファイルの書式は簡単です. /etc/printcap の編集はお好みのテキストエディタをお 使いください. このファイルの書式は, /usr/share/misc/termcap/etc/remote といった他のケイパビリティファイルと一致しています. この書式 のついての詳細な情報については cgetent(3) をご覧ください.

スプーラの単純な設定法は, 次のステップでおこないます.

  1. プリンタに名前 (と簡単な別名2〜3個) を付け, それを /etc/printcap ファイルに記述します. これについ ては, 「 プリンタに名前を付ける」 を参照してください.
  2. sh の項目を追加することで, ヘッダページの出 力を禁止します (デフォルトは許可). これについては, 「 ヘッダページの印字 を禁止する」 を参照してください.
  3. スプール用のディレクトリを作成し, その位置を sd 項目で指定します. これについては, 「 スプーリングディレクトリ の作成」 を参照してください.
  4. プリンタを使用するために /dev エントリを 設定し, /etc/printcaplp 項目でそのエ ントリを指定します. これについては, 「 プリンタデバイスの特定」 を参照してください. プリンタをシリアルポートに接続した場合は, fs, fc, xs, xc の項目を設定する必要があります. こちらについては, 「 スプーラのための通信パラメータの設定」 を参照してください.
  5. プレインテキスト用の入力フィルタのインストールを おこないます. 「 テキストフィルタのインストール」 を参照してください.
  6. lpr コマンドで何かを印字することで設定のテス トをおこないます. 印字して みようトラブルシューティング を参照してください.

注意: PostScript プリンタのような, プリンタ言語を 使用しているプリンタには, プレインテキストを直接印字させる ことができません. 上にアウトラインを示し, 以下の節で説明す る簡単な設定方法の説明では, そのようなプリンタを設置してい る場合は, プリンタが認識できるファイルだけを印字の対象とし ているという仮定をしています.

多くの場合, 利用者はシステムに設置されているプリンタすべてでプ レインテキストが印字できることを期待しています. 印字作業を おこなうためにLPDのインタフェースを利用するプログラムでも, 通 常, そのような仮定を置きます. プリンタ言語を使用するプリン タを設置しており, そのプリンタ言語で記述されたジョブと, これに加えて, プレインテキストのジョブも印字できるよ うにしたいならば, 上で示した簡単な設定方法に加えて, さら なる設定をおこなうことを強くお勧めします. すなわち, 原始的なプ レインテキストから PostScript (もしくは, 他のプリンタ 言語) に変換するプログラムをインストールしてください. 「 プレインテキス トのジョブを PostScript プリンタで印字する」で, そ れをどのようにおこなえばよいのかが説明されています.

訳注: 日本語を印字したい場合は, プリンタ言語を使用し ていない「日本語プリンタ」についても, プリンタ固有のエスケー プシーケンスを送る必要があります. また, 漢字コードをプリン タが設定しているものに変換したりする必要があり, 各プリンタ 毎に, 日本語用のフィルタが必要になります.

プリンタに名前を付ける

最初の (簡単な) ステップで, プリンタの名前を考えます. プ リンタには別名をいくつか付けることもできるので, 機能的な名前 でも風変わりな名前でもどちらを選んでもまったく問題はありません.

少なくとも1つのプリンタには, /etc/printcap の中 で, lp という別名を持たせるべきでしょう. この名前は デフォルトのプリンタ名になっています. ユーザが環境変数 PRINTER を設定しておらず, かつ, LPDコマンドのコマンドラインでプリ ンタの名前が指定されていない場合, lp がデフォルトのプリ ンタ名となり, そのプリンタに出力されます.

それから, これは共通の慣習ですが, プリンタの最後の別名には, メーカーやモデル名を含むプリンタの完全な名称をつけることに なっています.

名前と別名のいくつかを決めたら, /etc/printcap ファ イルに設定します. プリンタ名は一番左のカラムから書き始めま す. 別名はそれぞれ縦棒によって区切られ, 最後の別名の後ろに コロンを置きます.

次の例では, 2台のプリンタ (Diablo 630 ラインプリンタと Panasonic KX-P4455 PostScript レーザライタプリンタ) が定義 されている /etc/printcap のスケルトンを記しています.


#
#  /etc/printcap for host rose
#
rattan|line|diablo|lp|Diablo 630 Line Printer:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:

この例では, 最初のプリンタに rattan という名前と別名 として, line, diablo, lp そして Diablo 630 Line Printer が付けられています. 別名とし て lp があるので, このプリンタはデフォルトのプリンタとなっ ています. 2番目は bamboo と名付けられ, 別名として, psPS, S, panasonic, Panasonic KX-P4455 PostScript v51.4 が付けられていま す.

ヘッダページの印字を禁止する

LPDスプーリングシステムでは, デフォルトでジョブ毎にヘッ ダページを印字します. ヘッダページにはジョブを要求したユー ザ名, ジョブが送られたホスト名, そして, ジョブの名前が素晴 らしい大きな文字で印字されています. 残念なことに, この余分 なテキストすべてが, 簡単なプリンタ設定法のデバッグの際に紛れ 込んできてしまいます. このため, ヘッダページの出力を禁止し ておきます.

ヘッダページの出力を禁止するには, /etc/printcap にあるプリンタのエントリに sh の項目を追加します. 次 に, sh を加えた /etc/printcap の例を示しま す.


#
#  /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:

この書式を正しく使うための注意をしておきます. 最初の行は左 端のカラムから始まります. それに続く行は TAB ひとつ分だけ 字下げします. 最後の行以外のすべての行は, 行末にバックスラッ シュを記述します.

スプーリングディレクトリの作成

スプーラの簡単な設定の次のステップでは, スプーリン グディレクトリを作成します. プリンタに送られるジョブ は, その印字が終了するまでこのディレクトリに置かれます. また, 他のたくさんのスプーラもこのディレクトリにファイ ルを置きます.

様々な事情によりスプーリングディレクトリは, 通常, 慣例 として /var/spool の下に置きます. また, スプーリングディレクトリの内容はバックアップをす る必要はありません. mkdir によってディレクトリを 作るだけでスプーリングディレクトリの復旧は完了します.

スプーリングディレクトリの名前は, これも慣例ですが, 次 のようにプリンタの名前と同じにします.

mkdir /var/spool/printer-name

しかしながら, ネットワーク上に使用可能なプリンタがたく さんあるならば, LPDで印字するための専用のディレクトリに スプーリングディレクトリを置きたいと思うかもしれません. 例に出てきたプリンタ rattanbamboo につい て, この方式を採用すると, 次のようになります.

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 項目で指定します.


#
#  /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:

プリンタ名が最初のカラムから始まっており, そのプリンタ に関して記述される他のエントリは TAB で字下げされてい ること, 各行がバックスラッシュで終わっていることに注意 してください.

sd によりスプーリングディレクトリが指定されていな い場合, スプーリングシステムは /var/spool/lpd デフォルト値として使用します.

プリンタデバイスの特定

ポート用エントリ を<tt>/dev</tt> に追加する」では, FreeBSD でプリン タとの通信に使用される /dev ディレクトリ内の エントリを特定します. そして, LPD にその情報を伝えま す. 印字するジョブを受け取ると, スプーリングシステムは, (プリンタにデータを渡す義務がある) フィルタプログラムに 代わって指定されたデバイスをオープンします.

/etc/printcap ファイルで lp 項目を使って /dev エントリを記入します.

ここでの例では, rattan は1番目のシリアルポートに, bamboo は6番目のシリアルポートに接続されているこ とにしましょう. このとき, /etc/printcap には 次のようになります.


#
#  /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:

/etc/printcap でプリンタの lp 項目が指定 されていない場合は, LPD はデフォルトとして /dev/lp を使用します. /dev/lp は, 現在の FreeBSD には存在していません.

設置したプリンタがパラレルポートに接続されている場合は, 「 テキストフィルタのインストール」まで読み飛ばしてください. そうでない場合は, 次節の説明に続いてください.

スプーラのための通信パラメータの設定

シリアルポートにプリンタを接続した場合, プリンタにデー タを送信するフィルタプログラムに代わり, 通信速度やパリ ティ, その他のシリアル通信パラメータを設定することがで きます. このことによる利点は,

次の /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 を作ってみましょ う. 次のテキストをお好みのテキストエディタでファイルに 書き込んでください.


#!/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

そして, このファイルを実行可能にします.
chmod 555 /usr/local/libexec/if-simple

LPD にこのテキストフィルタを使うことを設定するためには, /etc/printcapif 項目を使って指定しま す. これまでの /etc/printcap の例のプリンタ 2台に, このフィルタを加えてみましょう.


#
#  /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:

印字してみよう

簡単な 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 文字を印字させるようにします.


#!/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) をペアで使います. (訳注:Machintosh では CR のみで表現されています). 大抵のプリンタでは, 改行を表わすために MS-DOS の慣習にしたが います.

FreeBSD で印字する場合, 印字したテキストは LF 文字だけ が使われていました. プリンタでは LF 文字を見つけると, 紙を1行分送り出しました. しかし, 次の文字を印字するた めの紙の水平方向の位置は維持されました. すなわち, CR 文字が意味することは, 次の文字を印字する位置を紙の左端 に動かすことです.

FreeBSD がプリンタに動作をして欲しいと思っている動作を 以下に示します.

プリンタが CR を受け取ったとき		CR 動作 (復帰) をおこなう. 
プリンタが LF を受け取ったとき		CR + LF 動作 (復帰, 改行) をおこなう. 

このように動作させるための方法がいくつかあります.

各行が重ね書きされてしまった

プリンタは紙送りをまったくしませんでした. テキストすべての行 がある行の上で重ねて印字されてしまいました.

この問題は, 階段現象とは「正反対」な問題で, ほとんどま れにしか起こりません. FreeBSDでは行末として扱われる LF 文字が, 紙の左端に印字位置を復帰しますが, 紙送りはしな い CR 文字として扱われています.

プリンタの設定スイッチかコントロールパネルを使って, LF と CR の文字を次のような解釈をするようにしてください.

プリンタが CR を受け取ったとき		CR 動作 (復帰) をおこなう. 
プリンタが LF を受け取ったとき		CR + LF 動作 (復帰, 改行) をおこなう. 

訳注: LF を CR+LF に置き換える cat コマンドを作る方法 も当然考えられます. そして, このコマンドと, if-simple の cat の部分を置き換えればよいわけ です. 具体的にどのようにするかは, 読者への練習問題とし ましょう.

プリンタが文字を紛失してしまう

印字しているのですが, 各行の2〜3文字が印字されません. プリンタを動かせば動かすほど, もっとたくさんの文字が紛 失されていき, この問題は更に悪くなっていくかもしれませ んでした.

この問題は, シリアルポートを通してコンピュータから送ら れてくるデータの速度に, プリンタがついていけないことに 起因します (この問題は, パラレルポートに接続されたプリ ンタでは発生することはありません). この問題を克服する 方法が2つあります.

プリンタは意味不明な文字列を印字した

プリンタはランダムなゴミのように見えるものを印字しまし たが, 意図したテキストは印字してくれませんでした.

この問題は, 通常, シリアルポートに接続したプリンタでの 通信パラメータの誤りからくる前項とは別の症状です. br 項目の通信速度と fsfc 項目のパリ ティビットの設定を共に調べてみてください. また, プリン タでの設定が /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 を使います.


FreeBSD ハンドブック : プリンタの利用 : プリンタ設定導入編 : ソフトウェアの設定
Previous: プリンタ機器の設定
Next: プリンタを使う