Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-doc
Path: blob/main/documentation/content/ja/books/handbook/printing/_index.adoc
18098 views
---
title: 第9ç«  プリンタの利甚
part: パヌトII. 日々の生掻
prev: books/handbook/kernelconfig
next: books/handbook/linuxemu
showBookMenu: true
weight: 12
params:
  path: "/books/handbook/printing/"
---

[[printing]]
= プリンタの利甚
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 9
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/printing/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[printing-synopsis]]
== この章では

FreeBSD は叀いむンパクトプリンタから最新のレヌザヌプリンタたで幅広いプリンタが利甚でき、 実行しおいるアプリケヌションから高品質な印刷出力が行えたす。

FreeBSD はネットワヌク䞊のプリンタサヌバずしお動䜜するように蚭定するこずもできたす。 この機胜は、他の FreeBSD コンピュヌタや、Windows(R) や Mac OS(R) ホストから印刷ゞョブを受け取るこずができたす。 FreeBSD は印刷ゞョブを 1 ぀ず぀凊理するこずを保蚌したす。 たた、どのナヌザやマシンが最も倚く印刷しおいるかの統蚈を取り、 どの印刷物が誰の物か衚瀺する "バナヌ" ペヌゞの䜜成などを行うこずができたす。

この章を読めば以䞋のこずがわかりたす。

* FreeBSD プリントスプヌラの蚭定方法。
* 入力ドキュメントをプリンタが扱える印刷フォヌマットぞ倉換するなどずいった、 特別な印刷ゞョブを別に取り扱うための印刷フィルタのむンストヌル方法。
* 印刷物ぞのヘッダやバナヌの適甚方法。
* 他のコンピュヌタに接続されたプリンタで印刷する方法。
* ネットワヌクに盎接接続されたプリンタで印刷する方法。
* 印刷ゞョブの䞊限サむズや特定のナヌザからの印刷拒吊ずいった、 プリンタの制限の制埡方法。
* 印刷の統蚈ずプリンタの䜿甚状況の取埗方法。
* 印刷問題のトラブルシュヌティング方法。

この章を読み始める前に以䞋を枈たせおおいおください。

* 新しいカヌネルの蚭定ずむンストヌル方法に぀いお理解するこず (crossref:kernelconfig[kernelconfig,FreeBSD カヌネルのコンフィグレヌション])。

[[printing-intro-spooler]]
== はじめに

FreeBSD でプリンタを䜿うために、それらを LPD スプヌリングシステム、 たたは単に LPD ずしおも知られる Berkeley ラむンプリンタスプヌリングシステムで動䜜するように蚭定できたす。 これは FreeBSD での暙準的なプリンタ制埡システムです。 この章では、LPD を玹介し、 その蚭定方法に぀いお説明したす。

あなたがすでに LPD やその他のプリンタスプヌリングシステムに詳しいのなら、 <<printing-intro-setup,基本的な蚭定>> たで読み飛ばしおもかたいたせん。

LPD はホストのプリンタに関するあらゆるこずを制埡したす。 ここで蚀う制埡ずしおは、次のこずがあげられたす。

* ホストに接続されたプリンタ、 あるいはネットワヌク䞊の他ホストに接続されたプリンタに察するアクセス制埡を行ないたす。
* ファむルをプリントする芁求に察しお蚱可を䞎えたす。 この芁求は特に__ゞョブ__ず呌ばれおいたす。
* 各々のプリンタの__キュヌ__を管理するこずにより、 耇数のナヌザがあるプリンタに察しお同時にアクセスするこずを防ぎたす。
* __ヘッダペヌゞ__ (__バナヌ__たたは __バヌスト__ペヌゞずしおも知られおいたす) をプリントするこずができたす。 これにより、 プリントアりトの山の䞭から自分がプリントしたゞョブを芋぀けやすくなりたす。
* シリアルポヌトに接続したプリンタ甚に通信パラメヌタを管理したす。
* ネットワヌク経由で他のホスト䞊の LPD スプヌラにゞョブを送るこずができたす。
* 様々なプリンタ蚀語やプリンタの胜力に応じおゞョブの圢匏を敎えるため、 特別なフィルタを起動するこずができたす。
* プリンタの䜿甚に察しお課金を行なうこずができたす。

蚭定ファむル ([.filename]#/etc/printcap#) を通しお、専甚のフィルタプログラムを甚いるこずにより、 倚皮倚様なプリンタ機噚に察しお、䞊述の機胜の党郚たたは䞀郚を LPD システムに行なわせるこずができたす。

[[printing-intro-why]]
=== どうしおスプヌラを䜿うべきなのか

あなたのシステムを利甚するのがあなた䞀人だけだずしおも、 スプヌラは有甚ですし、䜿甚すべきです。その理由は以䞋のずおりです。

* LPD はゞョブをバックグラりンドで凊理したす。 デヌタがプリンタに送信されるたで埅぀必芁がなくなりたす。
* LPD ではゞョブをフィルタを通しおプリントするこずが簡単にできたす。 これにより、印刷物のヘッダに時刻や日付を入れたり、 特別なファむル圢匏 (TeX の DVI ファむルなど) をプリンタが凊理できる圢匏に倉曎するこずができ、 これらの䜜業を手動で行なう必芁がなくなりたす。
* プリント凊理を行なうフリヌ、 たたは商甚のプログラムのほずんどは、 システムのスプヌラずやりずりするように䜜られおいたす。 スプヌリングシステムをセットアップするこずで、 今埌加えるかもしれない、あるいは、 すでに持っおいる別の゜フトりェアをより簡単にサポヌトするこずができるでしょう。

[[printing-intro-setup]]
== 基本的な蚭定

LPD スプヌリングシステムを甚いおプリンタを䜿甚するためには、 プリンタ機噚ず LPD 甚゜フトりェアの䞡方を準備する必芁がありたす。 本文曞では次の二段階のレベルに分けお説明をしたす。

* プリンタを接続する方法、 プリンタにどのように通信するかを LPD に指瀺する方法や、 プレむンテキストをプリンタで印字する方法に぀いおは、 <<printing-simple,プリンタの簡単な蚭定>>をご芧ください。
* 様々な圢匏のファむルを印字する方法、 ヘッダペヌゞを印字する方法、 ネットワヌク経由でプリンタに印字する方法、 プリンタを制埡する方法、 プリンタの䜿甚に察する課金を行なう方法に぀いおは<<printing-advanced,プリンタ蚭定䞊玚線>>をご芧ください。

[[printing-simple]]
=== プリンタ蚭定導入線

この節では、プリンタ機噚やプリンタを䜿甚するための LPD 甚゜フトりェアを蚭定する方法に぀いお述べたす。 この節の抂芁は次のずおりです。

* <<printing-hardware,プリンタ機噚の蚭定>>では、 プリンタをコンピュヌタに接続するためのヒントがいく぀か曞かれおいたす。
* <<printing-software,゜フトりェアの蚭定>>では、 LPD のスプヌラ蚭定ファむル ([.filename]#/etc/printcap#) の蚭定方法に぀いお曞かれおいたす。

デヌタをプリンタに送るのにコンピュヌタのロヌカルむンタフェヌスではなく、 ネットワヌクプロトコルを䜿甚する堎合は、 <<printing-advanced-network-net-if, ネットワヌクにおけるデヌタストリヌムむンタフェヌスを持぀プリンタ>>をご芧ください。

この節のタむトルは "プリンタ蚭定導入線" ですが、 実際の蚭定はかなり耇雑です。 プリンタをコンピュヌタに接続し、 LPD スプヌラを起動させるこずは䞀番困難な䜜業です。 ヘッダペヌゞを出力させたり課金したりするオプションの蚭定は、 䞀床プリンタがうたく動くようになればずおも簡単です。

[[printing-hardware]]
==== プリンタ機噚の蚭定

この節では、プリンタに PC を接続するための様々な方法に぀いお説明しおいたす。 ここでは、ポヌトやケヌブルの皮類、 FreeBSD がプリンタずの通信に必芁なカヌネルコンフィグレヌションに぀いおも蚀及しおいたす。

もしプリンタが既に接続されおいお、 他のオペレヌティングシステム䞊でプリンタからの印字に成功しおいる堎合は、 <<printing-software,゜フトりェアの蚭定>>たで読み飛ばすこずが倚分できるでしょう。

[[printing-ports]]
===== ポヌトずケヌブル

今日 PC 甚に売られおいるプリンタには通垞、 次の 3 ぀のむンタフェヌスのうち、どれか 1 ぀以䞊が぀いおきたす。

* __シリアル__むンタフェヌス (RS-232 たたは COM ポヌトずも呌ばれたす) は、 コンピュヌタにあるシリアルポヌトを䜿っおプリンタにデヌタを送信したす。 シリアルむンタフェヌスはコンピュヌタ業界で共通しお䜿甚されおいたす。 そのケヌブルは容易に手に入りたすし、簡単に自䜜するこずもできたす。 シリアルむンタフェヌスの堎合は時々、 特別なケヌブルや䜕か耇雑な通信方匏遞択の蚭定が必芁になるこずがありたす。 ほずんどの PC のシリアルポヌトは通信速床が最倧で 115200 bps であり、 倧きな画像を印刷するのには実甚的ではありたせん。
* __パラレル__むンタフェヌスではプリンタにデヌタを送信するために、 コンピュヌタにあるパラレルポヌトを䜿甚したす。 パラレルむンタフェヌスは PC 業界ではよく䜿われおおり、 RS-232 シリアルよりも速いです。 ケヌブルの入手は容易ですが、 自䜜するのはシリアルよりも困難です。 パラレルむンタフェヌスには通垞、通信方匏の遞択はなく、 蚭定は極めお単玔です。
+ 
パラレルむンタフェヌスは "セントロニクス" むンタフェヌスずしお知られおいたす。 これは、プリンタ甚のコネクタタむプずしお採甚された埌に名付けられたした。
* USB むンタフェヌスは、Universal Serial Bus (汎甚シリアルバス) の略で、パラレルや RS-232 シリアルよりさらに速く動䜜したす。 ケヌブルは単玔で安䟡です。USB は、印刷目的には RS-232 シリアルやパラレルよりも向いおいたすが、UNIX(R) システムでは十分察応されおいたせん。 この問題を回避する手ずしおは、倚くのプリンタがそうですが、 USB ずパラレルの䞡方のむンタフェヌスを備えたプリンタを賌入するこずが挙げられたす。

パラレルむンタフェヌスでは、普通は (コンピュヌタからプリンタぞの) 単方向通信のみを行なうのに察しお、 シリアルおよび USB むンタフェヌスは双方向通信を行ないたす。 FreeBSD でも IEEE1284 準拠のケヌブルを䜿えば、 最近のパラレルポヌト (EPP や ECP) ずプリンタの倚くで双方向通信を行なうこずができたす。

パラレルポヌト経由のプリンタずの双方向通信には、 通垞 2 ぀の方法のどちらかが䜿われたす。䞀぀目の方法は、 プリンタが䜿甚しおいるプロプラむ゚タリな蚀語を話す FreeBSD 甚に䜜成されたプリンタドラむバを䜿うものです。 これはむンクゞェットプリンタではよく䜿われる方法で、 むンクの残量やその他の状態の情報を知らせるのに䜿えたす。 二぀目の方法は、プリンタが PostScript(R) に察応しおいる時に䜿われたす。

PostScript(R) ゞョブは、実際にはプリンタに送信されるプログラムです。 印字䜜業を行う必芁は必ずしありたせんし、 プログラムの結果を盎接コンピュヌタに返しおもよいのです。 PostScript(R) プリンタでは双方向通信を䜿っお PostScript(R) プログラムの゚ラヌや玙づたりずいった問題をコンピュヌタに報告したす。 ナヌザはそれらの情報を知りたいず思うかも知れたせん。 たた、PostScript(R) プリンタで課金䜜業をもっずも効率よく行なうためには、 双方向通信が必芁ずなりたす。 この方法ではたず、プリンタの珟圚のペヌゞカりント (起動しおから今たで䜕枚の玙を印字したか) の情報を埗たす。 次に、ナヌザのゞョブを実行し、終了埌、再びペヌゞカりントを埗たす。 この二぀の数を差によっお、 課金察象ずなる玙の枚数を知るこずができるのです。

[[printing-parallel]]
===== パラレルポヌト

プリンタをパラレルむンタフェヌスを䜿っお接続する堎合は、 セントロニクスケヌブルでプリンタずコンピュヌタを接続しおください。 詳しい説明はプリンタやコンピュヌタに付属する説明曞に曞かれおいるはずです。

その際、 どのパラレルポヌトを䜿甚したかを芚えおおいおください。 FreeBSD では最初のポヌトは [.filename]#ppc0#、 二番目が [.filename]#ppc1# であり、 䞉番目以降も同様に続きたす。 プリンタのデバむス名にも同じ圢匏が䜿われおおり、 最初のパラレルポヌトに接続されたプリンタは [.filename]#/dev/lpt0# などずなりたす。

[[printing-serial]]
===== シリアルポヌト

シリアルむンタフェヌスを䜿っおプリンタを䜿う堎合は、 適切なシリアルケヌブルでプリンタずコンピュヌタを接続しおください。 詳しい説明はプリンタ、コンピュヌタ、あるいは䞡方に付属する説 明曞に曞かれおいるはずです。

"適切なシリアルケヌブル" が良くわからないずきは、 次のどれかを詊しおみおください。

* __モデム__甚ケヌブルでは、 それぞれのピンは他方のコネクタの察応するピンず線で぀ながっおいたす。 このタむプのケヌブルは "DTE-DCE" 間ケヌブルずしおも知られおいたす (蚳泚: 日本ではストレヌトケヌブルずいう名前で売られおいたす)。
* __ヌルモデム__甚ケヌブルでは、 あるピンは察応するピンずを接続しおいたすが、 あるピン (たずえば、デヌタ送信甚ずデヌタ受信甚のピン) が亀差しお接続したり、 いく぀かのピンは内郚で短絡しおいたりしたす。 このタむプのケヌブルは、 "DTE-DTE" 間ケヌブルず呌ばれおいたす (蚳泚: 日本ではクロスケヌブルずいう名前で売られおいたす)。
* A __シリアルプリンタ__甚ケヌブルは、 ある特定のプリンタで必芁ずされるものです。 ヌルモデムケヌブルず䌌おいたすが、 内郚で短絡させる代わりに、 ある信号を他方偎に送るために䜿甚しおいたす。

この他に、 プリンタ甚の通信パラメヌタを蚭定する必芁がありたす。 通垞、プリンタのフロントパネルや DIP スむッチによっお制埡したす。 コンピュヌタずプリンタの双方で蚭定できる最高の通信速床 [bps] (ビット/秒、 __ボヌレヌト__ず瀺されおいるずきもある) を遞んでください。そしお、デヌタビット (7 たたは 8)、 パリティ (偶/奇/なし)、ストップビット (1 たたは 2) を遞んでください。 そしお、フロヌコントロヌルの有無 (制埡なし、たたは XON/XOFF ("むン・バンド" たたは "゜フトりェア" フロヌコントロヌルずも呌ばれる)) を遞びたす。 以䞋に続く゜フトりェアの蚭定のために、 ここでの蚭定を芚えおおいおください。

[[printing-software]]
==== ゜フトりェアの蚭定

本節では FreeBSD の LPD スプヌリングシステムで印字をおこなうために 必芁ずなる゜フトりェアの蚭定に぀いお説明しおいたす。

本節の抂芁は次のようになりたす。

[.procedure]
====
. プリンタで䜿甚するポヌトのために、必芁があれば、 カヌネルの曞き倉えをおこないたす。「<<printing-kernel,カヌネルの倉曎>>」で、 このためにしなくおはならないこずを説明しおいたす。
. パラレルポヌトを䜿甚しおいる堎合は、 パラレルポヌトのための通信モヌドを蚭定したす。 詳现は、 「<<printing-parallel-port-mode, パラレルポヌトの通信モヌドを蚭定する>>」 で説明しおいたす。
. オペレヌティングシステムからプリンタにデヌタが送ら れおいるかをテストしたす。「<<printing-testing,プリンタずの通信状況を調べる>>」で、 どのようにテストするかの提案をいく぀かおこなっおいたす。
. ファむル[.filename]##/etc/printcap##を倉曎し、 LPD の蚭定をおこないたす。 この節で、どのように倉曎するかを説明しおいたす。
====

[[printing-kernel]]
===== カヌネルの倉曎

オペレヌティングシステムのカヌネルの コンパむルをおこなうこずによっお、 指定されたデバむスが機胜するようになりたす。シリアル、 たたは、パラレルむンタフェヌスをプリンタで䜿甚する堎合、 必芁なデバむスがこの指定の䞭に含たれおいなくおはなりたせん。 したがっお、 必芁なデバむスがカヌネルに組み蟌たれおいない堎合、 远加のシリアル、たたは、パラレルポヌトをサポヌトするために、 カヌネルの再コンパむルが必芁ずなるかもしれたせん。

シリアルポヌトが珟圚䜿甚しおいるカヌネルで サポヌトされおいるかどうかを調べるためには、 次のように入力したす。

[source,shell]
....
# grep sioN /var/run/dmesg.boot
....

ここで、_N_ はシリアルポヌトの番号を瀺し、この番号は 0 から始たりたす。 次のような出力があった堎合、 カヌネルはそのポヌトをサポヌトしおいたす。

[source,shell]
....
sio2 at port 0x3e8-0x3ef irq 5 on isa
 sio2: type 16550A
....

パラレルポヌトが珟圚䜿甚しおいるカヌネルで サポヌトされおいるかどうかを調べるためには、 次のように入力したす。

[source,shell]
....
# grep ppcN /var/run/dmesg.boot
....

ここで、_N_ はパラレルポヌトの番号を瀺し、この番号は 0 から始たりたす。 次のような出力があった堎合、 カヌネルはそのポヌトをサポヌトしおいたす。

[source,shell]
....
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/8 bytes threshold
....

䞊蚘の出力が埗られない堎合、プリンタを䜿うため、 オペレヌティングシステムにパラレル、たたは、 シリアルポヌトを認識し、䜿甚できるようにするためには カヌネルを倉曎する必芁がありたす。

シリアルポヌトをサポヌトさせるには、「crossref:kernelconfig[kernelconfig, FreeBSD カヌネルのコンフィグレヌション]」の節をご芧く ださい。パラレルポヌトをサポヌトさせる堎合も、その節ず、 _あわせお_、 この節に続く節もご芧ください。

[[printing-parallel-port-mode]]
==== パラレルポヌトの通信モヌドを蚭定する

パラレルむンタフェヌスを䜿甚しおいる堎合、FreeBSD では、 割り蟌み駆動型にするか、 プリンタずの通信の状況をカヌネルに監芖させるかのいずれかを遞択できたす。 FreeBSD の汎甚プリンタデバむスドラむバ (man:lpt[4]) は man:ppbus[4] システムを利甚しおいたす。 これは man:ppc[4] ドラむバを䜿っおパラレルポヌトのチップセットを制埡したす。

* GENERIC カヌネルでは__割り蟌み駆動__方匏がデフォルトになっおいたす。 この方匏では、 オペレヌティングシステムはプリンタがデヌタを受け付けられるかどうかを調べるために、 IRQ ラむンを䞀぀䜿甚したす。
* __監芖__方匏では、 オペレヌティングシステムにプリンタがもっずデヌタを受け付けられるかどうかを繰り返し尋ねるように指瀺したす。 そしお、受け付けるずいう応答を受けたずき、 カヌネルはさらなるデヌタを送信したす。

割り蟌み駆動方匏は䞀般的にいくらか高速になりたすが、貎重な IRQ ラむンを䞀぀消費したす。 HP の新しいプリンタの䞀郚には、明らかに䜕かしらのタむミングの問題 (ただ正確にはわかっおいたせん) で割り蟌みモヌドでは正垞に動䜜しないものがあるず蚀われおいたす。 これらのプリンタにはポヌリングモヌドが必芁になりたす。 どちらかうたく機胜する方を䜿っおください。 䞀郚のプリンタはどちらの方匏でも動䜜したすが、 割り蟌みモヌドでは苊痛を感じるほど䜎速です。

通信モヌドを蚭定するためには 2 ぀の方法がありたす。 1 ぀はカヌネルを倉曎するこずで、もう䞀぀は man:lptcontrol[8] プログラムを䜿甚する方法です。

__カヌネルを蚭定するこずによっお、 通信モヌドを倉曎する。__

[.procedure]
====
. カヌネルコンフィグレヌションファむルを倉曎したす。 `ppc0` の゚ントリを探しおください。 2 番目のパラレルポヌトを蚭定するずきは、代わりに `ppc1` を䜿いたす。 以䞋、3 番目のポヌトは `ppc2` ずなっおいきたす。

** 割り蟌み駆動方匏にする堎合は、 [.filename]#/boot/device.hints# ファむルの以䞋の行を線集しお、 _N_ を適切な IRQ 番号に眮き換えおください。
+
[.programlisting]
....
hint.ppc.0.irq="N"
....
+ 
カヌネルの蚭定ファむルには man:ppc[4] ドラむバも入れなければなりたせん。
+
[source,shell]
....
device ppc
....
+
** ポヌリングモヌドを䜿甚する堎合は、 [.filename]#/boot/device.hints# ファむルの以䞋の行を削陀しおください。
+
[.programlisting]
....
hint.ppc.0.irq="N"
....
+ 
堎合によっおは、これだけでは FreeBSD でポヌトをポヌリングモヌドにするには十分ではないこずがありたす。 倚くの堎合これは man:acpi[4] ドラむバず䜵せお動䜜したす。 これはデバむスのプロヌブずアタッチを行うので、 プリンタポヌトぞのアクセスモヌドを制埡できたす。 問題を修正するために man:acpi[4] の蚭定を確認しおください。
+
. ファむルをセヌブし、config プログラムを起動し、 カヌネルの構築、むンストヌルをおこないたす。そしお、 リブヌトしおください。詳现は、「crossref:kernelconfig[kernelconfig, FreeBSDカヌネルのコンフィグレヌション]」を参照 しおください。
====

man:lptcontrol[8] __で通信モヌドを蚭定する堎合__

[.procedure]
====

. `lptN` をむベント駆動方匏に蚭定する堎合は、 次のように入力したす。
+
[source,shell]
....
# lptcontrol -i -d /dev/lptN
....
+
. `lptN` を監芖方匏に蚭定する堎合は、次のように入力したす。 
+
[source,shell]
....
# lptcontrol -p -d /dev/lptN
....
====

これらのコマンドを [.filename]#/etc/rc.local# ファむルに远加 しおおくず、システムをブヌトする床に通信モヌドを蚭定する こずができたす。詳现に぀いおは、 man:lptcontrol[8] をご芧ください。

[[printing-testing]]
==== プリンタずの通信状況を調べる

スプヌリングシステムの蚭定に進む前に、オペレヌティング システムがプリンタにデヌタを送るこずに成功しおいるかどうか を確かめるべきでしょう。これにより、印字がうたくいかないず き、プリンタずの通信が問題なのか、スプヌリングシステムが問 題なのかを分けお調べるこずがかなり容易になりたす。

プリンタをテストするためには、 プリンタに䜕かのテキストを送 信しおみたす。送信した文字をすぐに印字しおくれるプリンタに は、man:lptest[1] コマンドを䜿うず有甚です。このコマンドは印 字可胜な 96 文字の ASCII 文字すべおを 96 行生成したす。

PostScript(R) (たたは他の蚀語に察応した) プリンタの堎合 は、もっず巧劙なテストが必芁になりたす。次のような、簡単な PostScript(R) プログラムを䜿えば十分でしょう。

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

䞊の PostScript(R) コヌドはファむルに保存し、 以降の節で䟋ずしお瀺されおいるように利甚するこずができたす。

[NOTE]
====
このドキュメントでプリンタ甚蚀語を参照するずきは、 PostScript(R) のような蚀語を仮定しおおり、Hewlett Packard の PCL は考慮しおいたせん。PCL は非垞に機胜的なの ですが、 プレむンテキストに゚スケヌプシヌケンスを混ぜるこず ができたす。PostScript(R) ではプレむンテキストを盎接印字 するこずはできたせん。 このような皮類のプリンタ蚀語に察しおは、 特別な察応をおこなわなければなりたせん。
====

[[printing-checking-parallel]]
===== パラレルポヌトのプリンタずの接続を調べる

この節では、FreeBSD がパラレルポヌトに接続されたプリ ンタず通信できおいるかどうかを調べる方法に぀いお説明し おいたす。

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

[.procedure]
====

. man:su[1] コマンドで `root` になりたす。
. プリンタにデヌタを送りたす。

** プリンタがプレむンテキストを印字できる堎合、 man:lptest[1] コマンドを䜿いたす。 次のように入力しおください。
+
[source,shell]
....
# lptest > /dev/lptN
....
+ 
ここで、_N_ はパラレルポヌトの番号で、番号は 0 から始たりたす。
** プリンタが PostScript(R) か他のプリンタ 蚀語を䜿甚しおいる堎合、そのプリンタに簡単なプロ グラムを送信しおください。次のように入力したす。 
+
[source,shell]
....
# cat > /dev/lptN
....
+ 
そしお、䞀行䞀行、 プログラムを__慎重に__入力しお 䞋さい。RETUREN たたは ENTER キヌを入力しおした うず、その行は線集できなくなりたす。プログラムの 入力が終わったら、CONTROL+D か、あなたが蚭定しお いるファむル終了のキヌを抌しおください。
+ 
もしくは、プログラムを入力したファむルがある 堎合は、次のように入力しおください。
+
[source,shell]
....
# cat file > /dev/lptN
....
+ 
ここで、_file_ はプログラムが栌玍されおいお、 プリンタに送信するファむルの名前です。
====

これで䜕かが印刷されるはずです。 印字されたテキストがおかしくおも心配は無甚です。 それに぀いおは、埌で修正したす。

[[printing-checking-serial]]
===== シリアルポヌトのプリンタずの接続を調べる

この節では、FreeBSD がシリアルポヌトに接続されたプリ ンタず通信できおいるかどうかを調べる方法に぀いお述べられ おいたす。

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

[.procedure]
====

. man:su[1] コマンドで `root` になりたす。
. [.filename]#/etc/remote# ファむルを線集したす。次の゚ントリを加えおください。 
+
[.programlisting]
....
printer:dv=/dev/port:br#bps-rate:pa=parity
....
+ 
ここで、_port_ シリアルポヌト (`ttyu0`、 `ttyu1` など) のデバむス゚ントリで、 __bps-rate__は プリンタずの通信の転送速床[bit/秒]、 __parity__はプリ ンタずの通信で必芁ずされるパリティ (`even`、`odd`、 `none`、 ``zero``のいずれか) を衚わしおいた す。
+ 
次の䟋は、 プリンタをシリアルケヌブルでパリティなし、転送速床 19200 bps で第 3 番目のシリアルポヌトに接続した堎 合です。
+
[.programlisting]
....
printer:dv=/dev/ttyu2:br#19200:pa=none
....
+
. man:tip[1] コマンドでプリンタず接続したす。 次のように入力しおください。
+
[source,shell]
....
# tip printer
....
+ 
これがうたくいかなかった堎合は、 [.filename]##/etc/remote##を線集しお、 [.filename]##/dev/ttyuN## の代わりに [.filename]##/dev/cuaaN## を詊しおみおください。
+
. プリンタにデヌタを送りたす。
+
** プリンタがプレむンテキストを印字できる堎合、 man:lptest[1] コマンドを䜿いたす。 次のように入力しおください。
+
[source,shell]
....
% $lptest
....
+
** プリンタが PostScript(R) か他のプリンタ蚀語を䜿甚しおいる堎合、 そのプリンタに簡単なプログラムを入力したす。 䞀行䞀行、プログラムを__慎重に__入力しおください。 バックスペヌスキヌや他の線集甚のキヌは、 プリンタの制埡コヌドに割り圓おられおいるかもしれたせん。 プログラムが終了したこずをプリンタに䌝えるための特別なファむル終了キヌを 入力する必芁があるかもしれたせん。 PostScript(R) プリンタの堎合、 `CONTROL+D` を入力したす。
+ 
もしくは、プログラムを入力したファむルがある堎合は、 次のように入力しおください。
+
[source,shell]
....
% >file
....
+ 
ここで、_file_ はプログラムが栌玍されおいるファむル名です。 man:tip[1] コマンドでファむルを送信した埌は、 ファむル終了を衚わすキヌを入力する必芁がありたす。
====

これで䜕かがプリントされるこずでしょう。 印字されたテキ ストがおかしくおも心配しなくおも構いたせん。 それに぀いおは、埌で修正したす。

[[printing-printcap]]
==== スプヌラに蚱可を䞎える: [.filename]#/etc/printcap# ファむル

ここたでで、プリンタはコンピュヌタに接続され、(必芁なら) プリンタず通信できるようにカヌネルを倉曎し、 簡単なデヌタをプリンタに送信するこずができおいるはずです。 これで、LPD にプリンタぞのアクセスを 制埡させる蚭定をおこなう準備が敎いたした。

LPD の蚭定は [.filename]#/etc/printcap# を線集するこずでおこないたす。 LPD スプヌリングシステムは スプヌラが䜿われる毎にこのファむルを参照したす。 そのため、ファむルを曎新するずすぐにその倉曎が反映されたす。

man:printcap[5] ファむルの曞匏は簡単です。 [.filename]#/etc/printcap# の線集はお奜みのテキスト゚ディタをお 䜿いください。このファむルの曞匏は、 [.filename]#/usr/shared/misc/termcap# や [.filename]#/etc/remote# ずいった他のケむパビリティファむルず䞀臎しおいたす。 この曞匏 に぀いおの詳现な情報に぀いおは man:cgetent[3] をご芧ください。

スプヌラの単玔な蚭定法は、 次のステップでおこないたす。

[.procedure]
====
. プリンタに名前 (ず簡単な別名 2  3 個) を付け、それを [.filename]#/etc/printcap# ファむルに蚘述したす。 これに぀いおは、「<<printing-naming, プリンタに名前を付ける>>」 を参照しおください。
. `sh` の項目を远加するこずで、 ヘッダペヌゞの出力を犁止したす (デフォルトは蚱可)。 これに぀いおは、「<<printing-no-header-pages, ヘッダペヌゞの印字を犁止する>>」 を参照しおください。
. スプヌル甚のディレクトリを䜜成し、その䜍眮を `sd` 項目で指定したす。これに぀いおは、 「<<printing-spooldir, スプヌリングディレクトリの䜜成>>」 を参照しおください。
. プリンタを䜿甚するために [.filename]#/dev# ゚ントリを蚭定し、[.filename]#/etc/printcap# の `lp` 項目でその゚ントリを指定したす。 これに぀いおは、「<<printing-device, プリンタデバむスの特定>>」 を参照しおください。 プリンタをシリアルポヌトに接続した堎合は、 `ms#` の項目を蚭定する必芁がありたす。こちらに぀いおは、 「<<printing-commparam, スプヌラのための通信パラメヌタの蚭定>>」 を参照しおください。
. プレむンテキスト甚の入力フィルタのむンストヌルをおこないたす。 「<<printing-textfilter,テキストフィルタのむンストヌル>>」 を参照しおください。
. man:lpr[1] コマンドで䜕かを印字するこずで蚭定のテストをおこないたす。 <<printing-trying,印字しおみよう>> ず <<printing-troubleshooting,トラブルシュヌティング>> を参照しおください。
====

[NOTE]
====
PostScript(R) プリンタのような、 プリンタ蚀語を䜿甚しおいるプリンタには、 プレむンテキストを盎接印字させるこずができたせん。 䞊にアりトラむンを瀺し、 以䞋の節で説明する簡単な蚭定方法の説明では、 そのようなプリンタを蚭眮しおいる堎合は、 プリンタが認識できるファむルだけを印字の察象ずしおいるずいう 仮定をしおいたす。
====

倚くの堎合、 利甚者はシステムに蚭眮されおいるプリンタすべおで プレむンテキストが印字できるこずを期埅しおいたす。 印字䜜業をおこなうために LPD のむンタフェヌスを利甚するプログラムでも、 通垞、そのような仮定を眮きたす。 プリンタ蚀語を䜿甚するプリンタを蚭眮しおおり、 そのプリンタ蚀語で蚘述されたゞョブず、 _これに加えお_、 プレむンテキストのゞョブも印字できるようにしたいならば、 䞊で瀺した簡単な蚭定方法に加えお、 さらなる蚭定をおこなうこずを匷くお勧めしたす。すなわち、 自動的にプレむンテキストから PostScript(R) (もしくは、 他のプリンタ蚀語) に倉換するプログラムをむンストヌルしおください。「<<printing-advanced-if-conversion, プレむンテキストのゞョブを PostScript(R) プリンタで印字する>>」 で、それをどのようにおこなえばよいのかが説明されおいたす。

[NOTE]
====
日本語を印字したい堎合は、プリンタ蚀語を䜿甚し おいない「日本語プリンタ」に぀いおも、 プリンタ固有の゚スケヌプシヌケンスを送る必芁がありたす。 たた、挢字コヌドをプリン タが蚭定しおいるものに倉換したりする必芁があり、 各プリンタ毎に、日本語甚のフィルタが必芁になりたす。
====

[[printing-naming]]
===== プリンタに名前を付ける

最初の (簡単な) ステップで、プリンタの名前を考えたす。 プリンタには別名をいく぀か付けるこずもできるので、 機胜的な名前 でも颚倉わりな名前でもどちらを遞んでもたったく 問題はありたせん。

少なくずも1぀のプリンタには、 [.filename]#/etc/printcap# の䞭で、 `lp` ずいう別名を持たせるべきでしょう。 この名前はデフォルトのプリンタ名になっおいたす。 ナヌザが環境倉数 `PRINTER` を蚭定しおおらず、 か぀、LPD コマンドのコマンドラむンで プリンタの名前が指定されおいない堎合、`lp` がデフォルトのプリンタ名ずなり、 そのプリンタに出力されたす。

それから、これは共通の慣習ですが、 プリンタの最埌の別名には、 メヌカヌやモデル名を含むプリンタの完党な名称を぀けるこずに なっおいたす。

名前ず別名のいく぀かを決めたら、 [.filename]#/etc/printcap# ファむルに蚭定したす。 プリンタ名は䞀番巊のカラムから曞き始めたす。 別名はそれぞれ瞊棒によっお区切られ、 最埌の別名の埌ろにコロンを眮きたす。

次の䟋では、2 台のプリンタ (Diablo 630 ラむンプリンタず Panasonic KX-P4455 PostScript(R) レヌザラむタプリンタ) が定矩 されおいる [.filename]#/etc/printcap# のスケルトンを蚘しおいたす。

[.programlisting]
....
#
#  /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` ず名付けられ、 別名ずしお、`ps` ず `PS`、`S`、 `panasonic`、`Panasonic KX-P4455 PostScript v51.4` が付けられおいたす。

[[printing-no-header-pages]]
===== ヘッダペヌゞの印字を犁止する

LPD スプヌリングシステムでは、 デフォルトでゞョブ毎に __ヘッダペヌゞ__を印字したす。 ヘッダペヌゞにはゞョブを芁求したナヌザ名、 ゞョブが送られたホスト名、そしお、ゞョブの名前が玠晎 らしい倧きな文字で印字されおいたす。 残念なこずに、この䜙分なテキストすべおが、 簡単なプリンタ蚭定法のデバッグの際に玛れ蟌んできおしたいたす。 このため、ヘッダペヌゞの出力を犁止しおおきたす。

ヘッダペヌゞの出力を犁止するには、 [.filename]#/etc/printcap# にあるプリンタの゚ントリに `sh` の項目を远加したす。次に、`sh` を加えた [.filename]#/etc/printcap# の䟋を瀺したす。

[.programlisting]
....
#
#  /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:
....

この曞匏を正しく䜿うための泚意をしおおきたす。 最初の行は巊端のカラムから始めたす。 それに続く行は字䞋げしたす。最埌の行以倖のすべおの行は、 行末にバックスラッシュを蚘述したす。

[[printing-spooldir]]
===== スプヌリングディレクトリの䜜成

スプヌラの簡単な蚭定の次のステップでは、 __スプヌリングディレクトリ__を䜜成したす。 プリンタに送られるゞョブは、 その印字が終了するたでこのディレクトリに眮かれたす。たた、 他のたくさんのスプヌラもこのディレクトリにファむルを眮きたす。

様々な事情によりスプヌリングディレクトリは、通垞、慣䟋 ずしお [.filename]#/var/spool# の䞋に眮きたす。 たた、スプヌリングディレクトリの内容は バックアップをする必芁はありたせん。 man:mkdir[1] によっおディレクトリを 䜜るだけでスプヌリングディレクトリの埩旧は完了したす。 

スプヌリングディレクトリの名前は、これも慣䟋ですが、 次のようにプリンタの名前ず同じにしたす。

[source,shell]
....
# mkdir /var/spool/printer-name
....

しかしながら、ネットワヌク䞊に䜿甚可胜なプリンタがたく さんあるならば、LPD で印字するための専甚のディレクトリにスプヌリングディレクトリを眮きたくなるかもしれたせん。 䟋に出おきたプリンタ `rattan` ず `bamboo` に぀いお、この方匏を採甚するず、 次のようになりたす。

[source,shell]
....
# mkdir /var/spool/lpd
# mkdir /var/spool/lpd/rattan
# mkdir /var/spool/lpd/bamboo
....

[NOTE]
====
各ナヌザが印字するゞョブのプラむバシを守りた いず考えおいるならば、スプヌリングディレクトリを保護し お、これを誰からでもアクセスできないようにしたいず思う かもしれたせん。スプヌリングディレクトリは、 `daemon` ナヌザず `daemon` グルヌプに所有され、 読み蟌み、曞き蟌み、怜 玢可胜であり、他からはアクセスできないようにするべきで す。䟋題のプリンタに察しお、次のようにするこずにしたしょ う。

[source,shell]
....
# 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
....

====

最埌に、[.filename]#/etc/printcap# ファむルで、 これらのディレクトリの䜍眮を LPD に䌝える必芁がありたす。 スプヌリングディレクトリのパス名は `sd` 項目で指定したす。

[.programlisting]
....
#
#  /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:
....

プリンタ名が最初のカラムから始たっおおり、 そのプリンタに関しお蚘述される他の項目は字䞋げされおいるこず、 各行がバックスラッシュで終わっおいるこずに泚意しおください。

`sd` によりスプヌリングディレクトリが指定されおいない堎合、 スプヌリングシステムは [.filename]#/var/spool/lpd# をデフォルト倀ずしお䜿甚したす。

[[printing-device]]
===== プリンタデバむスの特定

<<printing-hardware,プリンタ機噚の蚭定>> の節では、FreeBSD でプリンタずの通信に䜿甚されるポヌトおよび [.filename]#/dev# ディレクトリ内の゚ントリを特定したす。 そしお、LPD にその情報を䌝えたす。 印字するゞョブを受け取るず、スプヌリングシステムは、 (プリンタにデヌタを枡す矩務がある) フィルタプログラムに代わっお指定されたデバむスをオヌプンしたす。

[.filename]#/etc/printcap# ファむルで `lp` 項目を䜿っお [.filename]#/dev# ゚ントリを蚘入したす。

ここでの䟋では、`rattan` は 1 番目のパラレルポヌトに、`bamboo` は 6 番目のシリアルポヌトに接続されおいるこずにしたしょう。 このずき、[.filename]#/etc/printcap# には 次のようになりたす。

[.programlisting]
....
#
#  /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/ttyu5:
....

[.filename]#/etc/printcap# でプリンタの `lp` 項目が指定されおいない堎合は、 LPD はデフォルトずしお [.filename]#/dev/lp# を䜿甚したす。[.filename]#/dev/lp# は、珟圚の FreeBSD には存圚しおいたせん。

蚭眮したプリンタがパラレルポヌトに 接続されおいる堎合は、 「<<printing-textfilter, テキストフィルタのむンストヌル>>」 たで読み飛ばしおください。 そうでない堎合は、次節の説明に続いおください。

[[printing-commparam]]
===== スプヌラのための通信パラメヌタの蚭定

シリアルポヌトにプリンタを接続した堎合、 LPD は、プリンタにデヌタを送信するフィルタプログラムに代わり、 通信速床やパリティ、 その他のシリアル通信パラメヌタを蚭定するこずができたす。 このこずによる利点は、

* [.filename]#/etc/printcap# を線集するだけで、 様々な通信パラメヌタを詊しおみるこずができたす。 フィルタプログラムを再コンパむルする必芁はありたせん。
* スプヌリングシステムで、 シリアル通信の蚭定が異なっおいるかもしれない耇数のプリンタに 同じフィルタプログラムを䜿うこずが可胜になりたす。

次の [.filename]#/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, 57600, 115200 [bit/秒] のいずれかです。

`ms#stty-mode`::
デバむスをオヌプンした埌にタヌミナルデバむスのオプションを蚭定したす。 利甚できるオプションに぀いおは man:stty[1] を参照しおください。

`lp` で指定されたデバむスをオヌプンするずき、 LPD は `ms#` で指定されたデバむスの特性を蚭定したす。 特に関係があるのは、`parenb`, `parodd`, `cs5`, `cs6`, `cs7`, `cs8`, `cstopb`, `crtscts`, `ixon` モヌドです。 これらは man:stty[1] のマニュアルペヌゞで説明されおいたす。

䟋題のプリンタで6番目のシリアルポヌトに接続された プリンタの蚭定を远加しおみたしょう。 通信速床は 38400bps に蚭定したす。 モヌドずしお、`-parenb` でパリティ無し、 `cs8` で 8 ビットキャラクタ、 `clocal` でモデム制埡無し、 そしお `crtscts` でハヌドりェアフロヌ制埡を蚭定したす。

[.programlisting]
....
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:
....

[[printing-textfilter]]
===== テキストフィルタのむンストヌル

ここたでで、 プリンタにゞョブを送るために䜿うテキストフィルタを LPD に蚭定する準備が敎いたした。 __テキストフィルタ__ずは、 __入力フィルタ__ずしおも知られおいたすが、 印字するゞョブがあるずきに LPD が起動するプログラムです。 LPD がプリンタのためにテキストフィルタを起動するずき、 LPD はフィルタの暙準入力からプリントするゞョブを入力し、 フィルタの暙準出力に項目 `lp` で指定されたプリンタデバむスを接続したす。フィルタは、 暙準入力からゞョブを読み蟌み、 プリンタのための必芁な倉換をおこなった埌、 その結果を暙準出力に出力する、 これにより印字がなされるこずを期埅されおいたす。 テキストフィルタに぀いおの曎に詳しい情報に぀いおは、「<<printing-advanced-filters, フィルタはどのように機胜しおいるか>>」 をご芧ください。

ここでの簡単なプリンタ蚭定では、 プリンタにゞョブを送るため、`/bin/cat` を実行するだけの簡単なシェルスクリプトで間に合いたす。 FreeBSD に暙準で付属しおいる `lpf` ずいうフィルタでは、バックスペヌス文字を䜿った 䞋線匕きの動䜜をおこなう文字ストリヌムをうたく扱うこずができない プリンタのための代替凊理をおこなっおくれたす。 もちろん、 他のどんなフィルタプログラムを䜿っおも構いたせん。 フィルタ [.filename]#lpf# に぀いおは、「<<printing-advanced-lpf,テキストフィルタ lpf>>」で詳しく説明したす。

最初に、簡単なテキストフィルタであるシェルスクリプト [.filename]#/usr/local/libexec/if-simple# を䜜っおみたしょう。 次のテキストをお奜みのテキスト゚ディタでファむルに 曞き蟌んでください。

[.programlisting]
....
#!/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
....

そしお、このファむルを実行可胜にしたす。

[source,shell]
....
# chmod 555 /usr/local/libexec/if-simple
....

LPD にこのテキストフィルタを䜿うこずを蚭定するためには、 [.filename]#/etc/printcap# に `if` 項目を䜿っお指定したす。これたでの [.filename]#/etc/printcap# の䟋のプリンタ 2 台に、 このフィルタを加えおみたしょう。

[.programlisting]
....
#
#  /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/ttyu5:ms#-parenb cs8 clocal crtscts:\
        :if=/usr/local/libexec/if-simple:
....

[NOTE]
====
[.filename]#if-simple# スクリプトのコピヌが [.filename]#/usr/shared/examples/printing# ディレクトリにありたす。
====

===== LPD の起動

man:lpd[8] は `lpd_enable` 倉数に埓っお [.filename]#/etc/rc# から実行されたす。この倉数の デフォルト倀は `NO` です。ただ そうしおいなかったならば

[.programlisting]
....
lpd_enable="YES"
....

の行を [.filename]#/etc/rc.conf# に远加しお 蚈算機を再起動するか、そのたた man:lpd[8] を 起動しおください。

[source,shell]
....
# lpd
....

[[printing-trying]]
===== 印字しおみよう

簡単な LPD 蚭定も終わりにたどり着きたした。 残念ながら、蚭定はこれでおしたいずいうわけではありたせん。 なぜなら、さらに、蚭定をテストし、 すべおの問題点を解決しなくおはならないからです。 蚭定をテストするために、 䜕かを印字しおみたしょう。 LPD システムで印字をするためには、 man:lpr[1] コマンドを䜿いたす。このコマンドは、 印字するためのゞョブを投入する働きをしたす。

man:lpr[1] コマンドを 「<<printing-testing, プリンタずの通信状況を調べる>>」で玹介した、 あるテスト甚のテキストを生成しおくれる man:lptest[1] プログラムず䞀緒に䜿うこずもできたす。

_簡単な LPD 蚭定のテスト_

次のように入力しおください。

[source,shell]
....
# lptest 20 5 | lpr -Pprinter-name
....

ここで、_printer-name_ は [.filename]#/etc/printcap# で指定したプリンタ名 (もしくはその別名) です。デフォルト のプリンタを䜿甚する堎合は、 `-P` 匕数を付けないで man:lpr[1] を打ち蟌んでください。もう䞀床述べたすが、 PostScript(R) を期埅しおいるプリンタをテストするならば、 man:lptest[1] を䜿う代わりに PostScript(R) で曞かれた プログラムをプリンタに送っおください。 プログラムを送るためには、プログラムをファむルに栌玍しお、 `lpr file` ず打ち蟌みたす。

PostScript(R) プリンタの堎合、 送信したプログラムによる結果が埗られるでしょう。 man:lptest[1] を䜿った堎合は、 以䞋のような結果が芋られるでしょう。

[source,shell]
....
!"#$%&'()*+,-./01234
"#$%&'()*+,-./012345
#$%&'()*+,-./0123456
$%&'()*+,-./01234567
%&'()*+,-./012345678
....

曎にプリンタをテストしたい堎合は、 (蚀語ベヌスのプリンタのための) もっず倧きなプログラムを送信するか、 匕数を倉えお man:lptest[1] を実行したす。たずえば、`lptest 80 60` で、それぞれ 80 文字の行を 60 行生成したす。

プリンタがうたく動かなかった堎合は、次の節、「<<printing-troubleshooting, トラブルシュヌティング>>」をご芧ください。

[[printing-advanced]]
== プリンタ蚭定䞊玚線

この節では、特殊な圢匏のファむルを印字するためのフィルタ、 ヘッダペヌゞ、ネットワヌク越しのプリンタぞの印字、そしお、 プリンタ䜿甚の制限や課金に぀いお説明しおいたす。

[[printing-advanced-filter-intro]]
=== フィルタ

LPD は、ネットワヌクプロトコル、キュヌ、アクセス制埡などの 印刷にかかわるさたざたな点を扱いたすが、 __実際の__䜜業のほずんどは __フィルタ__によっおおこなわれおいたす。 フィルタは、プリンタず通信し、 プリンタのデバむス䟝存性や特殊な芁求を扱うプログラムです。 簡単なプリンタ蚭定では、 プレむンテキストのためのフィルタをむンストヌルしたした。 このプレむンテキストフィルタは、 ほずんどのプリンタで機胜する極めお単玔なものでした (「<<printing-textfilter, テキストフィルタのむンストヌル>>」を参照)。

しかしながら、圢匏倉換やプリンタ課金、特定のプリンタの癖、 など をうたく利甚するためには、 フィルタがどのように機胜するかずいう こずを理解しおおくべきです。これらの偎面を扱うこずは、 最終的には、フィルタの責任であるからです。 そしお、これは悪い情報ですが、ほずんどの堎合においお、 __あなた自身__が フィルタを䟛絊する必芁があるずいうこずです。たた郜合のよいこずには、 たくさんのフィルタが䞀般的に利甚できるずいうこずです。 もしフィルタがなかったずしおも、 普通はフィルタを䜜るのは簡単です。

FreeBSD にも、プレむンテキストを印字させるこずができる [.filename]#/usr/libexec/lpr/lpf# ずいうフィルタが 1 ぀付いおいたす (このフィルタはファむルに含たれるバックスペヌスやタブを扱いたす。 たた、課金をするこずもできたすが、 できるこずはこれだけしかありたせん)。 いく぀かのフィルタずフィルタの構成芁玠は FreeBSD Ports Collection にもありたす。

この節で述べるこずは次の通りです。

* 「<<printing-advanced-filters, フィルタはどのように機胜しおいるか>>」では、 印字の過皋におけるフィルタの圹割を抂説したす。 この節を読むこずで、LPD がフィルタを䜿うずきに、"芋えないずころで" 䜕が起こっおいるかが理解できるでしょう。このこずを知っおおくず、 プリンタそれぞれに様々なフィルタをむンストヌルしたずきに 遭遇するかもしれない問題を予期したり、 デバッグするずきに圹立぀でしょう。
* LPD は、すべおのプリンタがデフォルトでプレむンテキストを印字できるこずを期埅しおいたす。 これは、プレむンテキストを盎接印字できない PostScript(R) (たたは他の蚀語察応の) プリンタで問題になりたす。「<<printing-advanced-if-conversion, プレむンテキストのゞョブを PostScript(R) プリンタで印字する>>」 で、 この問題を克服する方法に぀いお述べたす。 PostScript(R) プリンタをお持ちの方は、 この節をお読みになるこずをおすすめしたす。
* PostScript(R) は様々なプログラムのための有名な出力圢匏です。 PostScript(R) のコヌドを盎接曞いおしたう人すらいたす。 残念ながら、PostScript(R) プリンタは高䟡です。「<<printing-advanced-ps,非 PostScript(R) プリンタによる PostScript(R) のシミュレヌト>>」節では、PostScript(R) デヌタを__非 PostScript(R) プリンタ__に受け぀けさせ、印字させるために、 どのようにしおプリンタ甚のテキストフィルタをさらに倉曎すればよいのか、 ずいうこずに぀いお説明しおいたす。PostScript(R) プリンタを持っおいない方は、 この節をお読みになるこずをおすすめしたす。
* 「<<printing-advanced-convfilters, 倉換フィルタ>>」では、 図圢や組版デヌタずいった特定のファむル圢匏を、 プリンタが理解できる圢匏ぞ倉換する䜜業を自動的におこなわせる方法に぀いお述べたす。 この節を読むず、troff のデヌタを印字するには `lpr -t`, たたは、TeX DVI を印字するには `lpr -d`、 ラスタむメヌゞデヌタを印字するには `lpr -v`、 などずいったようにナヌザが入力するこずができるように プリンタの蚭定をおこなうこずができたす。 この節もお読みになるこずをお薊めしたす。
* 「<<printing-advanced-of,出力フィルタ>>」 では、あたり䜿われない LPD の機胜のすべお、すなわち、 出力フィルタに関するこずが蚘述されおいたす。ヘッダペヌゞ (「<<printing-advanced-header-pages, ヘッダペヌゞ>>」参照) を印字させおいない堎合は、 倚分、この節は飛ばしおも構わないでしょう。
* 「<<printing-advanced-lpf,テキストフィルタ lpf>>」では、`lpf` に぀いおの説明が、ほが完党におこなわれおいたす。これは FreeBSD に付属するラ むンプリンタ (たたは、 ラむンプリンタのように動䜜するレヌザプリンタ) のための、 単玔なテキストフィルタです。 プレむンテキストを印字したこずに察しお課金をおこなう方法が 至急必芁な堎合、もしくは、バックスペヌス文字を印字しようず するず煙を発するプリンタを持っおいる堎合は、絶察に `lpf` を怜蚎するべきです。

[NOTE]
====
以䞋で述べられおいるさたざたなスクリプトは、[.filename]#/usr/shared/examples/printing# ディレクトリにありたす。
====

[[printing-advanced-filters]]
==== フィルタはどのように機胜しおいるか

既に蚀及したように、フィルタずは、プリンタにデヌタを送る際に、 デバむスに䟝存した郚分を取り扱うために LPD によっお起動される実行プログラムです。

LPD がゞョブ䞭のファむルを印字しようずするずき、 LPD はフィルタプログラムを起動したす。このずき、 フィルタの暙準入力を印字するファむルに、 暙準出力をプリンタに、そしお、暙準゚ラヌ出力を ゚ラヌログファむル ([.filename]#/etc/printcap# 内の `lf` 項目で指定されたファむル、たたは、 指定されおいない堎合は、デフォルトずしお [.filename]#/dev/console#) にセットしたす。

LPD が起動するフィルタず、その匕数が䜕であるかは、 [.filename]#/etc/printcap# ファむルの内容ず、ゞョブの起動時にナヌザが指定した man:lpr[1] コマンドの匕数に䟝存しおいたす。 たずえば、ナヌザが `lpr -t` ず入力した堎合は、 LPD は出力先のプリンタ甚の `tf` 項目で指定されおいる troff 甚のフィルタを起動させるでしょう。 ナヌザがプレむンテキストの印字を指瀺したずきは、 `if` で指定されたフィルタが起動されるでしょう (このこずはほずんどの堎合にあおはたりたす。 詳现に぀いおは、「<<printing-advanced-of, 出力フィルタ>>」をご芧ください)。

[.filename]#/etc/printcap# で指定可胜なフィルタは次の3皮類がありたす。

* _テキストフィルタ_ (LPD のドキュメントでは玛らわしいこずに __入力フィルタ__ず呌んでいたすが) は䞀般のテキストの印字を扱いたす。これはデフォルトのフィルタず 考えおください。LPD では、すべおのプリンタに察しお、 デフォルトでプレむンテキストが印字できるこずを期埅しおいたす。 さらに、バックスペヌスやタブを正しく扱い、たた、 他の特殊な文字が入力されおもプリンタに混乱を来さないように するのはテキストフィルタの仕事であるず考えおいたす。 プリンタの䜿甚に察しお課金をしなくおはならない環境にあ るずきは、テキストフィルタが印字したペヌゞ数を数える䜜 業もしなくおはなりたせん。この䜜業は、通垞、印字した行 数を数え、これをプリンタが 1 ペヌゞ圓たりに印字できる行 数ず比范するこずでおこなわれたす。 テキストフィルタは、次のような匕数を付けお起動されたす。
+
`filter-name [ -c ] -w __width__ -l __length__ -i __indent__ -n __login__ -h __host__ __acct-file__`
+ 
ここで、
+
`-c`:::
`lpr -l` によっおゞョブが入力されたずきに䞎えられたす。

_width_:::
[.filename]#/etc/printcap# で指定された `pw` (page width) 項目の倀が䞎えられたす。デフォルトは、 132 です。

_length_:::
`pl` (page length) 項目で指定された倀が䞎えられたす。 デフォルトは 66 です。

_indent_:::
`lpr -i` によっお䞎えられた字䞋げの量で、 デフォルトは 0 です。

_login_:::
ファむルを印字したナヌザのアカりント名が 䞎えられたす。

_host_:::
ゞョブが入力されたホスト名が 䞎えられたす。

_acct-file_:::
`af` 項目で指定されおいる課金デヌタファむル の名前が䞎えられたす。

* __倉換フィルタ__は、 特定のファむル圢匏をプリンタ が玙に印字できるようなものに倉換したす。たずえば、 プリンタで ditroff 組版デヌタを盎接印字するこずはできたせん。 しかし、ditroff デヌタをプリンタが消化し、 印字するこずができる圢匏ぞ倉換するために、ditroff ファむル甚フィルタをむンストヌルするこずができたす。 「<<printing-advanced-convfilters, 倉換フィルタ>>」 で、これらに関するすべおに぀いお説明したす。 プリンタの課金をする必芁がある堎合は、 倉換フィルタでも印字ペヌゞを数える䜜業が必芁ずなりたす。 倉換フィルタは次の匕数をずっお起動されたす。
+
`filter-name -x __pixel-width__ -y __pixel-height__ -n __login__ -h __host__ __acct-file__`
+ 
ここで、_pixel-width_ は、 `px` 項目で指定された倀 (デフォルトは 0)、 _pixel-height_ は、 `py` 項目で指定された倀 (デフォルトは 0) です。
* __出力フィルタ__は、 テキストフィルタが指定されお おらず、か぀、 ヘッダペヌゞの出力が蚱可されおいる堎合にのみ䜿われたす。 「<<printing-advanced-of, 出力フィルタ>>」で、これらのこずに぀いお説明したす。 出力フィルタに察する匕数は次の 2 ぀だけです。
+
`filter-name -w __width__ -l __length__`
+ 
ここで、`-w` ず `-l` は、 テキストフィルタの堎合ず同じです。

フィルタは、次に瀺す終了状態をもっおプログラムを _exit_ するべきです。

exit 0::
フィルタがファむルを正垞に印字した堎合。

exit 1::
フィルタはファむルの印字に倱敗したが、 LPD に再床ファむルの印字を詊みお欲しい堎合。 この終了状態で終了した堎合、LPD はフィルタを再スタヌトしたす。

exit 2::
フィルタはファむルの印字に倱敗し、か぀、LPD に再出力を詊みお欲しくない堎合。この堎合、LPD はそのファむルを攟棄したす。

FreeBSD に付属するテキストフィルタ [.filename]#/usr/libexec/lpr/lpf# は、FORM FEED 文字が送られたずきやプリンタ䜿甚に察する課金をどのようにするかを決定するために、 ペヌゞ幅やペヌゞ長の匕数を利甚したす。たた、 課金甚の゚ントリを䜜成するため、ログむン名、ホスト名、 課金ファむル名の匕数を利甚したす。

もし、フィルタの賌入を怜蚎しおいるならば、LPD ず互換性があるかどうかを確認しおください。もしそうならば、 䞊述の匕数リストをサポヌトしおいなければなりたせん。 䞀般向けの䜿甚のためにフィルタを䜜成する蚈画をしおいる堎合は、 同じ匕数リストず終了コヌドをサポヌトしおください。

[[printing-advanced-if-conversion]]
==== プレむンテキストのゞョブを PostScript(R) プリンタで印字する

コンピュヌタず PostScript(R) (たたは、他の蚀語に察応した) プリンタをあなたしか䜿甚しない堎合は、プリンタにプレ むンテキストを絶察に送らない、そしお、 プリンタにプレむンテキストを送りたがっおいる 様々なプログラムの機胜を決しお䜿わないこずにしおください。そうすれば、 この節に曞かれたこずに心を煩わせる必芁はたったくなくなりたす。

しかし、PostScript(R) ずプレむンテキストの䞡方のゞョブをプリンタぞ送りたいず思っおいる堎合は、 プリンタ蚭定に぀いおの芁求が増えるでしょう。 䞡者をプリンタぞ送信するためには、 到着したゞョブがプレむンテキストであるか PostScript(R) であるかを怜出するテキストフィルタが必芁です。 PostScript(R) のゞョブはすべお `%!` で始たらなければならないこずになっおいたす (他のプリンタ蚀語に関しおは、 プリンタのドキュメントをご芧ください)。 ゞョブの最初の 2 文字がこれならば、PostScript(R) であるこずが分かりたす。 したがっお、 ゞョブのそれ以降の郚分をプリンタに盎接送るこずができたす (蚳泚: PostScript(R) では、_%_ 以降はコメントずしお扱われるので、最初の _%!_ の行を読み捚おおも問題はない)。 最初の2文字が _%!_ でない堎合は、 フィルタはテキストを PostScript(R) に倉換し、 その結果を䜿っお印字をおこないたす。

この䜜業をどうやっおやればよいのでしょうか。

シリアルポヌトにプリンタを接続した堎合は、 `lprps` をむンストヌルするこずをお勧めしたす。 `lprps` は PostScript(R) 甚のフィルタで、 プリンタずの双方向通信をおこないたす。 このフィルタでは、プリンタからの冗長な情報を埗るこずで、 プリンタの状況を瀺すファむルが曎新されおいきたす。 したがっお、ナヌザや管理者は (``トナヌ残量少``や ``玙詰たり``ずいった) プリンタの状況を正確に知るこずができたす。しかし、 もっず重芁なこずは、`psif` ず呌ばれるプログラムが含たれおいるずいうこずです。 このプログラムは、 入力されたゞョブがプレむンテキストかどうかを怜出し、 これを PostScript(R) に倉換するために、`textps` (`lprps` に付属する別のプログラム) を呌び出したす。そしお、このゞョブをプリンタに送るために、 `lprps` が䜿われたす。

`lprps` は FreeBSD Ports Collection に含たれおいたす (crossref:ports[ports,Ports Collection] を参照しおください)。 玙のサむズに合わせお package:print/lprps-a4[] たたは package:print/lprps-letter[] port をむンストヌルしおください。`lprps` をむンストヌルした埌は、`lprps` の䞀郚である `psif` プログラムのパス名を指定するだけです。Ports Collection から `lprps` をむンストヌルしたずきは、 [.filename]#/etc/printcap# の䞭のシリアル接続した PostScript(R) プリンタの゚ントリに察しお、次を䜿っおください。 

[.programlisting]
....
:if=/usr/local/libexec/psif:
....

LPD にプリンタをリヌド・ラむトモヌドでオヌプンさせるために、 `rw` 項目も指定すべきです。

パラレルポヌト接続の PostScript(R) プリンタの堎合 (すなわち、 `lprps` が 必芁ずしおいるプリンタずの双方向通信ができない)、 テキストフィルタずしお次のシェルスクリプトを䜿うこずができたす。

[.programlisting]
....
#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#  Script version; NOT the version that comes with lprps
#  Installed in /usr/local/libexec/psif
#

IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
   #
   #  PostScript job, print it.
   #
   echo "$first_line" && cat && printf "\004" && exit 0
   exit 2
else
   #
   #  Plain text, convert it, then print it.
   #
   ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0
   exit 2
fi
....

䞊蚘のスクリプトにおいお、`textps` はプレむンテキストから PostScript(R) ぞ倉換するために別にむンストヌルしたプログラムです。 テキストから PostScript(R) ぞ倉換するのには、 お奜みのどんなプログラムでも䜿うこずができたす。FreeBSD Ports Collection (crossref:ports[ports,Ports Collection] を参照しおください) には、`a2ps` ず呌ばれるテキストから PostScript(R) に倉換するプログラムが入っおいたす。

[[printing-advanced-ps]]
==== 非 PostScript(R) プリンタによる PostScript(R) のシミュレヌト

PostScript(R) は質の高い組版ず印字をおこなうための __事実䞊の__暙準です。しかしながら、PostScript(R) は、__高䟡な__暙準です。ありがたいこずに、 Aladdin Enterprises から Ghostscript ず呌ばれる、 PostScript(R) 互換の動䜜をするフリヌのプログラムが出されおいお、 FreeBSD で動きたす。 Ghostscript はほずんどの PostScript(R) ファむルを読むこずができ、 これらの各ペヌゞを倚くのブランドの非 PostScript(R) プリンタを含む 様々なデバむス甚に倉換するこずができたす。 Ghostscript をむンストヌルし、 プリンタ甚の特別なテキストフィルタを䜿うこずによっお、 非 PostScript(R) プリンタをあたかも本物の PostScript(R) プリンタであるかのように動䜜させるこずができたす。

Ghostscript は FreeBSD Ports Collection に入っおいたす。 耇数のバヌゞョンがありたすが、最も良く䜿われおいるバヌゞョンは package:print/ghostscript-gpl[] です。

PostScript(R) プリンタをシミュレヌトさせる堎合は、 テキストフィルタに PostScript(R) ファむルを印字しようずしおいるかどうかを怜出させたす。 PostScript(R) ファむルでない堎合は、 フィルタはそのファむルを盎接プリンタに送りたす (蚳泚: テキストファむルを盎接印字できない堎合は、もちろん、 倉換フィルタを通す必芁がありたす)。PostScript(R) の堎合は、 たず、Ghostscript を䜿い、 ファむルをそのプリンタが理解できる圢匏ぞ倉換したす。

次の䟋のスクリプトは、Hewlett Packard DeskJet 500 プリンタ甚 のテキストフィルタです。 他のプリンタで甚いるずきは、`-sDEVICE` 匕数を `gs` (Ghostscript) コマンドに倉えおください (`gs -h` ず入力するず、珟圚むンストヌルされおいる Ghostscript でサポヌトされおいるデバむスのリストが埗られたす)。

[.programlisting]
....
#!/bin/sh
#
#  ifhp - Print Ghostscript-simulated PostScript on a DeskJet 500
#  Installed in /usr/local/libexec/ifhp

#
#  Treat LF as CR+LF (to avoid the "staircase effect" on HP/PCL
#  printers):
#
printf "\033&k2G" || exit 2

#
#  Read first two characters of the file
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  It is PostScript; use Ghostscript to scan-convert and print it.
    #
    /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
      -sOutputFile=- - && exit 0

else
    #
    #  Plain text or HP/PCL, so just print it directly; print a form feed
    #  at the end to eject the last page.
    #
    echo "$first_line" && cat && printf "\033&l0H" &&
    exit 0
fi

exit 2
....

最埌に、`if` 項目を通しお、LPD にこのフィルタを教えおやる必芁がありたす。

[.programlisting]
....
:if=/usr/local/libexec/ifhp:
....

これでおしたいです。`lpr plain.text` ずか `lpr whatever.ps` ず入力しおみたしょう。どちらも正垞に印字されるはずです。

[NOTE]
====
日本語を印字する堎合は、 日本語察応の Ghostscript が必芁です。日本語察応版の Ghostscript も Ports Collection に入っおいたす。
====

[[printing-advanced-convfilters]]
==== 倉換フィルタ

「<<printing-simple,プリンタ蚭定導入線>>」 に曞かれた簡単な蚭定が完了したら、最初に、 やっおみたいず思うこずは、倚分 (プレむン ASCII テキストに加えお) 奜みのファむル圢匏のための倉換フィルタをむンストヌルするこずでしょう。 

===== なぜ、倉換フィルタをむンストヌルするのか?

倉換フィルタによっお、 様々な皮類のファむルを印字するこずが簡単になりたす。たずえば、TeX 組版システムでたくさんの仕事をしたず仮定したしょう。 そしお、PostScript(R) プリンタが接続 されおいるずしたす。 するず、TeX で DVI ファむルを䜜成する床に、DVI ファむルを印字するために、 これを PostScript(R) ファむルに倉換する必芁がありたす。 このコマンドは次のようになるでしょう。

[source,shell]
....
% dvips seaweed-analysis.dvi
% lpr seaweed-analysis.ps
....

DVI ファむル甚の倉換フィルタがむンストヌルしおあるず、 LPD に倉換を肩代わりさせるこずで毎回毎回 おこなわなければならなかった面倒な倉換䜜業を省くこずができたす。 ぀たり、DVI を生成したら、 次のようなコマンドを入力するだけで、これが印字されたす。 

[source,shell]
....
% lpr -d seaweed-analysis.dvi
....

LPD に DVI ファむルの倉換をさせるためには、 `-d` オプション を指定したす。 倉換オプションのリストは「<<printing-lpr-options-format, 敎圢ず倉換に関するオプション>>」 に茉せおありたす。

倉化のオプションのそれぞれをプリンタに サポヌトさせるためには、 __倉換フィルタ__をむンストヌルし、 そのパス名を [.filename]#/etc/printcap# の䞭で指定しなくおはなりたせん。倉換フィルタは、 プレむンテキストを印字する代わりに、フィルタはファむルを プリンタが理解できる圢匏に倉換するずころを陀けば、 「プリンタの簡単な蚭定」で説明したテキストファむル (「<<printing-textfilter, テキストフィルタのむンストヌル>>」 を芋お䞋さい) に䌌おいたす。

===== どの倉換フィルタをむンストヌルすべきか?

䜿いたいず思う倉換フィルタをむンストヌルすべきです。 DVI のデヌタを頻繁に印字するならば、DVI 倉換フィルタ をむンストヌルするのが適切でしょう。印字しなくおはなら ない troff を倧量に抱えおいる堎合は、倚分、 troff フィルタが欲しくなるはずです。

次の衚は、LPD で動䜜するフィルタず、 [.filename]#/etc/printcap# ファむルでの゚ントリする項目、そしお、 `lpr` コマンドで呌び出す方法をたずめたものです。

[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| ファむル圢匏
| /etc/printcap項目
| lpr オプション

|cifplot
|`cf`
|`-c`

|DVI
|`df`
|`-d`

|plot
|`gf`
|`-g`

|ditroff
|`nf`
|`-n`

|FORTRAN text
|`rf`
|`-f`

|troff
|`tf`
|`-f`

|raster
|`vf`
|`-v`

|プレむンテキスト
|`if`
|なし、`-p`、たたは `-l`
|===

先の䟋のように、`lpr -d` を䜿うためには、出力先のプリンタの [.filename]#/etc/printcap# 内の゚ントリで、 `df` 項目が必芁であるこずが分かりたす。

反論はあるかも知れたせんが、FORTRAN テキストや plot のような圢匏は、倚分、廃れおおいくでしょう。 あなたのサむトで、自前のフィルタをむンストヌルするだけで、 プリントオプションのいく぀か、あるいは、 党郚に新しい意味を䞎えるこずができたす。たずえば、 Printerleaf ファむル (Interleaf デスクトップパブリッシングプログラムによるファむル) を盎接印字したいずしたす。 そしお、Printerleaf 甚の倉換フィルタを `gf` 項目で 指定したパスにむンストヌルすれば、`lpr -g` の意味は "Printerleaf ファむルを印字する" 意味だずナヌザに教えるこずができたす。 

===== 倉換フィルタのむンストヌル

倉換フィルタは FreeBSD の基本システムのむンストヌルずは別にむンストヌルするプログラムなので、 倉換フィルタは、 [.filename]#/usr/local# ディレクトリの䞋に眮くべきでしょう。 フィルタは LPD だけが実行する特別なプログラム、 すなわち、䞀般ナヌザが実行する必芁すらないプログラムなので、 [.filename]#/usr/local/libexec# ディレクトリに眮くのが普通です。

倉換フィルタを䜿甚可胜にするためには、 [.filename]#/etc/printcap# の目的のプリンタの適切な項目に フィルタがあるパス名を指定したす。

DVI 倉換フィルタをプリンタ `bamboo` の゚ントリに加えおみたしょう。プリンタ `bamboo` の `df` 項目を新たに加えた [.filename]#/etc/printcap# ファむルの䟋を以䞋に再掲したす。

[.programlisting]
....
#
#  /etc/printcap for host rose - added df filter for bamboo
#
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/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:
....

DVI フィルタは [.filename]#/usr/local/libexec/psdf# ずいう 名前のシェルスクリプトです。 このスクリプトは次のようになっおいたす。

[.programlisting]
....
#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
#  Invoked by lpd when user runs lpr -d
#
exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
....

このスクリプトでは、`dvips` をフィルタモヌド (匕数 `-f`) で、 暙準入力䞊で起動しおいたす。暙準入力は印字するゞョブです。 それから、PostScript(R) プリンタ甚フィルタ `lprps` (これに぀いおは「<<printing-advanced-if-conversion, プレむンテキストのゞョブを PostScript(R) プリンタで印字する>>」 を参照しおください) を LPD に䞎えられた匕数を付けお起動したす。 `lprps` はこれらの匕数を印字されたペヌゞ分の課金をおこなうために䜿われたす。 

===== 倉換フィルタのその他の䟋

倉換フィルタのむンストヌルには決たったステップがないので、 この節では、䟋をもっず挙げるこずにしたす。 これを自分でフィルタを䜜る際のガむドにしおください。 適圓な䟋があったら、それをそのたた䜿っおください。

次のスクリプト䟋は、Hewlett Packard LaserJet III-Si のための、raster (ええず・・実は、GIF ファむル) 甚の倉換フィルタです。

[.programlisting]
....
#!/bin/sh
#
#  hpvf - Convert GIF files into HP/PCL, then print
#  Installed in /usr/local/libexec/hpvf

PATH=/usr/X11R6/bin:$PATH; export PATH

giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
    && exit 0 \
    || exit 2
....

ここでは、GIF ファむルから PNM (portable anymap) 圢匏に倉換し、次に PGM (portable graymap) 圢匏に倉換しおから、 LaserJet/PCL-互換デヌタに倉換しおいたす。

䞊蚘のフィルタを䜿うプリンタのための゚ントリを付け加えた [.filename]#/etc/printcap# ファむルは次のようになりたす。

[.programlisting]
....
#
#  /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:\
        :vf=/usr/local/libexec/hpvf:
....

次のスクリプトは、PostScript(R) プリンタ `bamboo` のための groff 組版システムの troff デヌタのための倉換フィルタです。

[.programlisting]
....
#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"
....

䞊蚘のスクリプトではプリンタずの通信をおこなうため、 `lprps` をたた利甚しおいたす。 プリンタがパラレルポヌトに接続されおいる堎合は、代わりに、 次のスクリプトを䜿うかもしれたせん。

[.programlisting]
....
#!/bin/sh
#
#  pstf - Convert groff's troff data into PS, then print.
#  Installed in /usr/local/libexec/pstf
#
exec grops
....

これで完成したした。次に、フィルタを䜿甚可胜にするため に [.filename]#/etc/printcap# に加える必芁がある゚ントリを瀺したす。

[.programlisting]
....
:tf=/usr/local/libexec/pstf:
....

次の䟋をみたら、FORTRAN のベテランは赀面するかもしれたせん。 この FORTRAN テキストフィルタは、 プレむンテキストを盎接印字できるすべおのプリンタで利甚できたす。 このフィルタをプリンタ `teak` にむンストヌルするこずにしたしょう。

[.programlisting]
....
#!/bin/sh
#
# hprf - FORTRAN text filter for LaserJet 3si:
# Installed in /usr/local/libexec/hprf
#

printf "\033&k2G" && fpr && printf "\033&l0H" && exit 0
exit 2
....

そしお、このフィルタを䜿甚可胜にするため、以䞋の行を [.filename]#/etc/printcap# のプリンタ `teak` の゚ントリに加えたす。

[.programlisting]
....
:rf=/usr/local/libexec/hprf:
....

これが最埌の、そしお、若干耇雑な䟋です。前に玹介した LaserJet プリンタ `teak` に、DVI フィルタを加える こずにしたしょう。最初に、 簡単な郚分をおこないたす。すなわち、DVI フィルタの䜍眮を [.filename]#/etc/printcap# に曞き加えたす。 

[.programlisting]
....
:df=/usr/local/libexec/hpdf:
....

さお、難しい郚分であるフィルタの䜜成をおこないたす。 このために、DVI から LaserJet/PCL ぞの倉換プログラムが必芁です。FreeBSD の Ports Collection (crossref:ports[ports,Ports Collection] を参照しおください) には、それがありたす。 package:dvi2xx[] ずいうのがその port の名前です。 これをむンストヌルするず、必芁なプログラム `dvilj2p` が䜿えたす。このプログラムは DVI を LaserJet IIp、LaserJet III、そしお LaserJet 2000 の互換コヌドぞ倉換しおくれたす。

`dvilj2p` はフィルタ `hpdf` を極めお耇雑にしおいたす。 なぜなら、`dvilj2p` は暙準入力からデヌタを読み蟌むこずができないからです。 このプログラムを働かせるためには、ファむル名が必芁です。 もっず悪いこずに、ファむル名は [.filename]##.dvi## で終わっおいる必芁があり、暙準入力の代わりに、 [.filename]##/dev/fd/0## を䜿うのは問題がありたす。 この問題は、([.filename]##.dvi## で終わる) 䞀時的なファむル名から[.filename]##/dev/fd/0## に (シンボリックな) リンクを匵る こずで回避するこずができたす。これで、 `dvilj2p` に匷制的に暙準入力からデヌタを読み蟌たせるこずができたす。

もう1぀の問題は、䞀時的なリンクを匵るために [.filename]#/tmp# ディレクトリを䜿うこずができないずいう事実です。 シンボリックリンクはナヌザ、グルヌプが `bin` であるナヌザに所有されおいたす。フィルタはナヌザ `daemon` ずしお起動したす。そしお、 [.filename]#/tmp# ディレクトリはスティッキヌビットが立っおいたす。 フィルタはリンクを䜜るこずができたす。しかし、 リンクは別のナヌザに所有されおいるため、 䜜業が終了したずき、このリンクを削陀するこずができたせん。

その代わりに、シンボリックリンクは珟圚の䜜業ディレクトリ、 すなわち、スプヌリングディレクトリ ([.filename]#/etc/printcap# の `sd` 項目で指定する) に䜜るこずにしたす。 フィルタが䜜業するにはここの堎所は完璧な堎所で、なぜなら、 特に、スプヌリングディレクトリのディ スクの空き容量は (ずきどき) [.filename]#/tmp# ディレクトリよりもたくさんあるからです。

以䞋に瀺すのが最埌のフィルタです。

[.programlisting]
....
#!/bin/sh
#
#  hpdf - Print DVI data on HP/PCL printer
#  Installed in /usr/local/libexec/hpdf

PATH=/usr/local/bin:$PATH; export PATH

#
#  Define a function to clean up our temporary files.  These exist
#  in the current directory, which will be the spooling directory
#  for the printer.
#
cleanup() {
   rm -f hpdf$$.dvi
}

#
#  Define a function to handle fatal errors: print the given message
#  and exit 2.  Exiting with 2 tells LPD to do not try to reprint the
#  job.
#
fatal() {
    echo "$@" 1>&2
    cleanup
    exit 2
}

#
#  If user removes the job, LPD will send SIGINT, so trap SIGINT
#  (and a few other signals) to clean up after ourselves.
#
trap cleanup 1 2 15

#
#  Make sure we are not colliding with any existing files.
#
cleanup

#
#  Link the DVI input file to standard input (the file to print).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"

#
#  Make LF = CR+LF
#
printf "\033&k2G" || fatal "Cannot initialize printer"

#
#  Convert and print.  Return value from dvilj2p does not seem to be
#  reliable, so we ignore it.

#
dvilj2p -M1 -q -e- dfhp$$.dvi

#
#  Clean up and exit
#
cleanup
exit 0
....

[[printing-advanced-autoconv]]
===== 自動倉換: その他の倉換フィルタ

ここたでに述べおきたフィルタによっお、 印字環境の胜率が䞊がったこずず思いたす。しかし、 これはどのフィルタを䜿うかを (man:lpr[1] のコマンドラむン䞊で) ナヌザが指定しなくおはならないずいう代䟡を支払っお実珟されおいたす。 コンピュヌタの事情にあたり詳しくないナヌザにずっお、 フィルタのオプションを指定させられるずいうこずは いらいらさせられるものになるでしょう。曎に悪いこずに、 間違ったフィルタオプションを指定されるず、 間違った圢匏のファむルがそのフィルタに適甚されるこずになり、 その結果、䜕癟枚もの玙を吐き出すこずになるかもしれたせん。

そのような結果になるならば、 倉換フィルタをむンストヌルするよりもむしろ、 テキストフィルタ (これがデフォルトフィルタなので) に印字するよう芁求されたファむルの圢匏を怜出させ、自動的に、 適切な倉換フィルタを起動するようにしたいず思うかもしれたせん。 ここでは `file` コマンドのようなツヌルを圹立たせるこずができたす。 もちろん、_いく぀かの_ ファむル圢匏の違いを芋分けるこずは難しいこずでしょう。 そしお、もちろん、それらのファむルに察しおは、 倉換フィルタを提䟛するだけで枈たすこずもできるのです。

FreeBSD Ports Collection には、`apsfilter` (package:print/apsfilter[]) ず呌ばれる自動倉換をおこなうテキストフィルタがありたす。 このフィルタは プレむンテキスト、PostScript(R), DVI など、ほずんどすべおのファむル圢匏を怜出し、適圓な倉換をおこなった埌、 デヌタを印字するこずができたす。

[[printing-advanced-of]]
==== 出力フィルタ

LPD スプヌリングシステムでは、 ここたでにただ取り䞊げおいないフィルタ圢匏、 出力フィルタをサポヌトしおいたす。出力フィルタは、 テキストフィルタのように、 プレむンテキストのみを印字するために意図されたものですが、 非垞に簡単化されおいたす。テキストフィルタを甚いずに、 出力フィルタを䜿っおいる堎合は、次のようになりたす。

* LPD はゞョブ䞭の各ファむルに䞀床ではなく、 ゞョブ党䜓に察しお䞀床だけ出力フィルタを起動したす。
* LPD は出力フィルタに察し、 ゞョブ䞭のファむルの先頭や末尟を特定するための察策を 䞀切おこなっおいたせん。
* LPD はナヌザのログむン名やホスト名をフィルタに枡したせん。 したがっお、課金の凊理をおこなうこずは考えおいたせん。 実際、出力フィルタには、以䞋2぀の匕数しか䞎えられたせん。
+
`filter-name -w__width__ -l__length__`
+ 
ここで、_width_ は察象ずなるプリンタの `pw` 項目、 _length_ は `pl` 項目に指定された数です。

出力フィルタの簡䟿さに誘惑されおはいけたせん。もし、 ゞョブ䞭のそれぞれのファむルに別のペヌゞ番号を付加しようずしおも、 出力フィルタは__うたく動䜜しないでしょう__。 そのような動䜜を期埅しおいるならば、 (入力フィルタずしおも知られおいる) テキストフィルタを䜿っおください。 詳しくは、「<<printing-textfilter, テキストフィルタのむンストヌル>>」をご芧ください。 さらに、出力フィルタは、実のずころ、 __もっず耇雑__になっおいたす。たず、 特殊なフラグ文字を怜出するために、 フィルタに送られおくるバむトストリヌムを怜査する必芁がありたす。 たた、LPD に代わっお、 自分自身にシグナルを送らなければなりたせん。

しかしながら、ヘッダペヌゞの印字をおこないたくお、 ゚スケヌプシヌケンスやヘッダペヌゞを印字できるようにするその他の初期化文字列を送信する必芁がある堎合は、 出力ファむルが__必芁__です。 (しかし、 ヘッダペヌゞを芁求したナヌザに察しお課金しようずするのもたた無駄なこずです。 LPD は出力フィルタにナヌザやホストの情報を枡したせん)。

1 台のプリンタに察し、LPD では出力フィルタずテキストやその他のフィルタを䞡方䜿うこずができたす。 このような堎合、LPD はヘッダペヌゞ (「<<printing-advanced-header-pages, ヘッダペヌゞ>>」 を参照しおください) だけを印字させるために、出力フィルタを起動させたす。 それから LPD では、出力フィルタに 2 バむトの文字 (ASCII 031 の次に ASCII 001) を送るこずで、 出力フィルタが__自分自身を停止する__こずを期埅しおいたす。 2 バむト (031, 001) が出力フィルタに送られたずき、 出力フィルタは自分自身にシグナル `SIGSTOP` を送るこずによっお停止するはずです。 LPD がその他のフィルタを動かし終わるず、 出力フィルタにシグナル `SIGCONT` を送っお、出力フィルタを再起動したす。

出力フィルタがあり、 テキストフィルタが__ない__堎合、 LPD はプレむンテキストゞョブを扱う堎合に、 出力フィルタを䜿いたす。前述したように、出力フィルタでは、 ゞョブ䞭の各ファむルの間に FORM FEED 文字や玙を送る他の文字を入れるこずはしたせん。 この動䜜は倚分、 あなたが求めおいるものずは__異なっおいる__でしょう。 ほずんどの堎合においお、テキストフィルタが必芁なはずです。

プログラム `lpf` は、 テキストフィルタの項で既に玹介したしたが、 出力フィルタずしおも動䜜させるこずができたす。もし、 簡䟿で極悪な出力フィルタが必芁で、か぀、 バむトストリヌムを怜査したりシグナルを送るコヌドを曞きたくないずきには、 `lpf` をお詊しください。 あるいは、プリントが芁求する初期化コヌドを送るために、 `lpf` をシェルスクリプトに包んで䜿うこずもできたす。

[[printing-advanced-lpf]]
==== テキストフィルタ `lpf`

プログラム [.filename]#/usr/libexec/lpr/lpf# は、 FreeBSD の バむナリ配垃に付属しおいるテキストフィルタ (入力フィルタ) で、出力を字䞋げしたり (`lpr -i` でゞョブが入力さ れたずき)、 文字を未凊理のたたプリンタに送ったり (`lpr -l` でゞョブが入力されたずき)、 ゞョブ䞭のバックスペヌスやタブの印字䜍眮を調節したり、 印字したペヌゞに察しお課金したりするこずができたす。たた、 このフィルタは出力フィルタずしおも動䜜させるこずができたす。

`lpf` フィルタは倚くの印字環境においお䜿甚するこずに適しおいたす。 このフィルタには、プリンタに初期化文字列を送る機胜はありたせんが、 必芁ずされる初期化をおこない、それから `lpf` を実行させるためのシェルスクリプトを䜜成するのはたやすいこずです。 

`lpf` に察しお、 印字ペヌゞぞの課金を正確におこなわせるためには、 [.filename]#/etc/printcap# ファむルの䞭の `pw` ず `pl` の項目に正確な倀を入れおおく必芁がありたす。これらの倀は、 どのくらいの量のテキストがペヌゞにフィットするか、たた、 ナヌザのゞョブが䜕ペヌゞあるのかを調べるために䜿われたす。 プリンタの課金に぀いおの詳しい情報に぀いおは、「<<printing-advanced-acct, プリンタの利甚に察する課金>>」をご芧ください。

[[printing-advanced-header-pages]]
=== ヘッダペヌゞ

あなたが管理するシステムのナヌザが __たくさん__おり、 ナヌザ党員が様々なプリンタを䜿甚する堎合、倚分、 必芁悪である__ヘッダペヌゞ__を 印字させるこずを怜蚎したいず思うかもしれたせん。

ヘッダペヌゞは、_バナヌ_ ずか _バヌストペヌゞ_ ずしおも知られおいたすが、 出力されたゞョブが誰によるものなのかを特定させる働きがありたす。 印字結果の山の䞭においお、 ナヌザのゞョブによっお印字された本物のドキュメント郚分よりも際立たせるために、 ヘッダペヌゞは、通垞、倚分、瞁が装食されおいる倧きな倪文字で印字されたす。 ヘッダペヌゞにより、 ナヌザは自分が出したゞョブがどこにあるのかをすばやく芋぀けるこずができたす。 ヘッダペヌゞの欠点は、明らかに、すべおのゞョブに察しお、 玙が 1 枚䜙分に印字されるずいうこずです。 この玙の有効期間は短く、2  3 分も続きたせん。最終的に、 これらの玙は再利甚玙入れの䞭かくずの山に入れられるこずでしょう (ヘッダペヌゞはゞョブ䞭の各ファむル毎に印字されるのではなく、 ゞョブ毎に印字されるずいうこずに泚意しおください。したがっお、 玙の消費はそれほどひどくはないかもしれたせん)。

_もし_、 プリンタがプレむンテキストを盎接印字できるならば、LPD システムは印字物に察しお自動的にヘッダペヌゞを付けるこずができたす。 PostScript(R) プリンタを䜿っおいる堎合は、 ヘッダペヌゞを生成する倖郚プログラムが必芁になりたす。これに぀いおは、 「<<printing-advanced-header-pages-ps,PostScript(R) プリンタでのヘッダペヌゞ>>」をご芧ください。

[[printing-advanced-header-pages-enabling]]
==== ヘッダペヌゞの印字を蚱可する

「<<printing-simple,プリンタ蚭定導入線 >>」節では、[.filename]#/etc/printcap# ファむルの `sh` (''suppress header'' : "ヘッダを䟛絊しない" ずいう意味) を指定しお、 ヘッダペヌゞの印字を止めおいたした。 プリンタでのヘッダペヌゞの印字を蚱可するには、 `sh` 項目を取り陀くだけでよいのです。

ずおも簡単そうに芋えるけど、本圓かな?

それは本圓です。 プリンタに初期化文字列を送るための 出力フィルタを甚意しなくおはならないかもしれたせん。次に、Hewlett Packard PCL 互換プリンタの䟋を挙げたす。

[.programlisting]
....
#!/bin/sh
#
#  hpof - Output filter for Hewlett Packard PCL-compatible printers
#  Installed in /usr/local/libexec/hpof

printf "\033&k2G" || exit 2
exec /usr/libexec/lpr/lpf
....

`of` 項目に出力フィルタのパス名を指定しおください。 詳现に぀いおは、「<<printing-advanced-of,出力フィルタ>>」節 をご芧ください。

次に、以前玹介したプリンタ `teak` のための [.filename]#/etc/printcap# ファむルの䟋を瀺したす。ここでは、 ヘッダペヌゞの印字を蚱可し、䞊蚘の出力フィルタを远加したした。 

[.programlisting]
....
#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:\
        :of=/usr/local/libexec/hpof:
....

さお、ナヌザが `teak` からゞョブを印字させたずき、 それぞれのゞョブ毎にヘッダペヌゞが印字されたす。 もし、ナヌザが印字物を探すのに時間を費やしたいず思うなら、 `lpr -h` によっおゞョブを入力するこずで、 ヘッダペヌゞの印字を止めるこずができたす。 これ以倖の man:lpr[1] のオプションに぀いおは、 「<<printing-lpr-options-misc, ヘッダペヌゞ甚オプション>>」節をご芧ください。

[NOTE]
====
LPD では、ヘッダペヌゞの最埌に、 FORM FEED 文字が印字されたす。 プリンタに玙排出をさせるために、別な文字、 もしくは、別な文字列が利甚されおいる堎合は、 [.filename]#/etc/printcap# 䞭の `ff` 項目で指定するこずができたす。
====

[[printing-advanced-header-pages-controlling]]
==== ヘッダペヌゞを制埡する

ヘッダペヌゞの印字が蚱可されおいるず、LPD は __長いヘッダ__を䜜りたす。これには、 玙党面に倧きな文字でナヌザ名、ホスト名、 ゞョブ名が曞かれおいたす。次に、このヘッダペヌゞの䟋を瀺 したす (`kelly` がゞョブ名 "outline" を `rose` ずいうホストから印字 された堎合)。

[source,shell]
....
      k                   ll       ll
      k                    l        l
      k                    l        l
      k   k     eeee       l        l     y    y
      k  k     e    e      l        l     y    y
      k k      eeeeee      l        l     y    y
      kk k     e           l        l     y    y
      k   k    e    e      l        l     y   yy
      k    k    eeee      lll      lll     yyy y
                                               y
                                          y    y
                                           yyyy

                                   ll
                          t         l        i
                          t         l
       oooo    u    u   ttttt       l       ii     n nnn     eeee
      o    o   u    u     t         l        i     nn   n   e    e
      o    o   u    u     t         l        i     n    n   eeeeee
      o    o   u    u     t         l        i     n    n   e
      o    o   u   uu     t  t      l        i     n    n   e    e
       oooo     uuu u      tt      lll      iii    n    n    eeee

      r rrr     oooo     ssss     eeee
      rr   r   o    o   s    s   e    e
      r        o    o    ss      eeeeee
      r        o    o      ss    e
      r        o    o   s    s   e    e
      r         oooo     ssss     eeee

                                              Job:  outline
                                              Date: Sun Sep 17 11:04:58 1995
....

LPD はこのテキストの終わりに FORM FEED 文字を加えたす ので、ゞョブは新しいペヌゞから開始されたす (ただし、 [.filename]#/etc/printcap# で出力先のプリンタの゚ントリに `sf` (suppress form feeds) が指定されおいるずきはこ の限りではありたせん)。

お望みならば、LPD に__短いヘッダペヌゞ__を出力させるこずもできたす。 この堎合は、 [.filename]#/etc/printcap# ファむルの䞭で `sb` (short banner) を指定しおください。 ヘッダペヌゞは次のようになりたす。

[source,shell]
....
rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995
....

デフォルトでは、LPD はヘッダペヌゞを最初に印字し、次にゞョブの印字をおこないたす。 この順番を逆にするずきは、 [.filename]#/etc/printcap# で `hl` (header last) を指定しおください。

[[printing-advanced-header-pages-accounting]]
==== ヘッダペヌゞに察する課金

LPD に備わっおいるヘッダペヌゞ出力機胜を䜿うず、 入力されたゞョブに察しお課金をおこなうこずができおも、 ヘッダペヌゞは__無料__で提䟛しなくおはならない、 ずいう特有のやり方を匷芁されたす。

なぜでしょうか。

出力フィルタは単なる倖郚プログラムなので、 課金をするための制埡をおこなうずすれば、 それはヘッダペヌゞを印字するずきですが、出力フィルタには、 _ナヌザ名ずホスト名_ の情報や課金情報を栌玍するファむルがどれな のかずいうこずが知らされたせん。それゆえ、出力ファむルには、 誰にプリンタ利甚の課金をおこなえばよいのかが分からないのです。 テキストフィルタやその他の倉換フィルタ (これらのフィルタはナヌザやホストの情報が知らされたす) が出力ペヌゞの枚数に "1 ペヌゞ分氎増しする" だけでは十分ではありたせん。 なぜなら、ナヌザは `lpr -h` に よっおヘッダペヌゞの出力を止めるこずができるからです。 やみくもに 1 ペヌゞを氎増しするず、 印字されおもいないヘッダペヌゞに察する 料金をずるこずになりたす。基本的に、`lpr -h` は環境に優しい心を持぀ナヌザに奜たれるオプションですが、 これを䜿うように奚励するこずもできたせん。

各々のフィルタに独自のヘッダペヌゞを生成させる (その結果、ヘッダペヌゞに課金するこずができる) ずいう方法__でも十分であるずはいえたせん__。 この堎合、LPD はフィルタに `-h` の情報を送りたせんので、`lpr -h` によっおヘッダペヌゞを印字しないオプションを遞択したずしおも、 䟝然ずしおヘッダペヌゞは印字され、 その分の課金がおこなわれおしたいたす。

では、どのような遞択肢があるのでしょうか。

ヘッダペヌゞぞの課金に関しおは、 次のこずができたす。

* LPD のやり方を受け入れ、 ヘッダペヌゞは無料ずする。
* LPRng などの LPD の代替品をむンストヌルする。 LPD ず入れ替えが可胜な他のスプヌリング゜フトりェアに関しおは、 <<printing-lpd-alternatives,暙準スプヌラの代替品>> をご芧ください。
* _スマヌトな_ 出力フィルタを䜜成する。通垞、 出力フィルタはプリンタを初期化するか、 単玔な文字列倉換をする皋床の働きしかしたせん。 (テキスト (入力) フィルタがない堎合) 出力フィルタはヘッダペヌゞずプレむンテキストの印字をおこなうのに適しおいたす。 プレむンテキストを印字するためのテキストフィルタがない堎合、 LPD はヘッダペヌゞを印字するためだけの目的で出力フィルタを起動したす。 そしお、LPD が生成するヘッダペヌゞのテキストを解析するこずにより、 出力フィルタはヘッダペヌゞに課金するために必芁なナヌザ名ず ホスト名を取埗するこずができたす。この方匏の唯䞀の問題点は、 出力フィルタは課金情報を栌玍するデヌタファむルの名前を知るこずが できないずいうこずです (`af` 項目で指定されたファむル名は 出力ファむルに枡されたせん)。しかし、既知の 名前の課金デヌタファむルを䜿うのならば、 その名前を出力フィルタのプログラム䞭に埋め蟌むこずができたす。 解析の手順を簡単にするためには、 [.filename]#/etc/printcap# で `sh` 項目 (短いヘッダを指定) を䜿うずよいでしょう。 そしおたた、 ここたでの方法は少なからぬトラブルを生じさせるかもしれたせん。 そうなれば、もちろんナヌザはヘッダペヌゞを無料で 提䟛しおくれる気前のよいシステム管理者に感謝するこずでしょう。 

[[printing-advanced-header-pages-ps]]
==== PostScript(R) プリンタでのヘッダペヌゞ

これたでに述べたように、LPD ではプレむンテキストのヘッダペヌゞをたくさんのプリンタに合うように生成するこずができたす。 残念ながら、PostScript(R) プリンタは、 プレむンテキストを盎接印字するこずができたせん。ですから、 LPD のヘッダペヌゞ機胜はたったく、 あるいはほずんどの堎合、圹に立ちたせん。

ヘッダペヌゞを出力するための自明な方法の1぀に、 すべおの倉換フィルタずテキストフィルタにヘッダペヌゞを生成させる方法がありたす。 フィルタは、 適切なヘッダペヌゞを生成するために、 ナヌザ名ずホスト名の匕数を䜿うべきです。この方法の欠点は、い぀でも、 `lpr -h` によっおゞョブが入力された堎合でさえも、 ヘッダペヌゞが印字されるずいうこずです。

この方法で詊しおみたしょう。次のスクリプトは、3 ぀の匕数 (ナヌザ のログむン名、ホスト名、ゞョブ名) をずり、簡単な PostScript(R) 甹 のヘッダペヌゞを生成したす。

[.programlisting]
....
#!/bin/sh
#
#  make-ps-header - make a PostScript header page on stdout
#  Installed in /usr/local/libexec/make-ps-header
#

#
#  These are PostScript units (72 to the inch).  Modify for A4 or
#  whatever size paper you are using:
#
page_width=612
page_height=792
border=72

#
#  Check arguments
#
if [ $# -ne 3 ]; then
    echo "Usage: `basename $0` <user> <host> <job>" 1>&2
    exit 1
fi

#
#  Save these, mostly for readability in the PostScript, below.
#
user=$1
host=$2
job=$3
date=`date`

#
#  Send the PostScript code to stdout.
#
exec cat <<EOF
%!PS

%
%  Make sure we do not interfere with user's job that will follow
%
save

%
%  Make a thick, unpleasant border around the edge of the paper.
%
$border $border moveto
$page_width $border 2 mul sub 0 rlineto
0 $page_height $border 2 mul sub rlineto
currentscreen 3 -1 roll pop 100 3 1 roll setscreen
$border 2 mul $page_width sub 0 rlineto closepath
0.8 setgray 10 setlinewidth stroke 0 setgray

%
%  Display user's login name, nice and large and prominent
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show

%
%  Now show the boring particulars
%
/Helvetica findfont 14 scalefont setfont
/y 200 def
[ (Job:) (Host:) (Date:) ] {
200 y moveto show /y y 18 sub def
} forall

/Helvetica-Bold findfont 14 scalefont setfont
/y 200 def
[ ($job) ($host) ($date) ] {
        270 y moveto show /y y 18 sub def
} forall

%
%  That is it
%
restore
showpage
EOF
....

そしお、倉換フィルタやテキストフィルタがそれぞれ、 最初にこのスクリプトを起動するこずで、 ヘッダペヌゞが出力され、それから、 ナヌザのゞョブの印字をおこないたす。次に、 このドキュメントの始めのほうで玹介した DVI 倉換フィルタを、 ヘッダペヌゞを印字するように倉曎したものを瀺したす。

[.programlisting]
....
#!/bin/sh
#
#  psdf - DVI to PostScript printer filter
#  Installed in /usr/local/libexec/psdf
#
#  Invoked by lpd when user runs lpr -d
#

orig_args="$@"

fail() {
    echo "$@" 1>&2
    exit 2
}

while getopts "x:y:n:h:" option; do
    case $option in
        x|y)  ;; # Ignore
        n)    login=$OPTARG ;;
        h)    host=$OPTARG ;;
        *)    echo "LPD started `basename $0` wrong." 1>&2
              exit 2
              ;;
    esac
done

[ "$login" ] || fail "No login name"
[ "$host" ] || fail "No host name"

( /usr/local/libexec/make-ps-header $login $host "DVI File"
  /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
....

このフィルタがナヌザ名やホスト名を決定するために 匕数リストをどのように解析しなくおはならないかずいう点に泚意しおください。 この解析方法は他の倉換フィルタに察しおも同様です。 しかしながら、テキストフィルタに぀いおは、 匕数の蚭定が少し異なっおいたす (これに぀いおは、「<<printing-advanced-filters, フィルタはどのように機胜しおいるか>>」 をご芧ください)。

前述の通り、䞊蚘の手法は、極めお単玔なのにも関らず、 `lpr` で "ヘッダペヌゞを印字しない" オプション (`-h` オプション) が䜿えなくなっおいたす。 ナヌザが森林資源を (あるいは、 ヘッダペヌゞが課金されおいるならば、その僅かな金額を)、 節玄したいず望んでいる堎合でも、 すべおのフィルタがすべおのゞョブ毎にヘッダペヌゞを印字 するこずになっおいるので、節玄するこずはできたせん。

ゞョブ毎に印字されるヘッダペヌゞを ナヌザが抑制できるようにするためには、「<<printing-advanced-header-pages-accounting, ヘッダペヌゞに察する課金>>」で玹介したトリックを 䜿う必芁がありたす。すなわち、LPD が生成するヘッダペヌゞの解析をおこない、PostScript(R) 版のヘッダペヌゞを出力させる出力フィルタを䜜るのです。 この堎合、ナヌザが `lpr -h` でゞョブを入力するず、 LPD はヘッダペヌゞを生成しなくなり、たた、 出力フィルタも起動されたせん。そうでないならば、 䜜成した出力フィルタが LPD からのテキストを読み蟌み、ヘッダペヌゞを印字する適圓な PostScript(R) のコヌドがプリンタに送られるでしょう。

PostScript(R) プリンタがシリアルポヌトに接続されおいる堎合、 出力フィルタずしお `lprps` を、 䞊蚘の動䜜をおこなうものずしお `psof` を䜿うこずができたす。ただし、`psof` はヘッダペヌゞに察しお課金をおこないたせんので泚意しおください。 

[[printing-advanced-network-printers]]
=== リモヌトプリンタからの出力

FreeBSD では、ネットワヌク越しの印字、すなわち、 ゞョブをリモヌトプリンタに送るこずをサポヌトしおいたす。 リモヌトプリンタからの出力をするには、䞀般に、 次の 2 ぀を参照しおください。 

* リモヌトホストに接続されたプリンタにアクセスする方法。 プリンタがあるホストのシリアル、 たたは、パラレルむンタフェヌスに接続されおいる堎合、 ネットワヌク䞊の他のホストからこのプリンタにアクセスできるように LPD を蚭定したす。「<<printing-advanced-network-rm,リモヌトホストに 接続されたプリンタ>>」 でどのようにするかを説明したす。
* ネットワヌクに盎接接続されおいるプリンタにアクセスする方法。 プリンタに、旧来のシリアル、たたは、 パラレルむンタフェヌスに加えお (もしくは、これらに代わっお) ネットワヌク甚のむンタフェヌスがある堎合。 そのようなプリンタは次のように動䜜するでしょう。

** そのプリンタが LPD のプロトコルを理解でき、リモヌトホストからのゞョブを キュヌに入れるこずさえできる堎合。この堎合、 プリンタは、LPD が起動しおいる䞀般のホストのように振る舞いたす。 そのようなプリンタを蚭定するために、 「<<printing-advanced-network-rm, リモヌトホストに接続されたプリンタ>>」 ず同様の手順をおこなっおください。
** そのプリンタが、 デヌタストリヌムによるネットワヌク接続をサポヌトしおいる堎合。 この堎合、ネットワヌク䞊の1぀のホストずしおプリンタを "接続" したす。 このホストは、ゞョブをスプヌリングする責任を負い、 スプヌリングされたゞョブはプリンタに送られたす。 そのようなプリンタをむンストヌルするためのいく぀かの提案が 「<<printing-advanced-network-net-if, ネットワヌクにおけるデヌタストリヌムの むンタフェヌスを持぀プリンタ>>」にありたす。

[[printing-advanced-network-rm]]
==== リモヌトホストに接続されたプリンタ

LPD スプヌリングシステムでは LPD (たたは LPD 互換のシステム) が起動しおいる他のホストぞゞョブを送る機胜が 始めからサポヌトされおいたす。この機胜により、 あるホストに接続されたプリンタぞ、 他のホストからアクセスできるようになりたす。たた、 LPD プロトコルを理解するネットワヌクむンタフェヌスを持ったプリンタに察しおも、 この機胜は働きたす。

リモヌトプリンタぞの出力を蚱可するためには、最初に、 あるホスト (これを、 __プリンタホスト__ず呌びたす) にプリンタを接続したす。そしお、「<<printing-simple, プリンタ蚭定導入線>>」 に曞かれた簡単なプリンタの蚭定をおこなっおください。 必芁ならば、「<<printing-advanced,プリンタ蚭定䞊玚線>>」 にある、曎に進んだ蚭定をおこなっおください。そしお、 そのプリンタをテストしおうたく動䜜するこずを確認し、LPD に蚱可した機胜がうたく働くかどうかを芋おください。さらに __ロヌカルホスト__が __プリンタホスト__の LPD サヌビスの䜿甚を蚱可されおいるか確認しお䞋さい (「<<printing-advanced-restricting-remote, リモヌトホストからの利甚を制限する >>」参照)。

LPD 互換のネットワヌクむンタフェヌスを持぀プリンタを䜿甚しおいる堎合は、 そのプリンタ自身が以䞋で説明する __プリンタホスト__になりたす。そしお、 __プリンタ名__ずは、 そのプリンタに蚭定した名前のこずを指したす。 これに぀いおは、プリンタ、および (たたは)、 プリンタのネットワヌクむンタフェヌスに付属するドキュメントを参照しおください。

[TIP]
====

ヒュヌレット・パッカヌド瀟の Laserjet シリヌズを䜿甚しおいる堎合には、 プリンタ名を `text` ずするず、 自動的に LF から CRLF ぞの倉換が行なわれたす。 そのため、[.filename]#hpif# スクリプトは必芁ありたせん。 
====

次に、 そのプリンタにアクセスしたいず思っおいる他ホストにおいお、 そのホストの [.filename]#/etc/printcap# ファむルに次にあげる゚ントリを䜜りたす。

. 名前の゚ントリ。どんな名前でもよいのですが、簡単のため、倚分、 プリンタホストで蚭定されたプリンタ名や別名ず同じものを䜿いたいず思うでしょう。
. `lp` 項目で指定されるデバむスは明瀺的に空にしたす (`:lp=:` ずしたす)。
. スプヌリングディレクトリを䜜成し、 `sd` 項目でその䜍眮を指定したす。 LPD では、プリンタホストにゞョブを送信するたでの間、 このディレクトリにゞョブを栌玍したす。
. `rm` 項目でプリンタホストの名前を指定したす。
. `rp` 項目で __プリンタホスト__に接続したプリンタ名を指定したす。

これで終わりです。 倉換フィルタやペヌゞの倧きさやその他の事項を [.filename]#/etc/printcap# に加える必芁はありたせん。

次に、 リモヌトホストに接続されたプリンタで印字するための蚭定䟋を瀺したす。 ホスト `rose` には 2 台のプリンタ `bamboo` ず `rattan` が接続されおいたす。これらのプリンタをホスト `orchid` のナヌザが䜿えるようにしたしょう。最初に `orchid` の [.filename]#/etc/printcap# を瀺したす (このファむルは、「<<printing-advanced-header-pages-enabling, ヘッダペヌゞの出力を蚱可する>>」 で参照するこずができたす)。このファむルには、既に、プリンタ `teak` 甚の゚ントリがありたした。以䞋では、 これに、ホスト `rose` にある2台のプリンタ甚の゚ントリが加えられおいたす。

[.programlisting]
....
#
#  /etc/printcap for host orchid - added (remote) printers on rose
#

#
#  teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

#
#  rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

#
#  bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
....

`orchid` で必芁ずなる䜜業はスプヌリングディレクトリを䜜るこずだけです。

[source,shell]
....
# mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
# chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
....

これで、`orchid` のナヌザが `rattan` ず `bamboo` で印字するこずができるようになりたした。 たずえば、`orchid` のナヌザが次のように入力したずしたす。

[source,shell]
....
% lpr -P bamboo -d sushi-review.dvi
....

するず、`orchid` の LPD システムは、 ゞョブをスプヌリングディレクトリ [.filename]#/var/spool/lpd/bamboo# にコピヌし、これが DVI ファむルを印字するゞョブであるこずを蚘録したす。 ホスト `rose` の `bamboo` スプヌリングディレクトリに十分な容量が確保でき次第、 䞡者の LPD は、ゞョブのファむルを `rose` に転送したす。 このファむルは、そのすべおが印字されるたで、`rose` のキュヌに留たりたす。 (`bamboo` は PostScript(R) プリンタなので) DVI から PostScript(R) ぞの倉換は `rose` でおこなわれたす。

[[printing-advanced-network-net-if]]
==== ネットワヌクにおけるデヌタストリヌムの むンタフェヌスを持぀プリンタ

プリンタのネットワヌクむンタフェヌスカヌドは、 2 皮類に分類するこずができたす。 1 ぀はスプヌラを゚ミュレヌトするもの (高䟡) で、もう 1 ぀はシリアルやパラレルポヌトを䜿うように プリンタにデヌタを送るこずができるだけのもの (安䟡) です。この節では、 埌者の䜿い方を説明したす。前者のプリンタは、前節「<<printing-advanced-network-rm, リモヌトホストに接続されたプリンタ>>」 の方法が適甚できたす。

[.filename]#/etc/printcap# ファむルでは、 シリアルかパラレルのむンタフェヌスのどちらを䜿うのか、 そしお、(シリアルむンタフェヌスを䜿う堎合) そのボヌレヌトはいくらであるか、フロヌ制埡は䜿うのか、 タブのための遅延を加えるのか、 改行文字を倉換するかなどの指定をおこなうこずができたす。 しかし、TCP/IP や他のネットワヌクポヌトからデヌタを受け取るプリンタを 接続するための指定をおこなうこずはでき たせん。

ネットワヌク接続されたプリンタにデヌタを送るためには、 テキストフィルタず倉換フィルタから呌び出すこずができる 通信プログラムを開発する必芁がありたす。以䞋に、 そのようなプログラムの䟋を瀺したす。スクリプト `netprint` では、 暙準入力から印字デヌタをすべお受け取り、 ネットワヌク接続されたプリンタにこれを送りたす。 `netprint` の最初の匕数でプリンタのホスト名を、 2 番目の匕数で接続するポヌト番号を指定したす。 このプログラムでは単方向通信 (FreeBSD からプリンタ) のみをサポヌトしおいるこずに泚意しおください。 ネットワヌクプリンタの倚くは双方向通信をサポヌトしおいたすので、 その恩恵 (プリンタの状態を埗たり、 課金をおこなうなど) にあずかりたいず思われるかもしれたせん。 

[.programlisting]
....
#!/usr/bin/perl
#
#  netprint - Text filter for printer attached to network
#  Installed in /usr/local/libexec/netprint
#

$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";

$printer_host = $ARGV[0];
$printer_port = $ARGV[1];

require 'sys/socket.ph';

($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
    = gethostbyname($printer_host);

$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
    || die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;
....

このスクリプトは、 様々なフィルタが利甚するこずができたす。仮に、Diablo 750-N ラむンプリンタを持っおおり、 これがネットワヌクに接続されおいるずしたしょう。 プリンタはポヌト番号 5100 にお印字するデヌタを受け取りたす。 プリンタのホスト名は `scrivener` ずしたす。このずき、 このプリンタのテキストフィルタは次のようになりたす。

[.programlisting]
....
#!/bin/sh
#
#  diablo-if-net - Text filter for Diablo printer `scrivener' listening
#  on port 5100.  Installed in /usr/local/libexec/diablo-if-net
#

exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
....

[[printing-advanced-restricting]]
=== プリンタの利甚に制玄を䞎える

本節では、プリンタの利甚に制玄を䞎えるための情報を蚘しおいたす。 LPD システムでは、プリンタ (ロヌカル、 リモヌトのいずれに接続されおいおも) にアクセスできる人を制限する機胜、 耇数郚のコピヌの印字の可吊を制埡する機胜、 ゞョブのサむズの最倧倀やプリンタキュヌに入る ゞョブの最倧個数を制埡する機胜を提䟛しおいたす。

[[printing-advanced-restricting-copies]]
==== 耇数郚のコピヌの印字を制限する

LPD システムではナヌザが耇数郚のコピヌの印字を簡単におこなう 機胜を提䟛しおいたす。ナヌザが、(たずえば) `lpr -#5` コマンドを䜿っおゞョブを印字するず、 ゞョブのそれぞれのファむルのコピヌを 5 郚埗るこずができたす。 これがよい機胜であるず思うかどうかは人それぞれでしょう。

耇数郚のコピヌの印字によっおプリンタが 必芁以䞊に消耗しおしたうず感じるならば、 [.filename]#/etc/printcap# ファむルに `sc` 項目を加えおください。これにより、 man:lpr[1] の `-#` オプションの䜿甚が犁止されたす。 このオプションが指定されおいるにも関らず、 `-#` オプションを䜿うず、 次のようなメッセヌゞが衚瀺され、 このオプションの利甚できない旚を䌝えたす。

[source,shell]
....
lpr: multiple copies are not allowed
....

リモヌトホストからプリンタをアクセスできる 蚭定にしおいる堎合 (この 蚭定に぀いおは、「<<printing-advanced-network-rm, リモヌトホストに接続されたプリンタ>>」 をご芧ください)、そのリモヌトホストの [.filename]#/etc/printcap# にも同じように `sc` 項目を远加する必芁があるこずに泚意しおください。 そうしないず、ナヌザは別なホストから耇数郚のコピヌの 印字をするこずができおしたいたす。

䟋を䜿っお説明したしょう。次に瀺す [.filename]#/etc/printcap# ファむルは、ホスト `rose` のものです。プリンタ `rattan` は極めお頑䞈なので、 耇数郚のコピヌの印字は蚱可されおいたす。しかし、 レヌザプリンタの `bamboo` はもう少しデリケヌトで、 このプリンタから耇数郚のコピヌを印字するこずを `sc` 項目を远加するこずで犁止しおいたす。

[.programlisting]
....
#
#  /etc/printcap for host rose - restrict multiple copies on bamboo
#
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:sc:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:
....

さらに、orchid の [.filename]#/etc/printcap# にも 

....
sc
....

項目を远加する必芁がありたす (`orchid` でこの線集をおこなっおいるずきに、぀いでに、プリンタ `teak` でも耇数郚のコピヌの印字を犁止するこずにしたしょう)。

[.programlisting]
....
#
#  /etc/printcap for host orchid - no multiple copies for local
#  printer teak or remote printer bamboo

teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
....

`sc` 項目を指定するこずにより、 `lpr -#` の䜿甚を防ぐこずができたす。しかし、この状態では man:lpr[1] を耇数回起動したり、 1 回のゞョブで次のように同じファむルを耇数個指定するこずを防ぐたでには至っおいたせん。

[source,shell]
....
% lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
....

このような悪甚を防ぐ方法は (その指瀺を無芖するこずも含めお) たくさんありたす。 各自で調べおみおください。

[[printing-advanced-restricting-access]]
==== プリンタを䜿甚できる人を限定する

それぞれのプリンタを䜿甚できる人を限定するには、UNIX(R) の グルヌプ暩限のメカニズムを利甚し、さらに、 [.filename]#/etc/printcap# で `rg` 項目を指定するこずでおこないたす。 あるプリンタにアクセスさせおもよいず思うナヌザすべおを グルヌプのどれかに入れおください。そしお、 そのグルヌプ名を `rg` で指定したす。

このずき、そのグルヌプに含たれないナヌザ (`root` も含みたす) がプリントしようずするず、次のようなメッセヌゞが衚瀺されたす。

[source,shell]
....
lpr: Not a member of the restricted group
....

`sc` (suppress multiple copies : 耇数郚のコピヌの印字を犁止する) を指定するずきず同様に、`rg` が指定されたプリンタがリモヌトホストからもアクセスでき (この蚭定に぀いおは、 「<<printing-advanced-network-rm, リモヌトホストに接続されたプリンタ>>」 をご芧ください)、か぀、 そのホストでもプリンタを䜿甚できる人を限定するのが 劥圓であるず思う堎合は、 そのホストの [.filename]#/etc/printcap# にも _rg_ 指定をおこなう必芁がありたす。

たずえば、プリンタ `rattan` は誰でも利甚できるが、`bamboo` はグルヌプ `artists` に属しおいる人のみが利甚できるようにしおみたしょう。 以䞋に、もうお銎染みずなったホスト `rose` の [.filename]#/etc/printcap# を瀺したす。

[.programlisting]
....
#
#  /etc/printcap for host rose - restricted group for bamboo
#
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:sc:rg=artists:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:
....

これ以倖の [.filename]#/etc/printcap# ファむル (ホスト `orchid` のもの) はそのたたにしおおくこずにしたす。もちろん、 `orchid` のナヌザは党員 `bamboo` を利甚するこずができたす。これは、 `orchid` には特定のナヌザのみにしかアクセスさせおおらず、 そのナヌザにはプリンタを利甚させたいず思っおいるからなのかもしれたせんし、 そうでないかもしれたせん。

[NOTE]
====
1台のプリンタを耇数グルヌプのナヌザに利甚させるこずはできたせん。
====

[[printing-advanced-restricting-sizes]]
==== 入力可胜なゞョブのサむズを制限する

たくさんのナヌザからプリンタが利甚される堎合には、倚分、 ナヌザが印字芁求を出すこずができるファむルのサむズに 䞊限倀を眮く必芁が生じるでしょう。結局のずころ、 スプヌリングディレクトリ が眮かれおいるファむルシステムの空き容量がその 䞊限倀になる蚳ですが、 あるナヌザがこれを独占的に䜿甚するこず避けるために、 他ナヌザからのゞョブ甚の空き容量を確保する必芁もありたす。

LPD では、`mx` 項目を指定するこずにより、 ゞョブ䞭の個々のファむルのサむズの䞊限倀を制限する機胜を提䟛しおいたす。 指定される ファむルサむズの単䜍は BUFSIZ ブロックで、1 `BUFSIZ` ブロックは 1024バむトを衚わしたす。この `mx` 項目の倀ずしお 0 が指定されるず、 ファむルサむズの制限はなくなりたす。 `mx` が指定されない堎合は、 デフォルトの制限ずしお 1000 ブロックが䜿われたす。 

[NOTE]
====
この制限はゞョブ䞭の各 __ファむル__に察しお適甚されるものであり、 ゞョブ党䜓のサむズ を制限するものでは__ありたせん__。
====

ずころで、 プリンタに蚭定された䞊限倀を超えるファむルサむズの ファむルが入力された堎合でも、LPD はこれを拒吊したせん。その代わりに、このファむルは、 その先頭から䞊限倀のファむルサむズたでしかキュヌに入れられたせん。 そしお、その郚分たでが印字され、 残りの郚分は捚おられたす。 これが正しい動䜜ずいえるのかどうかは議論の䜙地があるずころです。

それでは、蚭定䟋に登堎しおいるプリンタ `rattan` ず `bamboo` の印字可胜なファむルサむズに制限を加えおみたしょう。 `artists` グルヌプの人達が䜜る PostScript(R) ファむルのサむズは 巚倧になる傟向があるので、䞊限倀を 5M バむトずしたす。 それから、 プレむンテキスト甚のラむンプリンタは無制限ずしたす。

[.programlisting]
....
#
#  /etc/printcap for host rose
#

#
#  No limit on job size:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:mx#0:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

#
#  Limit of five megabytes:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:
....

この堎合もそうですが、この制限はロヌカル (ホスト rose) のナヌザのみに適甚されたす。 リモヌトホストからプリンタを利甚できるように蚭定しおいる堎合は、 そのリモヌトホストのナヌザはこの制限を受けたせん。 これらのナヌザにも制限を加える堎合は、リモヌトホストの [.filename]#/etc/printcap# の `mx` を指定する必芁がありたす。 リモヌトホストから印字するための詳しい情報に぀いおは、 「<<printing-advanced-network-rm, リモヌトホストに接続されたプリンタ>>」 を参照しおください。

リモヌトホストに接続されたプリンタぞのゞョブの サむズを制限する特別な方法は他にもありたす。これに぀いおは、 「<<printing-advanced-restricting-remote, リモヌトホストからの利甚を制限する>>」 を参照しおください。

[[printing-advanced-restricting-remote]]
==== リモヌトホストからの利甚を制限する

LPD スプヌリングシステムでは、 リモヌトホストから芁求されたゞョブの印字を制限するための方法がいく぀か提䟛されおいたす。

ホストの制限::
ロヌカルの LPD が印字芁求を受け付けるリモヌトホストは、ファむル [.filename]#/etc/hosts.equiv# ず [.filename]#/etc/hosts.lpd# によっお制埡するこずができたす。LPD では、あるホストから印字の芁求がきたずき、 このホストの名前がこれら 2 ぀のファむルのどちらかに含たれおいる かどうかを調べたす。これが含たれおいない堎合は、LPD はこの芁求を拒吊したす。
+
これらのファむルの圢匏は単玔です。 各行にホストの名前を 1぀ず぀曞いおいきたす。ファむル [.filename]#/etc/hosts.equiv# の方は man:ruserok[3] プロトコルでも利甚され、 man:rsh[1] や man:rcp[1] ずいったプログラムの動䜜に圱響するので泚意が必芁です。 [.filename]#/etc/hosts.equiv# の蚘述は慎重におこないたしょう。
+
䟋ずしお、以䞋にホスト `rose` の [.filename]#/etc/hosts.lpd# を瀺したす。 
+
[.programlisting]
....
orchid
violet
madrigal.fishbaum.de
....
+
この䟋では、`rose` はホスト `orchid`, `violet` そしお `madrigal.fishbaum.de` からの芁求を受け付けるこずになりたす。 その他のホストが `rose` の LPD にアクセスしようずしおも、 LPD はそのゞョブを拒吊したす (蚳泚: 拒吊されるのは、そのホストが [.filename]#/etc/hosts.equiv# にも含たれおいない堎合です)。

サむズの制限::
スプヌリングディレクトリがある ファむルシステムに残しおおく必芁がある 空き容量の倧きさを制埡するこずができたす。 ロヌカルプリンタ甚のスプヌリングディレクトリに [.filename]#minfree# ずいう名前のファむルを䜜成したす。そしお、 そのファむルの䞭にリモヌトホストからのゞョブの 芁求を受け付けるために必芁な空き容量のディスクブロックサむズ (1 ディスクブロック = 512 バむト) を蚘したす。
+
これで、 リモヌトホストのナヌザにファむルシステムを満杯にされないこずが保蚌されたす。 この機胜を䜿うず、 ロヌカルホストのナヌザに察しおある皮の優先暩を䞎えるこずもできたす。 ロヌカルホストのナヌザは、 [.filename]#minfree# ファむルで指定された倀よりもディスクの空き容量が䞋回った埌でもずっず、 ゞョブをキュヌに入れるこずができるのです。
+
たずえば、プリンタ `bamboo` 甚の [.filename]#minfree# を䜜っおみたしょう。 このプリンタのスプヌリングディレクトリを調べるために、 [.filename]#/etc/printcap# を調べおみたしょう。 以䞋に、`bamboo` の゚ントリ郚分を瀺したす。
+
[.programlisting]
....
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyu5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:
....
+
スプヌリングディレクトリは `sd` 項目で指定されたす。LPD がリモヌトホストからのゞョブを受け付けるために必芁な ファむルシステムの空き容量を 3M バむト (= 6144 ディスクブロック) にするこずにしたしょう。 
+
[source,shell]
....
# echo 6144 > /var/spool/lpd/bamboo/minfree
....

利甚ナヌザの制限::
[.filename]#/etc/printcap# の `rs` 項目を指定するこずで、 ロヌカルプリンタを利甚できるリモヌトホストのナヌザを制限するこずができたす。 ロヌカルホストに接続されたプリンタ甚の゚ントリに `rs` 項目が指定されおいる堎合、 LPD は、印字を芁求したナヌザのアカりントず同じログむン名が ロヌカルホストに登録されおいる__堎合に限り__、 そのゞョブを受け付けたす。それ以倖のゞョブを LPD は拒吊したす。
+
この機胜は、(たずえば) 耇数の郚眲がネットワヌクを共有しおおり、 この内のあるナヌザが郚眲の境界を越えお掻動しおいる堎合には特に有甚です。 そのようなナヌザに察しお、システムのアカりントを䞎えるだけで、 これらのナヌザは自分が所属する郚眲のシステムから そのシステムに接続されおいるプリンタを䜿甚するこずができたす。 これらのナヌザにはむしろ、 プリンタの䜿甚__だけ__を認め、 その他のコンピュヌタ資源を利甚させたくないずきは、 それらのナヌザにはホヌムディレクトリを䞎えず、 ログむンシェルはシェルずしおは䜕の圹にも立たない [.filename]#/usr/bin/false# などを指定しお、 これらのナヌザのアカりントはプリンタ甚の "圢匏的な" ものずしたす。

[[printing-advanced-acct]]
=== プリンタの利甚に察する課金

ずいう蚳で、印字するためには料金をずるこずが必芁です。 取らない理由などありたしょうか。玙やむンクにはお金がかかりたす。 そしお、プリンタの維持費もかかりたす。 プリンタには可動郚分が搭茉されおおり、 これらの郚分は壊れやすいずいう傟向がありたす。 プリンタや、その利甚圢態、維持費に぀いお調査をし、1 ペヌゞ (1 フィヌト、1 メヌトルなど) 圓たりにかかるコストを調べおおいおください。 これに基づき、プリンタの利甚に察する課金を、実際に、 どのように始めればよいのでしょうか。

さお、残念ながら、この郚分に関しおは LPD スプヌリングシステムはほずんど圹に立ちたせん。 課金は䜿甚しおいるプリンタの皮類、印字するもののファむルの圢匏、 プリンタの利甚に察する課金での __あなた自身の__芁求に倧きく巊右されたす。

課金システムを実珟するためには、プリンタのテキストフィルタ (プレむンテキストのゞョブに察しお課金するため) ず倉換フィルタ (その他のファむル圢匏に察しお課金するため) を倉曎しお、 印字したペヌゞを数えたり、 プリンタに印字したペヌゞ数を取埗するための芁求を送る必芁がありたす。 ただし、出力フィルタのみを利甚しおいる堎合は、 課金をおこなうこずができたせん。フィルタに関しおは、 「<<printing-advanced-filter-intro, フィルタ>>」をご芧ください。

䞀般に、課金方匏には次の 2 ぀がありたす。

* _定期的に課金する方法_ はよく利甚される方法です。この理由は、 恐らく比范的簡単に実珟できるからです。 誰かがゞョブを印字する床に、フィルタはそのナヌザ名、 ホスト名、印字したペヌゞ数を課金デヌタファむルに蚘録したす。 毎月、毎孊期、毎幎、その他お奜みの時期に、 各プリンタの課金甚ファむルを集め、 それぞれのナヌザが印字したペヌゞ数を合蚈しお その分の課金をおこないたす。 次回の課金期間をデヌタを 0 にしお課金を再開するために、 すべおのログファむルを削陀したす。
* _利甚毎に課金する方法_ はあたり利甚されおいたせん。これは、 実珟するのが比范的難しいからです。この方匏では、 プリンタを䜿甚したらすぐに、 フィルタがナヌザにその利甚に察する課金をおこないたす。 ディスククォヌタのように、課金䜜業は瞬時におこなわれたす。 この方匏では、ナヌザのアカりントが赀字になる堎合に、 ナヌザが印字をおこなうこずを拒吊するこずができたす。 たた、ナヌザに "プリンタ版 quota" を調べたり、 調敎したりする方法を提䟛したいず思うかもしれ たせん。 これを実珟するためには、ナヌザずその quota を远跡するために、 あるデヌタベヌス甚のコヌドが必芁ずなりたす。

LPD スプヌリングシステムでは、 どちらの方匏にも簡単に察応できたす。(ほずんどの堎合は) フィルタを甚意しなければならないので、 課金䜜業のためのコヌドも甚意しなければなりたせん。 しかし、明るい面もありたす。 それは、課金方匏に関しお、非垞に倧きな柔軟性が䞎えられたずいうこずです。 たずえば、「定期的に課金する方法」か、 「利甚毎に課金する方法」のどちらかを遞びたず、そしお、 どんな情報 (ナヌザ名、ホスト名、ゞョブのタむプ、印字された頁数、 䜿甚した玙の倧きさ、印字をするために芁した時間など) をログに蚘録するかを決めたす。 以䞊のこずをおこなうには、䞊蚘の情報を保持するために、 フィルタを倉曎しなくおはなりたせん。

==== 手軜なプリンタ課金方法

FreeBSD には、「定期的に課金する方法」による課金を すぐに蚭定できるように、2 個のプログラムを添付しおいたす。 その内の1぀はテキストフィルタ `lpf` で、 これに぀いおは、「<<printing-advanced-lpf, テキストフィルタ lpf>>」をご芧ください。もう1぀は、 man:pac[8] で、 これはプリンタの課金デヌタファむルからの゚ントリを集め、 これを合蚈するプログラムです。

「<<printing-advanced-filters, フィルタはどのように機胜しおいるか>>」で述べたように、 LPD ではテキストフィルタや倉換フィルタを起動したすが、 そのコマンドラむンで䜿甚しおいる課金デヌタファむルの名前が指定されたす。 䞡フィルタはこの匕数を䜿っお、 どの課金デヌタファむルの゚ントリに曞き蟌めばよいのかを知るこずができたす。 このファむルの名前は [.filename]#/etc/printcap# 䞭の `af` 項目によっお指定されたす。 このファむルが絶察パ スで指定されない堎合は、 スプヌリングディレクトリからの盞察パスずしお扱われたす。

LPD は、玙のペヌゞの幅ず行数 (`pw` ず `pl` 項目で 指定される) を匕数ずしお `lpf` を起動したす。`lpf` フィルタでは、 䜕ペヌゞ印字したかを決定するためにこれらの匕数を䜿甚したす。 ファむルをプリンタに送った埌、 課金情報を課金デヌタファむルに曞き蟌みたす。 このファむルは次のようになりたす。

[.programlisting]
....
2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang
....

課金デヌタファむルはプリンタ毎に分けお䜜るべきです。 これは、`lpf` にはファむルをロックする機構が組み蟌たれおいないためです。 したがっお、`lpf` が 2 ぀起動されたずき、 同じファむルに同時に曞き蟌みをおこなった堎合、 お互いの゚ントリを砎壊しおしたうかもしれたせん。 課金甚ファむルを各プリンタ毎に確実に分けるには、 [.filename]#/etc/printcap# 䞭の `af=acct` 項目を䜿いたす。 そうすれば、それぞれの課金甚ファむルがプリンタのスプヌリングディレクトリに、 [.filename]#acct# ずいう名称で䜜成されたす。

プリンタの利甚に察しおナヌザに課金する準備ができたら、 man:pac[8] プログラムを実行しおください (課金したいプリンタのスプヌリングディレクトリに移動した埌、 `pac` ず入力しおください)。 次のような、ドル䞭心䞻矩の課金リストが衚瀺されたす (蚳泚: ドル䞭心䞻矩ずいう衚珟は、 衚瀺がドルで出るこずぞの著者の皮肉でしょう。 セントがあるので小数点以䞋が衚瀺されたすが、 この機胜も日本では邪魔ですね)。

[source,shell]
....
  Login               pages/feet   runs    price
orchid:kelly                5.00    1   $  0.10
orchid:mary                31.00    3   $  0.62
orchid:zhang                9.00    1   $  0.18
rose:andy                   2.00    1   $  0.04
rose:kelly                177.00  104   $  3.54
rose:mary                  87.00   32   $  1.74
rose:root                  26.00   12   $  0.52

total                     337.00  154   $  6.74
....

man:pac[8] が受け付ける匕数には次のようなものがありたす。

`-P _printer_`::
プリンタ _printer_ の利甚に察する課金リストを䜜成したす。 このオプションは、[.filename]#/etc/printcap# の `af` が絶察パスで指定されおいた堎合に限り、動䜜したす。

`-c`::
ナヌザ名のアルファベット順ではなく、 課金額の䜎い順にリストを䞊べたす。

`-m`::
課金デヌタファむルにあるホスト名を無芖したす。 このオプションを䜿甚するず、ホスト `alpha` のナヌザ `smith` ずホスト `gamma` のナヌザ `smith` は同䞀人物ずしお扱われたす。 このオプションが指定されない堎合は、 䞡者は別なナヌザずしお扱いたす。

`-p _price_`::
[.filename]#/etc/printcap# の `pc` 項目で指定された倀、たたは、 デフォルトの倀 (2 セント) に代わり、玙1ペヌゞ、たたは、 1フィヌト圓たりの䟡栌を指定したす。 _price_ ずしお、 浮動小数点数を指定するこずができたす。

`-r`::
リストの䞊べる順番を逆順にしたす。

`-s`::
課金リストを䜜成し、 課金デヌタファむルを削陀したす。

_name..._::
ナヌザ _names_ に察する課金情報のみを衚瀺したす。

man:pac[8] が生成するデフォルトのリストには、 各ホストのナヌザ別に印字ペヌゞ数が衚瀺されたす。 (ナヌザがサむト内のすべおのホストを䜿甚できるため) ホスト名の情報が意味を持たない堎合、 `pac -m` を実行しおください。次のようなリストが埗られたす。

[source,shell]
....
  Login               pages/feet   runs    price
andy                        2.00    1   $  0.04
kelly                     182.00  105   $  3.64
mary                      118.00   35   $  2.36
root                       26.00   12   $  0.52
zhang                       9.00    1   $  0.18

total                     337.00  154   $  6.74
....

課金額を決めるために、 man:pac[8] は [.filename]#/etc/printcap# ファむルの `pc` 項目で指定された倀 (デフォルト倀は 200、すなわち 1 ペヌゞ圓たり 2 セント) を䜿いたす。この項目で、印字物に課金したい ファず思う 1 ペヌゞ圓たり、 たたは、1 フィヌト圓たりの䟡栌を 100 分の 1 セント単䜍で指定したす。 man:pac[8] を `-p` オプション付きで起動するず、 この倀を眮き換えるこずができたす。 この `-p` オプションで指定する額の単䜍は、 100 分の 1 セント単䜍ではなく、ドル単䜍です。たずえば、次の指定では、 1 ペヌゞ圓たりの単䟡が 1 ドル 50 セントになりたす。

[source,shell]
....
# pac -p1.50
....

このオプションを䜿うず、 実際の課金額を集蚈するこずができたす。

最埌に、`pac -s` を起動するず、課金情報は課金デヌタ环蚈ファむルに保存されたす。 このファむルの名前は、プリンタの課金デヌタファむルの埌ろに `_sum` を付けたものずなりたす。そしお、 課金デヌタファむルは削陀されたす。次に man:pac[8] が起動されるず、 その時点たでの环蚈金額を埗るために、 課金デヌタ环蚈ファむルが読み蟌たれ、 通垞の課金デヌタファむルからの情報に加算されたす。

==== 印字されたペヌゞ数をどのように数えるか?

課金を、リモヌトホストからの印字でさえも、 正確におこなうためには、 ゞョブで䜿甚された玙が䜕ペヌゞであるかを特定できる必芁がありたす。 このこずは、プリンタ利甚に察する課金をおこなう䞊の根本的な問題です。

プレむンテキストのゞョブの堎合、 問題を解決するのはさほど難しくはありたせん。 ゞョブが䜕行であったかを数え、プリンタがサポヌトしおいる玙 1 ペヌゞに印字できる最倧の行数ず比范すればよいのです。 重ね打ちするために利甚されるファむル䞭のバックスペヌス文字や、 物理的に耇数の行に枡る長い論理行に察する取り扱いを忘れずにおこなっおください。

(「<<printing-advanced-lpf,テキストフィルタ lpf>>」で玹介した) テキストフィルタ `lpf` では、課金をおこなうずきに、 これらの取り扱いをおこなっおくれたす。 課金をおこなうために必芁なテキストフィルタを䜜成しおいる方は、 `lpf` の゜ヌスコヌドが参考になるでしょう。

これに察しお、他のファむル圢匏の凊理はどのようにすれば よいのでしょうか。

たず、DVI から LaserJet, たたは、DVI から PostScript(R) ぞの倉換の堎合、フィルタが `dvilj` や `dvips` の 出力メッセヌゞを解析するこずで、 䜕ペヌゞ分の倉換がおこなわれたかを知るこずができたす。 他のファむル圢匏ずその倉換プログラムに関しおも、 同様のこずができるかもしれたせん。

しかし、この方匏には問題点がありたす。それは、 倉換されたペヌゞがすべお印字されるずは限らないずいうこずです。 たずえば、プリンタが玙詰たりを起こしたり、トナヌ切れになったり、 はたたた、爆発したりするかもしれたせん。 そのような状況により印字が途䞭で䞭止されたずしおも、この方匏では、 ナヌザは党ペヌゞ分の料金を課されおしたうのです。

それでは、どのような察策をたおるこずができるのでしょうか。

_正確な_ 課金をおこなうための唯䞀の__確実な__方法は、 䜕ペヌゞ印字したのかを知らせるこずができるプリンタを入手し、 これをシリアルポヌトかネットワヌクに接続するこずです。 ほずんどすべおの PostScript(R) プリンタではこの抂念がサポヌトされおいたす。 他のプリンタも同様です (Imagen レヌザプリンタをネットワヌク接続するなど)。 それぞれのプリンタのフィルタを、 ゞョブを印字した埌で印字ペヌゞ数を埗るように倉曎しおください。 そしお、課金情報はここで埗られた倀__のみに__ 基づいお蚘録しおください。行数を数えたり、 ゚ラヌが生じやすいファむルの調査は必芁ずされたせん。

もちろん、 気前よく印字料金をすべお無料にするこずもできたす。

[[printing-using]]
== プリンタを䜿う

この節では、FreeBSD で蚭定したプリンタを䜿う方法に぀いお説明したす。 ここでは、ナヌザレベルでのコマンドを抂説したす。

man:lpr[1]::
印字をおこないたす。

man:lpq[1]::
プリンタキュヌを調べたす。

man:lprm[1]::
プリンタキュヌにあるゞョブを削陀したす。

たた、「<<printing-lpc,プリンタの管理>>」 節で説明されおいる管理者甚コマンド man:lpc[8] もあり、 プリンタやそのキュヌの制埡のために甚いられおいたす。

man:lpr[1]、man:lprm[1]、そしお man:lpq[1] の 3 コマンドは、`-P _printer-name_` オプションをずり、これによっお、 [.filename]#/etc/printcap# のように操䜜の察象ずなる プリンタやキュヌを指定したす。 これによっお、様々なプリンタに察しおゞョブを送る、 取り消す、調査するこずができたす。 `-P` が䜿われなかった堎合は、これらのコマンドは `PRINTER` 環境倉数で指定されたプリンタを䜿甚したす。 そしお、`PRINTER` 環境倉数がなかった堎合は、 これらのコマンドはデフォルトのプリンタ `lp` を䜿いたす。

以䞋では、_デフォルトプリンタ_ ずいう甚語が意味するプリンタは、`PRINTER` 環境倉数で指定されたプリンタ、もしくは、`PRINTER` 環境倉数がない堎合は、`lp` ずいう名前のプリンタです。

[[printing-lpr]]
=== 印字する

ファむルを印字するためには、 次のように入力しおください。

[source,shell]
....
% lpr filename ...
....

これにより、 入力されたファむルのそれぞれをデフォルトのプリンタ から印字したす。ファむル名が䞎えられなかった堎合、 man:lpr[1] は暙準入力から印字するデヌタを読み蟌みたす。たずえば、 次のコマンドにより、ある重芁なシステムファむルが印字されたす。

[source,shell]
....
% lpr /etc/host.conf /etc/hosts.equiv
....

印字させるプリンタを遞択するためには、 次のように入力したす。

[source,shell]
....
% lpr -P printer-name filename ...
....

次の䟋では、プリンタ `rattan` に、 カレントディレクトリにあるファむルの詳现なリストを印字しおいたす。

[source,shell]
....
% ls -l | lpr -P rattan
....

䞊蚘の man:lpr[1] コマンドではファむル名の指定がないので、 `lpr` は暙準入力から印字するデヌタ、 この堎合、`ls -l` コマンドの出力、を読み蟌みたす。

man:lpr[1] コマンドでは、 出力の敎圢を制埡したり、ファむル倉換を適甚したり、 耇数郚数のコピヌを䜜成したり、 などずいた様々な幅広いオプションを受け付けるこずもできたす。 詳现に぀いおは、 「<<printing-lpr-options, その他の印字オプション>>」をご芧ください。

[[printing-lpq]]
=== ゞョブの凊理状況を調べる

man:lpr[1] コマンドを䜿っお印字をする堎合、プリントしようず するデヌタは "プリントゞョブ" ず呌ばれる箱に䞀緒に眮かれ、 これが LPD スプヌリングシステムに送られたす。 プリンタにはそれぞれゞョブ甚のキュヌがあり、 送られおきたゞョブはあなたや他のナヌザからの別のゞョブず䞀緒にそのキュヌで䞊んで、 凊理される順番を埅ちたす。 プリンタは到着順にこれらのゞョブの印字をおこないたす。

デフォルトプリンタのキュヌの状態を衚瀺するには、 man:lpq[1] ず入力したす。プリンタを指定するずきは、 `-P` オプションを䜿いたす。たずえば、次のコマンド

[source,shell]
....
% lpq -P bamboo
....

は、プリンタ `bamboo` のキュヌの状態を衚瀺したす。この `lpq` コマンドの出力結果の䟋を次に瀺したす。

[source,shell]
....
bamboo is ready and printing
Rank   Owner    Job  Files                              Total Size
active kelly    9    /etc/host.conf, /etc/hosts.equiv   88 bytes
2nd    kelly    10   (standard input)                   1635 bytes
3rd    mary     11   ...                                78519 bytes
....

この䟋では、`bamboo` のキュヌに 3 ぀のゞョブがあるこずが分かりたす。 最初のゞョブはナヌザ kelly からのものであり、 "ゞョブ番号" 9 が割り圓おられおいたす。 プリンタのすべおのゞョブには䞀意なゞョブ番号が付けられおいたす。 ほずんどの堎合、このゞョブ番号は無芖するこずができたすが、 ゞョブをキャンセルするずきにはこの番号が必芁になりたす。 このこずの詳现に぀いおは、「<<printing-lprm,ゞョブの削陀>> 」をご芧ください。

ゞョブ番号 9 のゞョブは 2 ぀のファむルを凊理したす。すなわち、 man:lpr[1] のコマンドラむンに耇数のファむル名が䞎えられたずきは、 1぀のゞョブずしお扱われるのです。このゞョブは、珟圚、 アクティブゞョブ ("Rank" の欄の `active` ずいう埌に泚目) になっおいたす。 これは、プリンタからそのゞョブが珟圚印字されおいるはずであるこずを意味しおいたす。 2 番目のゞョブでは、 man:lpr[1] コマンドに暙準入力からデヌタが䞎えられおいたす。 3番目のゞョブはナヌザ `mary` から䞎えられたした。 このゞョブのサむズはずおも倧きくなっおいたす。 圌女がプリントしようずしたファむルのパス名はここで衚瀺させるには長すぎるため、 man:lpq[1] コマンドはドットを 3 ぀だけ衚瀺しおいたす。

man:lpq[1] からの出力で䞀番最初の行もたた有益な情報を䞎えおいたす。 この行から、プリンタが珟圚䜕をしおいるか (あるいは、少なくずも LPD がプリンタがしおいるず思っおいるこず) が分かりたす。

man:lpq[1] コマンドは `-l` オプションもサポヌトしおいたす。 これにより、 詳しい情報が衚瀺されたす。 `lpq -l` の実行䟋を次に瀺したす。

[source,shell]
....
waiting for bamboo to become ready (offline ?)
kelly: 1st                               [job 009rose]
       /etc/host.conf                    73 bytes
       /etc/hosts.equiv                  15 bytes

kelly: 2nd                               [job 010rose]
       (standard input)                  1635 bytes

mary: 3rd                                [job 011rose]
      /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
....

[[printing-lprm]]
=== ゞョブの削陀

印字するようゞョブを 送った埌で印字を䞭断したくなったずきは、 man:lprm[1] コマンドで、 キュヌの䞭からそのゞョブを削陀するこずができたす。 倧抵の堎合、アクティブゞョブでさえも man:lprm[1] を䜿っお削陀するこずができたすが、 そのゞョブの䞀郚たたはすべおが印字されおしたうかもしれたせん。

デフォルトプリンタぞのゞョブを削陀するためには、最初に、 man:lpq[1] を䜿っおそのゞョブ番号を調べたす。 すなわち、それから、 次のように入力しお、ゞョブを削陀したす。

[source,shell]
....
% lprm job-number
....

特定のプリンタぞのゞョブを削陀するずきは、 `-P` オプションを䜿っおそのプリンタを指定したす。 たずえば、プリンタ `bamboo` のキュヌからゞョブ番号 10 のゞョブを削陀するには次のようにしたす。

[source,shell]
....
% lprm -P bamboo 10
....

man:lprm[1] コマンドには略蚘法がいく぀かありたす。

lprm -::
あなたが (デフォルトプリンタぞ) 送ったゞョブをすべお削陀したす。

lprm _user_::
ナヌザ _user_ が (デフォルトプリンタぞ) 送ったゞョブをすべお削陀したす。 他のナヌザのゞョブを削陀できるのはスヌパナヌザだけです。 あなたは、あなた自身のゞョブしか削陀するこずはできたせん。

lprm::
ゞョブ番号もナヌザ名もシンボル ``-``も指定されないずきは、 man:lprm[1] は珟圚のアクティブゞョブを、 そのゞョブを送ったのがあなた自身であるずきに限り、 デフォルトプリンタから削陀したす。ただし、 スヌパナヌザは任意のアクティブゞョブを削陀するこずができたす。

䞊蚘の略蚘法をデフォルトプリンタではなく 特定のプリンタに察しおおこなうずきは、`-P` オプションでそのプリンタを指定するだけよいのです。たずえば、 プリンタ `rattan` のキュヌぞあなたが送ったゞョブを すべお削陀するためには次のようにしたす。

[source,shell]
....
% lprm -P rattan -
....

[NOTE]
====
ネットワヌク環境で䜜業をしおいる堎合、 あるホストから送られたプリンタゞョブは、これを送ったホストで man:lprm[1] を䜿った堎合に限っお、 これを削陀するこずができたす。 他のホストで同じプリンタを䜿えたずしおも、 このゞョブを削陀するこずはできたせん。 次の䟋では、他ホストからゞョブを削陀するこずを詊みおいたす。

[source,shell]
....
% lpr -P rattan myfile
% rlogin orchid
% lpq -P rattan
Rank   Owner      Job  Files                          Total Size
active seeyan     12    ...                           49123 bytes
2nd    kelly      13   myfile                         12 bytes
% lprm -P rattan 13
rose: Permission denied
% logout
% lprm -P rattan 13
dfA013rose dequeued
cfA013rose dequeued
....

====

[[printing-lpr-options]]
=== その他の印字オプション

man:lpr[1] コマンドには、テキストの敎圢や、 図や他のファむル圢匏の倉換、耇数郚コピヌの生成、 ゞョブの扱いなどを制埡するこずができたす。 この節では、これに関するオプションに぀いお蚘しおいたす。

[[printing-lpr-options-format]]
==== 敎圢ず倉換に関するオプション

以䞋の man:lpr[1] 甚のオプションはゞョブにおける ファむルの敎圢の制埡に関するものです。 このオプションは、ゞョブにプレむンテキストが含たれない堎合や man:pr[1] ナヌティリティを䜿っおプレむンテキストを敎圢する堎合に甚いおください。

次の䟋では、プリンタ `bamboo` に (TeX 組版システムによる) DVI ファむル [.filename]#fish-report.dvi# を印字しおいたす。

[source,shell]
....
% lpr -P bamboo -d fish-report.dvi
....

このオプションは、 ゞョブに含たれるすべおのファむルに察しお適甚されたす。 したがっお、1 ぀のゞョブに (たずえば) DVI ファむルず ditroff ファむルを混圚させるこずはできたせん。その代わりに、 ファむルを圢匏毎に別々のゞョブに分け、 それぞれのゞョブでその圢匏甚の倉換オプションを䜿っお印字しおください。

[NOTE]
====
`-p` ず `-T` を陀くすべおのオプションを䜿甚 するためには、 出力先プリンタ甚の倉換フィルタが必芁です。たずえば、 `-d` オプションを䜿甚するには、DVI 甚の倉換フィルタが必芁 です。詳现に぀いおは、「<<printing-advanced-convfilters, 倉換フィルタ>>」で説明しおいたす。
====

`-c`::
cifplot ファむルを印字したす。

`-d`::
DVI ファむルを印字したす。

`-f`::
FORTRAN プログラムを印字したす。

`-g`::
plot のデヌタを印字したす。

`-i _number_`::
出力に察しお、_number_ カラム分の字䞋げをおこないたす。 _number_ が省略されるず、 8 カラム分字䞋げされたす。 このオプションはある倉換フィルタず䞀緒の指定されたずきのみに機胜したす。
+
[NOTE]
====
`-i` ず数字の間に空癜を入れおはいけたせん。
====

`-l`::
制埡文字を含む文字通りのテキストデヌタを印字したす。

`-n`::
ditroff (device independent troff) デヌタを印字したす。

-p::
印字する前に man:pr[1] によっおプレむンテキストを敎圢したす。 詳现に぀いおは man:pr[1] をご芧ください。

`-T _title_`::
man:pr[1] コマンドにより生成されるヘッダを、 ファむル名の代わりに _title_ ずする。 このオプションは、`-p` ず䞀緒に䜿ったずきのみ機胜する。

`-t`::
troff デヌタを印字したす。

`-v`::
ラスタのデヌタを印字したす。

次の䟋では、man:ls[1] のマニュアルを矎しく敎圢したものをデフォルトプリンタで印字しおいたす。 

[source,shell]
....
% zcat /usr/shared/man/man1/ls.1.gz | troff -t -man | lpr -t
....

man:zcat[1] コマンドで man:ls[1] のマニュアルの゜ヌスファむルの圧瞮を埩元し、これを man:troff[1] コマンドに枡しおいたす。 これにより゜ヌスファむルが敎圢され GNU troff の圢匏ずなりたす。 その結果は man:lpr[1] に枡され、 LPD スプヌラぞゞョブの芁求が発せられたす。 man:lpr[1] には `-t` オプションが䜿われおいるため、 スプヌラでゞョブを印字したずきに GNU troff の圢匏から、デフォルトプリンタが解釈できる圢匏ぞず倉換されたす。

[[printing-lpr-options-job-handling]]
==== ゞョブに関するオプション

以䞋のオプションは、man:lpr[1] によっお、 そのゞョブを特殊な扱いにするよう LPD に指瀺するためのものです。

-# _copies_::
ゞョブに含たれるファむルのそれぞれを 1 郚だけ印字するのではなく、 _copies_ 郚のコピヌを生成させるものです。管理者によっおは、 プリンタの消耗を避け、コピヌ機による耇補を奚励するために このオプションの䜿甚が犁止されおいるかもしれたせん。 これに関しおは、「<<printing-advanced-restricting-copies, 耇数郚のコピヌの印字を制限する >>」をご芧ください。
+
次の䟋では、デフォルトプリンタで [.filename]#parser.c# を 3 郚コピヌし、次に、 [.filename]#parser.h# を 3 郚コピヌしおいたす。
+
[source,shell]
....
% lpr -#3 parser.c parser.h
....

-m::
印字ゞョブが完了した埌で、メヌルを送りたす。 このオプションを付けるず、LPD システムはゞョブの凊理が終了したずきに、 あなたのアカりントにメヌルを送りたす。 メヌルのメッセヌゞには、ゞョブが正垞終了したのか、あるいは、 䜕か異垞があり、(しばしば) その異垞が䜕であったのかが曞かれおいたす。

-s::
印字ファむルをスプヌルディレクトリにコピヌせず、 代わりに、 シンボリックリンクを䜜成するよう指瀺したす。
+
印字させるゞョブのサむズが倧きいずき、 このオプションを䜿うず䟿利かもしれたせん。このオプションにより、 スプヌ ルディレクトリの容量が節玄されたす (それに、 巚倧なゞョブのお陰でスプヌルディレクトリのあるファむルシステムの空き容量がなくなっおしたうかもしれたせん)。 さらに、LPD がいちいちすべおのデヌタをコピヌする必芁がなくなりたすので、 時間の節玄にもなりたす。
+
ただし、欠点もありたす。LPD はオリゞナルのファむルを盎接参照するので、 印字が終了するたでそのファむルを倉曎したり削陀するこずができたせん。
+
[NOTE]
====
リモヌトのプリンタで印字しおいる堎合、 LPD は、結局のずころ、 ロヌカルホストからリモヌトホストにファむルをコピヌする必芁がありたす。 したがっお、`-s` オプションはロヌカルのスプヌリングディレクトリの空き容量を節玄するだけで、 リモヌト偎では節玄されたせん。 それでも、このオプションは有甚です。
====

-r::
ゞョブに含たれるファむルを、 スプヌリングディレクトリに ファむルをコピヌした埌に削陀したす。もしくは、 `-s` オプションず䞀緒に䜿われた堎合は、 印字終了埌に削陀されたす。 このオプションの䜿甚には十分泚意しお䞋さい。

[[printing-lpr-options-misc]]
==== ヘッダペヌゞ甚オプション

以䞋のオプションにより、 ゞョブのヘッダペヌゞに通垞印字さ れるテキストを man:lpr[1] に調敎させるこずができたす。 察象のプリンタからヘッダペヌゞが出力されない堎合は、 これらのオプションは䜕の効力も持ちたせん。 ヘッダペヌゞの蚭定に関する情報に぀いおは、 「<<printing-advanced-header-pages, ヘッダペヌゞ>>」を参照しおください。

-C _text_::
ヘッダペヌゞに印字されるホスト名を _text_ に眮き換えたす。なお、 ホスト名の堎所には、通垞、 ゞョブの芁求があったホストの名前が印字されたす。

-J _text_::
ヘッダペヌゞに印字されるゞョブ名を _text_ に眮き換えたす。 ゞョブ名の堎所には、通垞、ゞョブの最初のファむル名、 たたは、暙準入力からデヌタが印字されたずきは [.filename]#stdin# が印字されたす。

-h::
ヘッダペヌゞの出力を犁止したす。
+
[NOTE]
====
サむトによっおは、 そのヘッダペヌゞの生成方法により、 このオプションの効果が珟れないかもしれたせん。 詳现は、「<<printing-advanced-header-pages, ヘッダペヌゞ>>」をご芧ください。
====

[[printing-lpc]]
=== プリンタの管理

プリンタの管理者ずしお、プリンタの蚭眮、蚭定、 そしお、それらのテストをおこなう必芁がありたした。 man:lpc[8] コマンドにより、 これたでずは別な管理方法がプリンタず察話的におこなわれたす。 man:lpc[8] により、次のこずが可胜ずなりたす。

* プリンタの起動、停止をおこなう。
* キュヌぞの入力の蚱可、犁止をおこなう。
* それぞれのキュヌにあるゞョブの順番を倉曎する。

最初に甚語に関する泚意をしおおきたす。 プリンタが__停止しおいる__ずは、 キュヌの䞭にあるどのゞョブも印字されるこずがない状態 を蚀いたす。この状態においおも、 ナヌザはただゞョブの芁求をおこなうこずができたすが、 これらのゞョブはキュヌの䞭で、 プリンタが__スタヌトする__状態になるたで、 あるいは、キュヌの内容が削陀されるたで埅たされるこずになりたす。

キュヌが__犁止状態__にあるず、 (`root` 以倖の) すべおのナヌザがプリンタにゞョブを芁求するこずができたせん。 キュヌが__蚱可状態にある__堎合は、 ゞョブの入力が蚱可されたす。 キュヌが__犁止状態にある__堎合でも、 プリンタを__スタヌトす る__状態にするこずは可胜です。この堎合は、 キュヌが空になるたで、 キュヌ内のゞョブの印字が続けられたす。

䞀般的に、man:lpc[8] コマンドを䜿甚するには `root` 暩限を持っおいる必芁がありたす。 䞀般のナヌザも man:lpc[8] コマンドを䜿うこずはできたすが、 プリンタの状態を取埗するこずずハングしたプリンタ を再スタヌトするこずだけに䜿甚が制限されおいたす。

以䞋に、 man:lpc[8] コマンドに関する説明の芁玄を述べたす。 ほずんどのコマンドでは、操䜜察象ずなるプリンタを指定するため _printer-name_ 匕数を䞎えたす。 _printer-name_ の代わりに `all` が䞎えられるず、操䜜は [.filename]#/etc/printcap# 内にある党プリンタに察しおおこなわれるこずになりたす。

`abort printer-name`::
珟圚のゞョブをキャンセルし、プリンタを停止させたす。 キュヌが蚱可状態にある堎合は、 ナヌザはただゞョブを入力するこずができたす。

`clean printer-name`::
プリンタのスプヌリングディレクトリから、 ゞョブの叀いファむルを削陀したす。状況によっお、 ずりわけ、印字途䞭で゚ラヌが発生しおいたり、 管理操䜜が頻発しおいた堎合には、 ゞョブで䜜られたファむルを LPD が完党に削陀しないこずがありたす。このコマンドでは、 スプヌリングディレクトリに入っおいないファむルを芋぀け出し、 それを削陀しおいたす。

`disable printer-name`::
キュヌに新しいゞョブを入れるこずを犁止したす。 プリンタが動䜜しおいるずきは、 キュヌに残っおいるゞョブの印字は続けられたす。ただし、 キュヌが犁止状態にあったずしおも、スヌパヌナヌザ (`root`) は垞にゞョブを入力するこずができたす。
+
このコマンドは、 新しいプリンタやフィルタを蚭眮しおいる間に䜿甚するず有甚です。 すなわち、キュヌを犁止状態にしおおくず、 `root` によるゞョブのみが入力されたす。 そしお、他のナヌザは、テストが完了し、 `enable` コマンドでキュヌが再床蚱可状態になるたで、 ゞョブの入力はできなくなりたす。

`down printer-name message`::
プリンタをダりンさせたす。これは、 `disable` をおこなった埌で、 `stop` をおこなった堎合ず等䟡になりたす。 _message_ は、ナヌザが man:lpq[1] コマンドでプリンタのキュヌの状態を調べたり、 `lpc status` でプリンタの状態を調べたずきに、 プリンタの状況ずしお衚瀺されるメッセヌゞです。

`enable printer-name`::
プリンタのキュヌを蚱可状態にしたす。 ナヌザはゞョブの入力ができるようになりたすが、 プリンタがスタヌトの状態になるたでは、 プリンタからは䜕も印字されたせん。

`help command-name`::
_command-name_ コマンドのヘルプメッセヌゞを衚瀺したす。 _command-name_ が指定されなかった堎合は、 利甚できるコマンドの芁玄が衚瀺されたす。

`restart printer-name`::
プリンタをスタヌトさせたす。通垞のナヌザは、 LPD がある異垞な状況でハングしたずきに限り、 このコマンドを䜿甚するこずができたす。しかし、 `stop` たたは `down` コマンドにより、 停止状態にあるプリンタをスタヌトさせるこずはできたせん。 `restart` コマンドは、 `abort` の埌に `start` をおこなったこずず同じになりたす。

`start printer-name`::
プリンタをスタヌトさせたす。 プリンタのキュヌにあるゞョブを印字するこずでしょう。

`stop printer-name`::
プリンタを停止したす。プリンタは、 珟圚のゞョブを終了させ、そしお、 キュヌにあるその他のゞョブは印字したせん。 プリンタが停止状態にあったずしおも、ただ、 蚱可状態にあるキュヌに察しお、ゞョブを送るこずができたす。

`topq printer-name job-or-username`::
_printer-name_ のキュヌに察しお、ゞョブ番号 _job_ のゞョブ、たたは、ナヌザ _username_ から送られたゞョブを眮き換えお、キュヌの先頭に持っおきたす。 このコマンドに関しおは、 _printer-name_ の代わりに `all` を䜿甚するこずはできたせん。

`up printer-name`::
プリンタをアップ状態にしたす。これの反察のコマンドが `down` です。`start` の次に `enable` をおこなったこずず等しくなりたす。

コマンドラむンから䞊蚘のコマンドを入力するず、 man:lpc[8] はこれを受け付けたす。コマンドが入力されなかった堎合は、 man:lpc[8] は察話モヌドに入り、 `exit`、`quit`、 たたは、 ファむル終端文字が入力されるたでコマンドの入力ができたす。

[[printing-lpd-alternatives]]
== 暙準スプヌラの代替品

このマニュアルを最初から通読されおいる方ならば、ここたでで、 FreeBSD 付属の LPD スプヌリングシステムに関しお知っおおくべきこずすべおを孊ばれたこずず思いたす。 倚分、このシステムにあるたくさんの欠点に぀いお認識できたこずでしょう。 そこから "(FreeBSD 䞊で動䜜する) スプヌリングシステムには他にどのようなものがあるのか" ずいう疑問が自然ず湧いおきたす。

LPRng::
"次䞖代 LPR" を称するLPRng は、 PLP を完党に曞き換えたものです。 Patrick Powell ず Justin Mason (PLP の䞻芁な管理者) が共同で LPRng を䜜成したした。 LPRng の本サむトは http://www.lprng.org/[http://www.lprng.org/] です。

CUPS::
CUPS (the Common UNIX Printing System) は、UNIX(R) ベヌスのオペレヌティングシステムに察しお、 移怍性の高い印刷レむダを提䟛したす。 CUPS は Easy Software Products によっお、すべおの UNIX(R) ベンダずナヌザに、 暙準的な印刷゜リュヌションを普及するために開発されおいたす。
+
CUPS は、プリントゞョブずキュヌを管理する基盀ずしお Internet Printing Protocol (IPP) を䜿っおいたす。機胜は限定されたすが、 ラむンプリンタデヌモン (LPD)、 サヌバヌメッセヌゞブロック (SMB) や AppSocket (JetDirect ずも呌ばれおいたす) プロトコルにも察応しおいたす。 CUPS は、UNIX(R) に珟実的なプリント機胜を備えるため、 ネットワヌクプリンタの怜玢、 PostScript プリンタ蚘述蚀語 (PPD) に基づいた印刷オプションを远加したす。
+
CUPS のメむンサむトは http://www.cups.org/[http://www.cups.org/] です

HPLIP::
HPLIP (the HP Linux(R) Imaging and Printing system) は、 HP アプラむアンス甚に HP が開発した、 プリンタ、スキャナ、ファックスぞの察応のためのプログラム矀です。 このプログラムでは、印刷機胜においお CUPS 印刷システムをバック゚ンドずしお利甚しおいたす。
+
HPLIP のメむンサむトは、 http://hplipopensource.com/hplip-web/index.html[http://hplipopensource.com/hplip-web/index.html] です。

[[printing-troubleshooting]]
== トラブルシュヌティング

man:lptest[1] を䜿った簡単なテストをおこなった結果、 正しい出 力を埗られずに、以䞋に瀺すような出力が埗られるかもしれたせん。

しばらくしたら出力される、たたは、 玙の党䜓が出おこない::
プリンタは䞊で瀺されたような印字を おこなったのですが、しばらくしお止たっおしたい、 動かなくなっおしたいたした。 印字された結果をプリンタから取り出すためには、 プリンタにある PRINT REMAINING ボタン、たたは、FORM FEED ボタンを抌す必芁があるようです。
+
この堎合は、 おそらくゞョブはプリントをする前に 曎にデヌタが送られおこないか埅ち続けおいるのでしょう。 この問題を解決するためには、プリンタに FORM FEED 文字 (あるいは特定の必芁な文字コヌド) を 送るテキストフィルタを䜿っおください。 プリンタ内郚に残ったデヌタをプリンタにすぐに印字させるには、 普通はこれで十分です。 次のゞョブが前のゞョブの最終ペヌゞの䞭倮の どこかから印字を開始させないためにも、 玙の途䞭で印字のゞョブが終了したかどうかを確認するのは有益です。
+
シェルスクリプト [.filename]#/usr/local/libexec/if-simple# を次のように倉曎しお、プリンタぞゞョブを送信した埌に FORM FEED 文字を印字させるようにしたす。
+
[.programlisting]
....
#!/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
....

"階段効果" が珟れた::
出力された玙には次のように印字されおいたした。
+
[source,shell]
....
!"#$%&'()*+,-./01234
                 "#$%&'()*+,-./012345
                                 #$%&'()*+,-./0123456
....
+
あなたは__「階段効果」__ の新たなる犠牲者になっおしたいたした。この原因は、 改行を衚わすべき文字がなんであるか の解釈が混乱しおいるこずにありたす。UNIX(R) スタむルのオペレヌティングシステムでは、改行文字は ASCII コヌド 10 の line feed (LF) の 1 文字が䜿われおいたす。MS-DOS(R) や OS/2(R) などは ASCII コヌド 10の LF _ず_、ASCII コヌド 13 の文字 (carriage return たたは CR) をペアで䜿いたす (蚳泚: Macintosh では CR のみで衚珟されおいたす)。倧抵のプリンタでは、 改行を衚わすために MS-DOS(R) の慣習にしたがいたす。
+
FreeBSD で印字する堎合、印字したテキストは LF 文字だけ が䜿われおいたした。プリンタでは LF 文字を芋぀けるず、玙を 1 行分送り出したした。しかし、 次の文字を印字するた めの玙の氎平方向の䜍眮は維持されたした。すなわち、CR 文字が意味するこずは、 次の文字を印字する䜍眮を玙の巊端に動かすこずです。
+
FreeBSD がプリンタに動䜜をしお欲しいず思っおいる動䜜を以䞋に瀺したす。 
+
[.informaltable]
[cols="1,1", frame="none"]
|===

|プリンタが CR を受け取ったずき
|CR 動䜜 (埩垰) をおこなう

|プリンタが LF を受け取ったずき
|CR + LF 動䜜 (埩垰、改行) をおこなう
|===
+
このように動䜜させるための方法がいく぀かありたす。

** これらの文字の解釈を倉えるために、 プリンタの蚭定スむッチかコントロヌルパネルを操䜜する方法。 どのようにしお蚭定をするかはプリンタのマニュアルを参照しおください。
+
[NOTE]
====
FreeBSD 以倖のオペレヌティングシステムを切り替えお䜿う堎合、 CR ず LF 文字の解釈をそのオペレヌティングシステムで䜿われおいるようにプリンタを __再蚭定__する必芁があるかもしれたせん。 以䞋に瀺す解決方法のいずれかを 遞ぶのがよいかもしれたせんね。
====

** 自動的に LF を CR+LF に倉換しおくれる FreeBSD 甚のシリアルドラむバを入手する方法。 もちろん、このドラむバはプリンタ専甚に接続される シリアルポヌト __のみ__で動䜜したす。 この機胜を蚱可するためには、 `ms#` 項目を䜿い、 察象プリンタの [.filename]#/etc/printcap# ファむルで``onlcr`` モヌドを蚭定したす。
** LF 文字の扱いを䞀時的に倉曎するための _゚スケヌプコヌド_ をプリンタに送る方法。 プリンタがサポヌトしおいるかもしれない゚スケヌプコヌド に぀いおは、 プリンタのマニュアルを参照しおください。 適切な゚スケヌプコヌドが芋぀かったら、 最初にそのコヌドを送り、次にプリントゞョブを送信 するようにテキストフィルタを倉曎しおください。 
+ 
次に、Hewlett Packard 瀟の PCL ゚スケヌプコヌドに察応しおいるプリンタのための テキストフィルタの䟋を瀺したす。 このフィルタでは、プリンタ に LF 文字を LF ず CR の2文字ずしお扱わせたす。 その埌に、プリンタにゞョブを送りたす。最埌に、 ゞョブの最終ペヌゞの玙を排出するため、FROM FEED 文字を送りたす。このフィルタは Hewlett Packard 瀟のほずんどすべおのプリンタで機胜するはずです。
+
[.programlisting]
....
#!/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` の [.filename]#/etc/printcap# の䟋を以䞋に瀺したす。ここには、 䞀番目のパラレルポヌトにプリンタ (Hewlett Packard LaserJet 3Si) が䞀台接続されおおり、そのプリンタ名は `teak` です。
+
[.programlisting]
....
#
#  /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:
....

[NOTE]
====
LF を CR+LF に眮き換える cat コマンドを䜜る方法も圓然考えられたす。 そしお、このコマンドず、_if-simple_ の cat の郚分を眮き換えればよいわけです。 具䜓的にどのようにするかは、 読者ぞの緎習問題ずしたしょう。
====

各行が重ね曞きされおしたった::
プリンタは玙送りをたったくしたせんでした。 テキストすべおの行がある行の䞊で重ねお印字されおしたいたした。 
+
この問題は、 階段珟象ずは "正反察" な問題で、 ほずんどたれにしか起こりたせん。FreeBSD では行末ずしお扱われる LF 文字が、玙の巊端に印字䜍眮を埩垰したすが、 玙送りはしない CR 文字ずしお扱われおいたす。
+
プリンタの蚭定スむッチかコントロヌルパネルを䜿っお、 LF ず CR の文字を次のような解釈をするようにしおください。 
+
[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| プリンタが受け取ったずき
| プリンタがおこなう

|CR
|CR 動䜜 (埩垰)

|LF
|CR + LF (埩垰、改行)
|===
+
[NOTE]
====
LF を CR+LF に眮き換える cat コマンドを䜜る方法も圓然考えられたす。 そしお、このコマンドず、 [.filename]#if-simple# の cat の郚分を眮き換えればよいわけです。 具䜓的にどのようにするかは、 読者ぞの緎習問題ずしたしょう。
====

プリンタが文字を玛倱しおしたう::
印字しおいるのですが、 各行の 2  3 文字が印字されたせん。 プリンタを動かせば動かすほど、 もっずたくさんの文字が玛倱されおいき、 この問題は曎に悪くなっおいくかもしれたせんでした。
+
この問題は、 シリアルポヌトを通しおコンピュヌタから送られおくるデヌタの速床に、 プリンタが぀いおいけないこずに起因したす (この問題は、パラレルポヌトに接続された プリンタでは発生するこずはありたせん)。 この問題を克服する方法が2぀ありたす。

** プリンタが XON/XOFF のフロヌ制埡をサポヌト しおいる堎合は、項目 `ms#` で `ixon` モヌドをセットしお、FreeBSD にこの機胜を䜿甚させおください。
** プリンタが Request to Send / Clear to Send ハヌドりェアハンドシェむク (通称 `RTS/CTS`) をサポヌトしお いる堎合は、項目 `ms#` で `crtscts` モヌドをセットしお䞋さい。それから、 プリンタずコンピュヌタを接続しおいるシリアルケヌブルが ハヌドりェアフロヌ制埡甚に正しく配線されたものかどうかを確認しおください。

プリンタは意味䞍明な文字列を印字した::
プリンタはランダムなゎミのように 芋えるものを印字したしたが、 意図したテキストは印字しおくれたせんでした。
+
この問題は、通垞、 シリアルポヌトに接続したプリンタでの 通信パラメヌタの誀りからくる前項ずは別の症状です。 `br` 項目の通信速床ず `ms#` 項目を再確認しおください。 たた、プリンタでの蚭定が [.filename]#/etc/printcap# ファむルで蚭定した 内容ず䞀臎しおいるかどうかも確認しおください。
+
[NOTE]
====
simple-if のような単玔なフィルタだけの状態で、 日本語を含むテキストを印字しようずした堎合にも、 シリアルポヌト、パラレルポヌトの䜿甚に関係なく、 このような症状は芋られたす。日本語プリンタの堎合、 挢字コヌドそのもの を送信しただけでその挢字を印字しおくれるものは、 少なくずも蚳者は芋たこずがありたせん。 挢字を印字するための制埡 コヌドを別途送信するフィルタが必芁ずなりたす。 たた、そのようなフィルタを䜿甚しおいおも、 そのフィルタが想定しおる挢字コヌドず異なった文曞を プリントしようずしたずきもこのような症状は出たす。 もちろん、これはプリンタ甚の 蚀語を持たないプリンタの話で、PostScript(R) プリンタ などにプレむンテキストを送信しおも、日本語察応、 非察応に関らず、意味䞍明な文字列が印字される (もしくは、䜕も印字されない) こずでしょう。
====

䜕も起きない::
もしプリンタが䜕の動䜜もしないのであれば、 ハヌド的な問題ではなく、倚分 FreeBSD の䞭に問題がありたす。 [.filename]#/etc/printcap# ファむルで、 デバッグしおいるプリンタの゚ントリに (`lf` 項目で) ログファむルを取るように 蚭定を远加しおください。たずえば、プリンタ `rattan` 甚の゚ントリの項目 `lf` は次のようになりたす。
+
[.programlisting]
....
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
....
+
次に、もう䞀床印字をおこなっおみたす。そしお、 発生したず思われる゚ラヌメッセヌゞを芋るためにログファむル (䞊蚘の䟋では、 [.filename]#/var/log/rattan.log#) を調べたす。そこで芋られたメッセヌゞを元に、 問題を解決しおみおください。
+
項目 `lf` が指定されおいない堎合、LPD はデフォルトのログファむルずしお [.filename]#/dev/console# を䜿いたす。