aboutsummaryrefslogblamecommitdiff
path: root/zh_CN.UTF-8/books/handbook/printing/chapter.xml
blob: 6a1f69ec3d7a94ce5ad195c21025970e9ac41682 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































                                                                                                                                                                                           
<?xml version="1.0" encoding="utf-8"?>
<!--
     The FreeBSD Documentation Project
     The FreeBSD Simplified Chinese Project

     Original Revision: 1.123
     $FreeBSD$
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="printing">
  <info><title>打印</title>
    <authorgroup>
      <author><personname><firstname>Sean</firstname><surname>Kelly</surname></personname><contrib>Contributed by </contrib></author>
      <!-- 30 Sept 1995 -->
    </authorgroup>
    <authorgroup>
      <author><personname><firstname>Jim</firstname><surname>Mock</surname></personname><contrib>Restructured and updated by </contrib></author>
    </authorgroup>
  </info>

  

  <sect1 xml:id="printing-synopsis">
    <title>概述</title>
    <indexterm><primary>LPD spooling system</primary></indexterm>
    <indexterm><primary>printing</primary></indexterm>

    <para>&os; 可以支持众多种类的打印机,
      从最古老的针式打印机到最新的激光打印机以及它们之间所有类型的打印机,
      令您运行的应用程序产生高质量的打印输出。</para>

    <para>&os; 也可以配置成网络打印服务器。 它可以从包括
      &os;&windows;&macos; 在内的多种其他计算机上接收打印任务。
      &os; 将保证打印任务之间不会相互干扰并一次性完成,
      而且能够对机器或用户提交打印任务的情况进行统计并找到其中用量最多的人,
      以及生成用于标识打印任务属于哪位用户的 <quote>标签</quote> 页等等。</para>

    <para>在读完这章后,您将知道:</para>

    <itemizedlist>
      <listitem>
	<para>怎样配置 &os; 后台打印。</para>
      </listitem>

      <listitem>
	<para>怎样安装打印过滤器来对特殊的打印任务做特殊的处理,
      包括把传来的文档转换成打印机能理解的格式。</para>
      </listitem>

      <listitem>
	<para>怎样在打印输出上开启报头或者横幅页功能。</para>
      </listitem>

      <listitem>
	<para>怎样打印到连接在其他计算机上的打印机。</para>
      </listitem>

      <listitem>
	<para>怎样打印到直接连接在网络上的打印机。</para>
      </listitem>

      <listitem>
	<para>怎样控制打印机的限制, 包括限制打印任务的大小和阻止某些用户打印。</para>
      </listitem>

      <listitem>
	<para>怎样记录打印机统计表和使用情况。</para>
      </listitem>

      <listitem>
	<para>怎样解决打印故障。</para>
      </listitem>
    </itemizedlist>

    <para>在读这章之前, 您应该:</para>

    <itemizedlist>
      <listitem>
	<para>知道怎样配置并安装新内核
	  (<xref linkend="kernelconfig"/>)。</para>
      </listitem>
    </itemizedlist>
  </sect1>

  <sect1 xml:id="printing-intro-spooler">
    <title>介绍</title>

    <para>为了在 &os; 中使用打印机,
      需要首先配置好伯克利行式打印机后台打印系统即
      <application>LPD</application>。
      它是 &os; 的标准打印控制系统。 这章介绍 <application>LPD</application>
      后台打印系统, 在接下来将简称为 <application>LPD</application>,
      并且将指导您完成其配置。</para>

    <para>如果您已经熟悉了
      <application>LPD</application> 或者其他后台打印系统, 则可以跳到 <link linkend="printing-intro-setup">设置后台打印系统</link> 这部分。</para>

    <para><application>LPD</application> 完全控制一台计算机上的打印机。
      它负责许多的事情:</para>

    <itemizedlist>
      <listitem>
	<para>它控制本地和连接在网络上其他计算机上打印机的访问。</para>
      </listitem>

      <listitem>
	<indexterm><primary>print jobs</primary></indexterm>

	<para>它允许用户提交要打印的文件;
      这些通常被认为是<emphasis>任务</emphasis></para>
      </listitem>

      <listitem>
	<para>它为每个打印机维护一个 <emphasis>队列</emphasis> 来防止多个用户在同一时刻访问一台打印机。</para>
      </listitem>

      <listitem>
	<para>它可以打印<emphasis>报头</emphasis>(也叫做<emphasis>banner</emphasis>或者<emphasis>
      burst</emphasis>页使用户可以轻松的从一堆打印输出中找到它们打印的任务。</para>
      </listitem>

      <listitem>
	<para>它来设置连接在串口上的打印机的通讯参数。</para>
      </listitem>

      <listitem>
	<para>它能通过网络将任务发送到另外一台计算机的
	  <application>LPD</application>后台打印队列中。</para>
      </listitem>

      <listitem>
	<para>它可以根据不同种类的打印机语言和打印机的性能运行特殊的过滤器来格式化任务。</para>
      </listitem>

      <listitem>
	<para>它记录打印机的使用情况。</para>
      </listitem>
    </itemizedlist>

    <para>通过配置文件
      (<filename>/etc/printcap</filename>)和提供的特殊过滤程序,
您可以使<application>LPD</application>
      系统在众多种类的打印机硬件上完成上面全部的或者一些子集的功能。</para>

    <sect2 xml:id="printing-intro-why">
      <title>为什么要用后台打印</title>

      <para>如果您是系统唯一的用户, 您可能会奇怪为什么要在您不需要访问控制,
        报头页或者打印机使用统计时为后台打印费心。
	它可以设置成允许直接访问打印机, 但您还是应该使用后台打印, 因为:</para>

      <itemizedlist>
	<listitem>
	  <para><application>LPD</application>在后台打印任务; 您不用被迫等待数据被完全副本到打印机的时间。</para>
	</listitem>

	<listitem>
	  <indexterm><primary>&tex;</primary></indexterm>

	  <para><application>LPD</application>可以可以方便的通过过滤器给任务加上日期/
	  时间的页眉或者把一种特殊的文件格式 (比如&tex; DVI 文件) 转换成一种打印机可以理解的格式。 您不必去手动做这些步骤。</para>
	</listitem>

	<listitem>
	  <para>许多提供打印功能的免费和商业程序想要和您计算机上的的后台打印系统通讯。
	  通过设置后台打印系统, 您将更轻松的支持其他以后要添加的或者现有的软件。</para>
	</listitem>
      </itemizedlist>
    </sect2>
  </sect1>

  <sect1 xml:id="printing-intro-setup">
    <title>基本设置</title>

    <warning>
      <para>&os; 8.0 起, 串口对应的设备名由
	<filename>/dev/ttydN</filename> 变为
	<filename>/dev/ttyuN</filename>&os;&nbsp;7.X 用户应将这篇文档的示例中的设备名改为原先的样子。</para>
    </warning>

    <para>要想在 <application>LPD</application>后台打印系统上使用打印机,
      您需要设置打印机硬件和
      <application>LPD</application>软件。 这个
      文档描述了这两级设置:</para>

    <itemizedlist>
      <listitem>
	<para>参见<link linkend="printing-simple">简单打印机
	  设置</link>来了解怎样连接一个打印机, 告诉
	  <application>LPD</application>怎样与
	  它通讯, 并且打印纯文本到
	  打印机。</para>
      </listitem>

      <listitem>
	<para>参见 <link linkend="printing-advanced">高级打印机设置</link>
	  来了解怎样打印多种
	  特殊格式的文件, 怎样打印报头页, 怎样通过网络
	  打印, 怎样控制打印机的访问权限, 并且学会为打印
	  作业记帐统计。</para>
      </listitem>
    </itemizedlist>

    <sect2 xml:id="printing-simple">
      <title>简单打印机设置</title>

      <para>这部分讲解怎样配置打印机硬件和
	<application>LPD</application>使之与打印机配合。
	讲解的基础知识有:</para>

      <itemizedlist>
	<listitem>
	  <para><link linkend="printing-hardware">硬件
	    设置</link>部分将讲解怎样把一台打印机连接到
	    您计算机的一个端口上。</para>
	</listitem>

	<listitem>
	  <para><link linkend="printing-software">软件
	    设置</link>部分将讲解怎样配置
	    <application>LPD</application>后台打印的配置
	    文件 (<filename>/etc/printcap</filename>)。</para>
	</listitem>
      </itemizedlist>

      <para>如果您正在设置一台通过网络协议
	接收数据来打印而不是通过串口或者并口的打印机,
	参见 <link linkend="printing-advanced-network-net-if">使用网络数据流界面的打印机</link></para>

      <para>尽管这部分叫<quote>简单打印机
	设置</quote>, 但还是相当复杂的。 使打印机
	配合 <application>LPD</application>
	后台打印系统在计算机上正常运转是最难的
	部分。 一旦您的打印机可以正常工作后,那些高级选项, 比如报文页和记帐,
	是相当简单的。</para>

      <sect3 xml:id="printing-hardware">
	<title>硬件设置</title>

	<para>这部分讲述了打印机连接到计算机的多种
	  途径。 主要讨论了多种接口和
	  连接线, 还有允许 &os; 与打印机通讯所需的
	  内核配置。</para>

	<para>如果您已经连接好了您的打印机而且已经
	  用它在另外一个操作系统下成功的打印, 您
	  或许可以跳到这个部分<link linkend="printing-software">软件设置</link></para>

	<sect4 xml:id="printing-ports">
	  <title>端口和连接电缆</title>

	  <para>现在所出售的在 PC 上使用的打印机通常至少有
	    以下三种接口中的一个:</para>

	  <itemizedlist>
	    <listitem>
	      <indexterm>
		<primary>printers</primary>
		<secondary>serial</secondary>
	      </indexterm>

	      <para><emphasis>串口</emphasis>, 也叫 RS-232 或者 COM 口,
		使用您计算机上的串口来发送数据到打印机。
		串口在计算机上已经非常普遍,
		而且电缆也非常容易买到且容易制作。
		串口有时需要特殊的电缆,
		而且可能需要您去配置稍微有点儿复杂的通讯选项。
		大多数 PC 的串口的最高传输速度只有 115200&nbsp;bps,
		这使得打印很大的图像需要的时间很长。</para>
	    </listitem>

	    <listitem>
	      <indexterm>
		<primary>printers</primary>
		<secondary>parallel</secondary>
	      </indexterm>

	      <para><emphasis>并口</emphasis>
		使用计算机上的并口来发送数据到打印机。
		并口在计算机上也已经非常普遍,
		而且速度高于 RS-232 串口。 电缆非常容易买到,
		但很难手工制作。 并口通常没有通讯选项,
		这使得配置它相当简单。</para>

	      <indexterm>
	        <primary>centronics</primary>
		<see>parallel printers</see>
	      </indexterm>
	      <para>并口按打印机上的接头来命名也叫做
		<quote>Centronics</quote>接口。</para>
	    </listitem>

	    <listitem>
	      <indexterm>
		<primary>printers</primary>
		<secondary>USB</secondary>
	      </indexterm>

	      <para>USB 接口, 即通用串行总线,
	        可以达到比并口和串口高很多的速度。 其电缆既简单又便宜。
	        USB 用来打印比串口和并口更有优势, 但 &unix;
	        系统不能很好的支持它。 避免这个问题的方法就是购买一台
	        像大多数打印机一样的既有 USB 接口又有并口的
	        打印机。</para>
	    </listitem>
	  </itemizedlist>

	  <para>一般来说并口只提供单向通讯
	    (计算机到打印机), 而串口和
	    USB 则可以提供双向通讯。 新的并口 (EPP 和
	    ECP) 及打印机在使用了
	    IEEE-1284 标准的电缆之后, 可以在 &os; 下双向通讯。</para>

	  <indexterm><primary>PostScript</primary></indexterm>

	  <para>与打印机通过并口双向通讯通常由这两种方法中的一种来完成。
	    第一个方法是使用为 &os;
	    编写的可以通过打印机使用的语言与打印机通讯的驱动程序。
	    这通常用在喷墨打印机上,
	    且可以用来报告剩余墨水多少和其他状态信息。
	    第二种方法使用在支持
	    &postscript; 的打印机上。</para>

	  <para>&postscript; 任务事实上由程序发送给打印机;
	    但它并不进行打印而是直接将结果返回给计算机。
	    &postscript; 也采取双向通讯来将打印中的问题报告给计算机,
	    比如 &postscript; 程序中的错误或者打印机卡纸。
	    这些信息对于用户来说也许是非常有价值的。 此外,
	    最好的在支持 &postscript;
	    的打印机上记帐的方法需要双向通讯:
	    询问打印机打印总页数 (打印机从出厂一共打印过多少页),
	    然后发送用户的任务, 之后再次查询总打印页数。
	    将打印前后得到的两个值相减就可以得到该用户要付多少纸钱。</para>
	</sect4>

	<sect4 xml:id="printing-parallel">
	  <title>并口</title>

	  <para>用并口连接打印机需要用 Centronics
	    电缆把打印机与计算机连接起来。
	    具体说明指导在打印机, 计算机的说明书上应该有,
	    或者干脆两个上面都有。</para>

	  <para>记住您用的计算机上的哪个并口。
	    第一个并口在 &os; 上叫
            <filename>/dev/ppc0</filename>;
	    第二个叫
            <filename>/dev/ppc1</filename>,
            依此类推。打印机设备也用同样的方法命名:
	    <filename>/dev/lpt0</filename>
	    是接在第一个并口上的打印机, 依此类推。</para>
	</sect4>

	<sect4 xml:id="printing-serial">
	  <title>串口</title>

	  <para>用串口连接打印机需要用
	    合适的串口电缆把打印机与计算机连接起来。 具体
	    说明指导应该在打印机, 计算机的说明书上有, 或者
	    同样干脆两个上面都有。</para>

	  <para>如果您不确定什么样儿的电缆才是 <quote> 合适的串口
	    电缆 </quote> , 您可以尝试以下几种不同的
	    电缆:</para>

	  <itemizedlist>
	    <listitem>
	      <para><emphasis>调制解调器</emphasis> 电缆每一端的
		每一根引脚都直接连接到另一端
		相应的引脚
		上。 这种电缆也叫做
		<quote>DTE-to-DCE</quote> 电缆。</para>
	    </listitem>

	    <listitem>
	      <indexterm><primary>null-modem cable</primary></indexterm>

	      <para><emphasis>非调制解调器</emphasis>电缆上每一端的有些引脚
		是与另一端相应引脚直接连接的, 而有一些则是交叉连接的 (比如, 发送数据引脚连接到
		接收数据引脚 ), 还有一些引脚直接在电缆连接头儿内
		短接。 这种电缆也叫做
		<quote>DTE-to-DTE</quote> 电缆。</para>
	    </listitem>

	    <listitem>
	      <para>一些特殊的打印机需要的<emphasis>串口打印机</emphasis> 电缆,
		是一种和非调制解调器电缆类似的电缆,
		只是一些信号还是送到了另一端, 而
		不是直接在连接头儿内短路。</para>
	    </listitem>
	  </itemizedlist>

	  <indexterm><primary>baud rate</primary></indexterm>
	  <indexterm><primary>parity</primary></indexterm>
	  <indexterm><primary>flow control protocol</primary></indexterm>
	  <para>当然, 您还得为打印机设置通讯参数。
	    一般是通过打印机面板上的按钮或者 DIP
	    开关进行设置。 在计算机和打印机上都选择它们所支持的最高
	    <literal>波特</literal> (每秒多少比特, 有时也叫
	    <emphasis>波特率</emphasis>) 的传输速率。
	    选择7或者8个数据位; 选择不校验,
	    偶校验或者奇校验; 选择1个或2个停止位。 还要选择流量控制协议:
	    无, XON/XOFF (也叫做
	    <quote>in-band</quote><quote>软件</quote>) 流量控制。
	    记住您的软件配置中的参数也要设成上面的数值。</para>
	</sect4>
      </sect3>

      <sect3 xml:id="printing-software">
	<title>软件设置</title>

	<para>这部分描述了要使用 &os; 系统中的
	  <application>LPD</application> 后台打印系统进行打印所需的软件设置。
	</para>

	<para>包括这几个步骤:</para>

	<procedure>
	  <step>
	    <para>在需要的时候配置内核来允许您连接
	      打印机的端口;  <link linkend="printing-kernel">配置内核</link> 部分会告诉您
	      需要做什么。</para>
	  </step>

	  <step>
	    <para>如果您使用并口, 则需要设置一下
	      并口的通讯模式; <link linkend="printing-parallel-port-mode">设置
	      并口通讯模式</link> 部分会告诉您具体的
	      细节。</para>
	  </step>

	  <step>
	    <para>测试操作系统是否能够发送数据到打印机。
	      <link linkend="printing-testing">检测打印机
	      联机状况</link> 部分会告诉您要怎样
	      做。</para>
	  </step>

	  <step>
	    <para><application>LPD</application> 设置与打印机匹配的参数则
	      通过修改
	      <filename>/etc/printcap</filename> 这个文件来完成。 这章后面
	      的部分将讲解如何来完成设置。</para>
	  </step>
	</procedure>

	<sect4 xml:id="printing-kernel">
	  <title>配置内核</title>

	  <para>操作系统的内核为了使某些特殊设备工作需要重新
	    编译。 打印机所用的串口、
	    并口就属于那些特殊设备。 因此, 可能需要
	    添加对串口或并口的支持,
	    如果内核并没有配置它们的话。</para>

	  <para>要想知道您现在使用的内核是否支持串口,
	    输入:</para>

	  <screen>&prompt.root; <userinput>grep sioN /var/run/dmesg.boot</userinput></screen>

	  <para>其中 <replaceable>N</replaceable> 是串口的
	    编号, 从0开始。 如果您看到
	    类似下面的输出:</para>

	  <screen>sio2 at port 0x3e8-0x3ef irq 5 on isa
sio2: type 16550A</screen>

	  <para>则说明您现在使用的内核支持串口。</para>

	  <para>要想知道您现在使用的内核是否支持并口,
	    输入:</para>

	  <screen>&prompt.root; <userinput>grep ppcN /var/run/dmesg.boot</userinput></screen>

	  <para>其中 <replaceable>N</replaceable> 是并口的
	    编号, 同样从0开始。 如果得到类似
	    下面的输出:</para>

	    <screen>ppc0: &lt;Parallel port&gt; 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</screen>

	    <para>那么您现在使用的内核支持并口。</para>

	  <para>您可能必须为了使操作系统支持您打印机需要的串口或
	    并口而
	    重新配置内核。</para>

	  <para>要增加对串口的支持, 参见
	    内核配置这部分。 要增加对并口的支持, 除了参见
	    上面提到的那部分之外, <emphasis>还要</emphasis> 参见下面的
	    部分。</para>
	</sect4>
      </sect3>

	<sect3 xml:id="printing-parallel-port-mode">
	  <title>设置并口的通讯模式</title>

	  <para>在使用并口时, 您可以选择
	    让 &os; 用中断方式还是轮询方式来
	    与打印机通讯。 在 &os; 上,
	    通用的打印机驱动 (&man.lpt.4;) 使用 &man.ppbus.4; 系统,
	    它利用 &man.ppc.4; 驱动来控制端口芯片。</para>

	  <itemizedlist>
	    <listitem>
	      <para><emphasis>中断</emphasis> 方式是 GENERIC 核心的默认方式。
		在这种方式下, 操作系统占用一条中断请求线来检测打印机是否已经做好接收数据的准备。</para>
	    </listitem>

	    <listitem>
	      <para><emphasis>轮询</emphasis>
		方式是操作系统反复不断的询问打印机是否做好接收数据的准备。
		当它返回就绪时, 核心开始发送下面要发送的数据。</para>
	    </listitem>
	  </itemizedlist>

	  <para>中断方式速度通常会快一些,
	    但却占用了一条宝贵的中断请求线。 一些新出的 HP 打印机
	    不能正常的工作在中断模式下,
	    是由于一些定时问题 (还没正确的理解)
	    造成的。 这些打印机需要使用轮询方式。 您应该使用
	    任何一种方式, 只要它能正常工作就行。 一些打印机虽然在两种模式下都可以
	    工作, 但在中断模式下会慢的要命。</para>

	  <para>您可以用以下两种方法设定通讯模式: 通过
	    配置内核或者使用 &man.lptcontrol.8;
	    这个程序。</para>

	  <para><emphasis>要通过配置内核的方法设置
	    通讯模式:</emphasis></para>

	  <procedure>
	    <step>
	      <para>修改内核配置文件。 找到
		一个叫 <literal>ppc0</literal> 的记录。 如果您想要设置的是
		第二个并口, 那么用 <literal>ppc1</literal>
		代替。 使用第三个并口的时候用 <literal>ppc2</literal> 代替,
		依此类推。</para>

	      <itemizedlist>
		<listitem>
		  <para>如果您希望使用中断驱动模式,
		    则应编辑下面的配置:</para>

		  <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting>

		  <para>它在 <filename>/boot/device.hints</filename> 这个文件中,
		    其中 <replaceable>N</replaceable> 用正确的中断
		    编号代替。 同时, 核心配置文件也必须
		    包括 &man.ppc.4; 的驱动:</para>

		  <screen>device ppc</screen>

		</listitem>

		<listitem>
		  <para>如果您想要使用轮询方式, 只需要把
		    <filename>/boot/device.hints</filename>
		    这个文件中的下面这行删除掉:</para>

		  <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting>

		  <para>在 &os; 下, 有时上面的方法并不能使并口工作在轮询方式。
		    大多数情况是由于 &man.acpi.4; 驱动造成的,
		    它可以自动侦测到设备并将其挂载到系统上, 但也因此,
		    它控制着打印机端口的访问模式.  您需要检查 &man.acpi.4;
		    的配置来解决这个问题。</para>
		</listitem>
	      </itemizedlist>
	    </step>

	    <step>
	      <para>保存文件。 然后配置, 建立, 并安装刚配置的内核,
		最后重新启动。 参见 <link linkend="kernelconfig">内核配置</link> 这章来获得更多细节。</para>
	    </step>
	  </procedure>

	  <para><emphasis>使用</emphasis>
	    &man.lptcontrol.8; <emphasis>设置通讯模式</emphasis>:</para>

	  <procedure>
	    <step>
	      <para>输入:</para>

	      <screen>&prompt.root; <userinput>lptcontrol -i -d /dev/lptN</userinput></screen>

	      <para>将
		<literal>lptN</literal> 设置成中断方式。</para>
	    </step>

	    <step>
	      <para>输入:</para>

	      <screen>&prompt.root; <userinput>lptcontrol -p -d /dev/lptN</userinput></screen>

	      <para>将
		<literal>lptN</literal> 设置成轮询方式。</para>
	    </step>
	  </procedure>

	  <para>您可以把这些命令加入到
	    <filename>/etc/rc.local</filename> 这个文件中, 这样每次启动系统
	    时都会设置成您想要的方式。 参见 &man.lptcontrol.8; 来获得
	    更多信息。</para>
	</sect3>

	<sect3 xml:id="printing-testing">
	  <title>检测打印机的通讯</title>

	  <para>在设置后台打印系统之前,
	    您应该确保您的计算机可以把数据
	    发送到打印机上。 分别独立调试打印机的通讯和后台打印系统会更简单。</para>

	  <para>我们为了测试打印机,将发送一些文本给它。 一个叫 &man.lptest.1;
	    的程序能胜任这项工作, 它可以让打印机立即打印出程序发给它的
	    字符: 它在每行打出
	    可以打印的 96 个 ASCII 字符。</para>

	  <indexterm><primary>PostScript</primary></indexterm>
	  <para>当我们使用的是一台 &postscript; ( 或者以其他语言为基础的 ) 打印机, 那么
	    需要更仔细的检测。 一段小小的 &postscript;
	    程序足以完成检测的任务, 比如下面这段程序:</para>

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

	  <para>可以把上面这段 &postscript; 代码写进一个文件里,
	    并且像下面部分的例子里那样
	    使用。</para>

	  <indexterm><primary>PCL</primary></indexterm>
	  <note>
	    <para>上面的小程序是针对 &postscript; 而不是惠普的 PCL 写的。
	      由于 PCL 拥有许多其他打印机没有的强大功能,
	      比如它支持在打印纯文本的同时夹带特殊的命令, 而
	      &postscript; 则不能直接打印纯文本,
	      所以需要对这类打印机语言进行特殊的处理。</para>
	  </note>

	  <sect4 xml:id="printing-checking-parallel">
	    <title>检测并口打印机</title>

	    <indexterm>
        <primary>printers</primary>
        <secondary>parallel</secondary>
      </indexterm>
	    <para>这部分内容将指导您怎样检测 &os;
	      是否可以与一台已经连接在并口上的打印机通讯。</para>

	    <para><emphasis>要测试并口上的打印机:</emphasis></para>

	    <procedure>
	      <step>
		<para>用 &man.su.1; 命令转换到 <systemitem class="username">root</systemitem> 用户。</para>
	      </step>

	      <step>
		<para>发送数据到打印机。</para>

		<itemizedlist>
		  <listitem>
		    <para>如果打印机可以直接打印纯文本, 可以用
		      &man.lptest.1;。 输入:</para>

		    <screen>&prompt.root; <userinput>lptest &gt; /dev/lptN</userinput></screen>

		    <para>其中 <replaceable>N</replaceable>
		      是并口的编号, 从0开始。</para>
		  </listitem>

		  <listitem>
		    <para>如果打印机支持 &postscript; 或其他打印机语言,
		      可以发送一段小程序到打印机。 输入:</para>

		    <screen>&prompt.root; <userinput>cat &gt; /dev/lptN</userinput></screen>


		    <para>然后, 一行一行地 <emphasis>输入</emphasis>
		      输入这段程序。 因为在按下 <literal>换行</literal> 或者
		      <literal>回车</literal> 之后, 这一行就不能再修改了。
		      当您输入完这段程序之后, 按
		      <literal>CONTROL+D</literal>,
		      或者其他表示文件结束的键。</para>

		    <para>另外一种办法,
		      您可以把这段程序写在一个文件里, 并输入:</para>

                    <screen>&prompt.root; <userinput>cat file &gt; /dev/lptN</userinput></screen>

		    <para>其中 <replaceable>file</replaceable>
		      是包含这您要发给打印机程序的文件名。</para>
		  </listitem>
		</itemizedlist>
	      </step>
	    </procedure>

	    <para>之后, 您应该看到打印出了一些东西。
	      如果打印出的东西看起来并不正确, 请不要着急;
	      我们将在后面指导您如何解决这类问题。</para>
	  </sect4>

	  <sect4 xml:id="printing-checking-serial">
	    <title>检测串口打印机</title>

	    <indexterm>
        <primary>printers</primary>
        <secondary>serial</secondary>
      </indexterm>
	    <para>这部分将告诉您如何检测 &os;
	      是否可以与连接在串口上的打印机通讯。</para>

	    <para><emphasis>要测试连接在串口上的打印机:</emphasis></para>

	    <procedure>
	      <step>
		<para>通过 &man.su.1; 命令转为 <systemitem class="username">root</systemitem> 用户。</para>
	      </step>

	      <step>
		<para>修改 <filename>/etc/remote</filename> 这个文件。
		  增加下面这些内容:</para>

		<programlisting>printer:dv=<filename>/dev/port</filename>:br#<replaceable>bps-rate</replaceable>:pa=<replaceable>parity</replaceable></programlisting>

		<indexterm><primary>bits-per-second</primary></indexterm>
		<indexterm><primary>serial port</primary></indexterm>
		<indexterm><primary>parity</primary></indexterm>
		<para>其中 <replaceable>port</replaceable>
		  是串口的设备节点 (<literal>ttyu0</literal>、
		  <literal>ttyu1</literal>, 等等),
		  <replaceable>bps-rate</replaceable>
		  是与打印机通讯时使用的速率, 而
		   <replaceable>parity</replaceable>
		  是通讯时打印机要求的校验方法 (应该是 <literal>even</literal>、
		  <literal>odd</literal>、 <literal>none</literal>, 或
		  <literal>zero</literal> 之一)。</para>

		<para>这儿有一个串口打印机的例子,
		  它连接在第三个串口上, 速度为 19200 &nbsp; 波特,
		  不进行校验:</para>

		<programlisting>printer:dv=<filename>/dev/ttyu2</filename>:br#19200:pa=none</programlisting>
	      </step>

	      <step>
		<para>用 &man.tip.1; 连接打印机。
		  输入:</para>

		<screen>&prompt.root; <userinput>tip printer</userinput></screen>

		<para>如果没能成功, 则要再次修改
		  <filename>/etc/remote</filename> 这个文件, 并且试试用
		  <filename>/dev/cuaaN</filename>
		   代替
		  <filename>/dev/ttydN</filename>。</para>
	      </step>

	      <step>
		<para>发送数据到打印机。</para>

		<itemizedlist>
		  <listitem>
		    <para>如果打印机可以直接打印纯文本, 则用
		      &man.lptest.1;。 输入:</para>

		    <screen>&prompt.user; <userinput>$lptest</userinput></screen>
		  </listitem>

		  <listitem>
		    <para>如果打印机支持 &postscript; 或者其他
		      打印机语言, 则发送一段小程序到
		      打印机。 一行一行的输入程序, 必须
		      <emphasis>非常仔细</emphasis> 因为像退格
		      或者其他编辑键也许对打印机来说有它的
		      意义。 您同样也需要按一个特殊的
		      文件结束键, 让打印机知道它已经
		      接收了整个程序。 对于 &postscript;
		      打印机, 按 <literal>CONTROL+D</literal>。</para>

		    <para>或者, 您同样也可以把程序存储在一个文件里
		      并输入:</para>

		    <screen>&prompt.user; <userinput>&gt;file</userinput></screen>

		    <para>其中 <replaceable>file</replaceable> 是
		      包含要发送程序的文件名。 在
		      &man.tip.1; 发送这个文件之后, 按代表
		      文件结束的键。</para>
		  </listitem>
		</itemizedlist>
	      </step>
	    </procedure>

	    <para>您应该看到打印出了一些东西。
	      如果它们看起来并不正确也不要着急;
	      我们将在稍后的章节中介绍如何解决这类问题。</para>
	  </sect4>
	</sect3>

      <sect3 xml:id="printing-printcap">
	<title>启用后台打印: 文件 <filename>/etc/printcap</filename>
	  </title>

	<para>目前, 您的打印机应该已经连好了线,
	  系统内核也为与打印机联机而重新配置好 (如果需要的话),
	  而且您也已经可以发送一些简单的数据到打印机。 现在,
	  我们要配置 <application>LPD</application> 来使其控制您的打印机。</para>

	<para>配置 <application>LPD</application> 要修改
	  <filename>/etc/printcap</filename> 这个文件。 由于
	  <application>LPD</application> 后台打印系统在每次使用后台打印的时候,
	  都会读取这个文件, 因此对这个文件的修改会立即生效。</para>

	<indexterm>
    <primary>printers</primary>
    <secondary>capabilities</secondary>
  </indexterm>
	<para>&man.printcap.5; 这个文件的格式很简单。
	  您可以用您最喜欢的文本编辑器来修改
	  <filename>/etc/printcap</filename> 这个文件。
	  这种格式和其他的像
	  <filename>/usr/share/misc/termcap</filename> 和
	  <filename>/etc/remote</filename> 这类文件是一样的。
	  要得到关于这种格式的详尽信息,
	  请参阅联机手册 &man.cgetent.3;。</para>

	<para>简单的后台打印配置包括下面的几步:</para>

	<procedure>
	  <step>
	    <para>给打印机起一个名字 (记忆和使用的别名), 然后把它们写进文件
	      <filename>/etc/printcap</filename>; 参见
	      <link linkend="printing-naming">如何为打印机命名</link>
	      这章来得到更多的关于起名的帮助。</para>
	  </step>

	  <step>
	    <indexterm><primary>header pages</primary></indexterm>

	    <para>通过增加 <literal>sh</literal> 项关掉报头页
	      (它默认是启用的); 参见
	      <link linkend="printing-no-header-pages">如何禁用报头页</link>
	      部分来得到更多信息。</para>
	  </step>

	  <step>
	    <para>建立一个后台打印队列的目录, 并且通过
	       <literal>sd</literal> 项目指定它的位置; 您可参见 <link linkend="printing-spooldir">创建后台打印队列目录</link>
	      一节了解更多信息。</para>
	  </step>

	  <step>
	    <para>在 <filename>/dev</filename> 下设置打印机设备节点,
	      并且在写在 <filename>/etc/printcap</filename>
	      文件中 <literal>lp</literal> 项目里; 参见 <link linkend="printing-device">识别打印机设备</link>
	      这部分可以得到更多信息。 此外, 如果打印机连接在串口上,
	      通讯参数的设置需要写在
	       <literal>ms#</literal> 项中。 这些参数在 <link linkend="printing-commparam">配置后台打印通讯参数</link>
	      这在前面已经讨论过。</para>
	  </step>

	  <step>
	    <para>安装纯文本过滤器; 详情请参见 <link linkend="printing-textfilter">安装文本过滤器</link> 小节。</para>
	  </step>

	  <step>
	    <para>用
	      &man.lpr.1; 命令来测试设置。 想得到更多信息可以参见
	      <link linkend="printing-trying">测试</link> 和
	      <link linkend="printing-troubleshooting">故障排除</link>
	      部分。</para>
	  </step>
	</procedure>

	<note>
	  <para>使用打印机语言的打印机, 如 &postscript; 打印机,
	    通常是不能直接打印纯文本的。 前面提到,
	    并且将在后面继续进行介绍的简单的设置方法,
	    均假定您正在安装这种只能打印它能识别的文件格式的打印机。</para>
	</note>

	<para>用户通常会希望直接在系统提供的打印机上打印纯文本。 采用
	   <application>LPD</application> 接口的程序也通常是这样设计的。
	  如果您正在安装这样一台打印机,
	  并且希望它不仅能打印使用它支持的打印机语言的任务
	  <emphasis>而且</emphasis> 还能打印纯文本的任务的话,
	  那么强烈建议您在上面提到的简单设置的步骤上增加一步:
	  安装从自动纯文本到 &postscript; (或者其他打印机语言)
	  的转换程序。 更多的细节, 请参见 <link linkend="printing-advanced-if-conversion">在
	   &postscript; 打印机上打印纯文本</link>。</para>

	<sect4 xml:id="printing-naming">
	  <title>打印机的命名</title>

	  <para>第一步 (简单) 就是给打印机起一个名字。
	    您是按功能起名字还是干脆起个古怪的名字都没有关系,
	    因为您可以给打印机设置许多的别名。</para>

	  <para>在
	    <filename>/etc/printcap</filename> 里至少有一个打印机必须指定, 别名是
	    <literal>lp</literal>。 这是默认的打印机名。
	    如果用户既没有 <envar>PRINTER</envar> 环境变量, 也没有在任何
	     <application>LPD</application> 命令的命令行中指定打印机名,
	    则 <literal>lp</literal> 将是默认要使用的打印机。</para>

	  <para>还有, 我们通常把最后一个别名设置成能完全描述打印机的名字,
	    包括厂家和型号。</para>

	  <para>一旦您选好了名字或者一些别名, 把它们放进文件
	    <filename>/etc/printcap</filename> 里。
	    打印机的名字应该从最左边的一列写起。 用竖杠来隔开每个别名,
	    并且在最后一个别名后面加上一个冒号。</para>

	  <para>在下面的例子中, 我们从一个基本的
	    <filename>/etc/printcap</filename> 开始, 它只定义了两台打印机
	    (一台 Diablo 630 行式打印机和一台 Panasonic KX-P4455 &postscript;
	    激光打印机 ):</para>

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

	  <para>在这个例子中, 第一台打印机被命名为
	    <literal>rattan</literal> 并且设置了
	    <literal>line</literal>, <literal>diablo</literal>,
	    <literal>lp</literal>, 和 <literal>Diablo 630 Line
	    Printer</literal> 这几个别名。 因为它被设置了
	    <literal>lp</literal> 这个别名, 所以它是默认打印机。 第二台
	    被命名为 <literal>bamboo</literal>, 并且设置了
	    <literal>ps</literal>, <literal>PS</literal>,
	    <literal>S</literal>, <literal>panasonic</literal>, 和
	    <literal>Panasonic KX-P4455 PostScript v51.4</literal> 这几个别名。</para>
	</sect4>

	<sect4 xml:id="printing-no-header-pages">
	  <title>不打印报头页</title>
	  <indexterm>
      <primary>printing</primary>
      <secondary>header pages</secondary>
    </indexterm>

	  <para><application>LPD</application> 后台打印系统默认
	    会为每个任务打印
	    <emphasis>报头页</emphasis>。 报头页
	    包含了发送这个任务的用户,
	    发送这个任务的计算机, 任务的名字,
	    并用大字母打出。 但不幸的是, 所有这些额外的文本,
	    都会给在对打印机进行最初的配置时排除故障带来困难,
	    所以我们将先不打印报头页。</para>

	  <para>要暂停打印报头页, 为打印机的记录增加 <literal>sh</literal>
	    标记, 在
	    <filename>/etc/printcap</filename> 文件中。 这儿有一个
	    <filename>/etc/printcap</filename> 文件中使用 <literal>sh</literal>
	     的例子: </para>

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

	  <para>注意我们的正确格式: 第一行从最左边一列开始,
	    而后的每一行用 TAB 缩进一次。
	    一行写不下需要换行时, 在换行前打一个反斜杠。</para>
	</sect4>

	<sect4 xml:id="printing-spooldir">
	  <title>建立后台打印队列目录</title>
	  <indexterm><primary>printer spool</primary></indexterm>
	  <indexterm><primary>print jobs</primary></indexterm>

	  <para>下一步设置就是要建立一个
	    <emphasis>后台打印队列目录</emphasis>,
	    也就是在打印任务最终完成之前用于存放这些任务的目录,
	    这个目录中也会存放后台打印系统用到的其他一些文件。</para>

	  <para>由于后台打印队列目录的变量本质, 通常
	    把这些目录安排在
	    <filename>/var/spool</filename> 下。 您也没有必要去
	    备份后台打印队列目录里的内容。
	    重新建立它们只要简单的使用 &man.mkdir.1; 命令。</para>

	  <para>通常, 我们习惯将目录名起成和
	    打印机一样的名字, 像下面
	    这样:</para>

	  <screen>&prompt.root; <userinput>mkdir /var/spool/printer-name</userinput></screen>

	  <para>然而, 如果您有很多网络打印机,
	    您可能想要把这些后台打印的队列目录目录放在一个单独的专为使用
	    <application>LPD</application> 打印而准备的目录里。
	    我们将用我们的两台打印机
	    <literal>rattan</literal> 和
	    <literal>bamboo</literal> 作为例子:</para>

	  <screen>&prompt.root; <userinput>mkdir /var/spool/lpd</userinput>
&prompt.root; <userinput>mkdir /var/spool/lpd/rattan</userinput>
&prompt.root; <userinput>mkdir /var/spool/lpd/bamboo</userinput></screen>

	  <note>
	    <para>如果担心用户任务的保密性,
	      可能会希望保护相应的后台打印队列目录, 使之不能被其他用户访问。
	      后台打印的队列目录的属主应该是 daemon 用户,
	      而 <systemitem class="username">daemon</systemitem> 用户和 <systemitem class="groupname">daemon</systemitem>
              组拥有读写和搜索的权限,但其他用户没有。
              接下来用我们的两台打印机作为例子:</para>

	    <screen>&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/rattan</userinput>
&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/bamboo</userinput>
&prompt.root; <userinput>chmod 770 /var/spool/lpd/rattan</userinput>
&prompt.root; <userinput>chmod 770 /var/spool/lpd/bamboo</userinput></screen>
	  </note>

	  <para>最后, 您需要通过<filename>/etc/printcap</filename> 文件告诉 <application>LPD</application>
	    这些目录。 您可以用 <literal>sd</literal> 标记来指定后台打印队列目录的路径:</para>

	  <programlisting>#
#  /etc/printcap for host rose - added spooling directories
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=<filename>/var/spool/lpd/rattan</filename>:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=<filename>/var/spool/lpd/bamboo</filename>:</programlisting>

	  <para>注意打印机的名字要从第 1 列开始, 其他记录每行都要用
	    TAB 键缩进一次, 写不开需要换行在最后加上反斜杠。</para>

	  <para>如果您没用
	    <literal>sd</literal> 标记指定后台打印队列目录, 后台打印系统会将
	    <filename>/var/spool/lpd</filename> 目录作为默认目录。</para>
	</sect4>

	<sect4 xml:id="printing-device">
	  <title>识别打印机设备</title>

          <para>在 <link linkend="printing-hardware">Hardware Setup</link>
            一节中,我们说明了 &os; 与打印机通讯将使用哪个端口和
            <filename>/dev</filename> 目录下的节点。
            我们要告诉 <application>LPD</application> 这些信息。
            当后台打印系统有任务需要打印,它将为过滤程序
            (负责传送数据到打印机) 打开指定的设备。</para>

	  <para>用 <literal>lp</literal> 标记在 <filename>/etc/printcap</filename> 里列出 <filename>/dev</filename>
	    下的设备节点。</para>

	  <para>在我们的例子中, 假设打印机
	    <literal>rattan</literal> 在第一个并口上, 打印机
	    <literal>bamboo</literal> 在第六个串口上; 下面是
	    要对 <filename>/etc/printcap</filename> 文件里增加的内容 :</para>

	  <programlisting>#
#  /etc/printcap for host rose - identified what devices to use
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=<filename>/var/spool/lpd/rattan</filename>:\
        :lp=<filename>/dev/lpt0</filename>:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=<filename>/var/spool/lpd/bamboo</filename>:\
        :lp=<filename>/dev/ttyu5</filename>:</programlisting>

	  <para>如果您没在您的 <filename>/etc/printcap</filename> 文件中
	    用 <literal>lp</literal> 标记指定设备节点,
	    <application>LPD</application> 将默认使用 <filename>/dev/lp</filename>

	    <filename>/dev/lp</filename> 目前在
	    &os; 中不存在。</para>

	  <para>如果您正在安装的打印机是连接在
	    并口上的, 请跳到 <link linkend="printing-textfilter">安装文本
	    过滤器</link> 这章。 如果不是的话, 还是最好按下面介绍的
	    步骤做。</para>
	</sect4>

	<sect4 xml:id="printing-commparam">
	  <title>配置后台打印通讯参数</title>
	  <indexterm>
      <primary>printers</primary>
      <secondary>serial</secondary>
    </indexterm>

	  <para>对于连在串口上的打印机, <application>LPD</application>
	    可以为发送数据到打印机的过滤程序设置好波特率,
	    校验, 和其他串口通讯参数
	   。 这是有利的,
	    因为:</para>

	  <itemizedlist>
	    <listitem>
	      <para>它可以让您只需简单的修改
		 <filename>/etc/printcap</filename> 就能尝试不同的通讯
		参数; 您并不需要去重新编译过滤器
		程序。</para>
	    </listitem>

	    <listitem>
	      <para>它使得后台打印系统可以在
		多台有不同串口通讯设置的打印机上使用
		相同的过滤器程序。</para>
	    </listitem>
	  </itemizedlist>

	  <para>下面这个 <filename>/etc/printcap</filename> 中
	    用 <literal>lp</literal> 标记来控制列出设备的
	    串口通讯参数 :</para>

	  <variablelist>
	    <varlistentry>
	      <term><literal>br#bps-rate</literal></term>

	      <listitem>
		<para>设置设备的通讯速度为
		  <replaceable>bps-rate</replaceable>, 这里
		  <replaceable>bps-rate</replaceable> 可以为 50, 75, 110,
		  134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600,
		  19200, 38400, 57600, or 115200 比特每秒。</para>
	      </listitem>
	    </varlistentry>

	    <varlistentry>
	      <term><literal>ms#stty-mode</literal></term>

	      <listitem>
		<para>设置已打开的中端设备的选项
		 。 &man.stty.1; 将详细
		  讲述可用的选项。</para>
	      </listitem>
	    </varlistentry>
	  </variablelist>

	  <para>当 <application>LPD</application> 打开
	    用 <literal>lp</literal> 指定的设备时, 它会
	    将设备的特性设置成在
	     <literal>ms#</literal> 标记后指定的那样。 特别是
	     <literal>parenb</literal>,
	    <literal>parodd</literal>, <literal>cs5</literal>,
	    <literal>cs6</literal>, <literal>cs7</literal>,
	    <literal>cs8</literal>, <literal>cstopb</literal>,
	    <literal>crtscts</literal>, 和 <literal>ixon</literal>
	    这些模式, 它们在 &man.stty.1;
	    手册中有详细说明。</para>

	  <para>我们举个例子来添加我们连在第6个串口上的
	    打印机。 我们将设波特为38400。 至于模式,
	    我们将用 <literal>-parenb</literal> 设置成不校验,
	    用 <literal>cs8</literal> 设置成8位字符,
	    用 <literal>clocal</literal> 设置成不要调制解调器控制,
	    用 <literal>crtscts</literal> 设置成硬件流量控制:</para>

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

	<sect4 xml:id="printing-textfilter">
	  <title>安装文本过滤器</title>
	  <indexterm>
	    <primary>printing</primary>
	    <secondary>filters</secondary>
	  </indexterm>

	  <para>我们现在准备告诉 <application>LPD</application>
	    使用什么文本过滤器
	    给打印机发送任务。 <emphasis> 文本过滤器</emphasis>,
	    也叫 <emphasis> 输入过滤器</emphasis>, 是一个
	    在 <application>LPD</application> 有一个任务要发给
	    打印机时运行的程序。 当 <application>LPD</application>
	    为打印机运行文本过滤器时, 它设置过滤器的
	    标准输入为要发给打印机的任务, 而标准输出为
	    用 <literal>lp</literal> 标记指定的打印机
	   。 过滤器先从标准输入读取
	    任务, 为打印机进行一些转换
	    , 并将结果写到标准输出, 这些结果
	    将被打印。 想得到更多关于文本过滤器的信息, 见
	     <link linkend="printing-advanced-filters">过滤器</link>
	    这节。</para>

	  <para>对于简单的打印机设置, 文本过滤器可以仅仅是一段
	    执行 <command>/bin/cat</command> 的 shell 脚本来
	    发送任务到打印机。
	    &os; 还提供了一个叫做
	    <filename>lpf</filename> 的过滤器, 它可以处理退格和下划线来
	    使那些可能不能很好处理这类字符流的打印机正常工作。
	    而且, 当然, 您可以用任何其他的
	    您想用的过滤程序。 <command>lpf</command> 过滤器在
	     <link linkend="printing-advanced-lpf">lpf: 一个文本
	    过滤器</link> 这节将有详细描述。</para>

	  <para>首先, 我们来写一段叫做
	    <filename>/usr/local/libexec/if-simple</filename> 的简单
	    shell 脚本作为文本过滤器。 用您熟悉的文本编辑器将下面的内容放进
	    这个文件:</para>

	  <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 &amp;&amp; exit 0
exit 2</programlisting>

	  <para>使这个文件可以被执行:</para>

	  <screen>&prompt.root; <userinput>chmod 555 /usr/local/libexec/if-simple</userinput></screen>

	  <para>然后用
	    <literal>if</literal> 标记在
	    <filename>/etc/printcap</filename> 里告诉 LPD 使用这个脚本。 我们将仍然为
	    一直作为例子的这两台打印机在
	    <filename>/etc/printcap</filename> 里增加这个标记:</para>

	  <programlisting>#
#  /etc/printcap for host rose - added text filter
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=<filename>/var/spool/lpd/rattan</filename>:\ :lp=<filename>/dev/lpt0</filename>:\
        :if=<filename>/usr/local/libexec/if-simple</filename>:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=<filename>/var/spool/lpd/bamboo</filename>:\
        :lp=<filename>/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:\
        :if=<filename>/usr/local/libexec/if-simple</filename>:</programlisting>

	  <note>
	    <para><filename>if-simple</filename> 脚本的副本可以在 <filename>/usr/share/examples/printing</filename>
	      目录中找到。</para>
	  </note>
	</sect4>

	<sect4>
	  <title>开启 <application>LPD</application></title>

	  <para>&man.lpd.8; 在 <filename>/etc/rc</filename> 中被运行,
	    它是否被运行由 <literal>lpd_enable</literal> 这个变量控制。 这个
	    变量默认是 <literal>NO</literal>。 如果您还没有修改
	    , 那么增加这行:</para>

	  <programlisting>lpd_enable="YES"</programlisting>

	  <para><filename>/etc/rc.conf</filename> 文件当中, 然后既可以重启您的
	    机器, 也可以直接运行 &man.lpd.8;。</para>

	  <screen>&prompt.root; <userinput>lpd</userinput></screen>
	</sect4>

	<sect4 xml:id="printing-trying">
	  <title>测试</title>

	  <para>现在已经基本完成了
	    <application>LPD</application> 的基本设置。
	    但不幸的是, 还不是庆祝的时候,
	    因为我们还需要测试设置并且修正所有的
	    问题。 要测试设置, 尝试打印一些东西。 要
	    用 <application>LPD</application> 系统打印, 您可以
	    使用 &man.lpr.1; 命令,
	    它可以提交一个任务来打印。</para>

	  <para>您可以联合使用 &man.lpr.1; 和 &man.lptest.1;
	     程序, 在 <link linkend="printing-testing">检查打印机
	    通讯</link> 这节介绍怎样生成一些测试文本。</para>

	  <para><emphasis>要测试简单 <application>LPD</application>
	      设置:</emphasis></para>

	  <para>输入:</para>

	  <screen>&prompt.root; <userinput>lptest 20 5 | lpr -Pprinter-name</userinput></screen>

	  <para>其中 <replaceable>printer-name</replaceable> 是
	    在 <filename>/etc/printcap</filename> 中指定的打印机的一个名字 ( 或者一个别名)
	   。 要测试默认
	    打印机, 输入 &man.lpr.1; 不带任何 <option>-P</option>
	     选项。 同样, 如果您正在测试一台使用
	    &postscript; 的打印机, 发送一个 &postscript; 程序到打印机而不是
	    使用 &man.lptest.1;。 您可以把程序放在一个
	    文件里, 然后输入: <command>lpr
	    file</command></para>

	  <para>对于一台 &postscript; 打印机, 您应该得到那段程序的
	    结果。 而如果您使用的 &man.lptest.1;, 则您得到的
	    结果应该看起来像下面这样:</para>

	  <screen>!"#$%&amp;'()*+,-./01234
"#$%&amp;'()*+,-./012345
#$%&amp;'()*+,-./0123456
$%&amp;'()*+,-./01234567
%&amp;'()*+,-./012345678</screen>

	  <para>要更进一步的测试打印机, 尝试下载一些大的
	    程序 (为基于特定语言的打印机 ) 或者运行
	    &man.lptest.1; 并使用不同的参数。 比如,
	    <command>lptest 80 60</command> 将生成 60 行 每行 80
	     个字符。</para>

	  <para>如果打印机不能工作, 参考 <link linkend="printing-troubleshooting">故障排除</link>
	     这节。</para>
	</sect4>
      </sect3>
    </sect2>
  </sect1>

  <sect1 xml:id="printing-advanced">
    <title>高级设置</title>

    <warning>
      <para>&os; 8.0 起, 串口对应的设备名由
	<filename>/dev/ttydN</filename> 变为
	<filename>/dev/ttyuN</filename>&os;&nbsp;7.X 用户应将这篇文档的示例中的设备名改为原先的样子。</para>
    </warning>

    <para>这部分将描述用来打印特别格式文件,
      页眉, 通过网络打印, 以及对打印机使用限制和
      记帐。</para>

    <sect2 xml:id="printing-advanced-filter-intro">
      <title>过滤器</title>
      <indexterm>
	<primary>printing</primary>
	<secondary>filters</secondary>
      </indexterm>

      <para>尽管 <application>LPD</application> 处理网络协议,
	任务排队, 访问控制,
        和打印的其他方面, 但大部分 <emphasis>实际</emphasis>
        工作还是由 <emphasis>过滤器</emphasis>。 过滤器是
        一种与打印机通讯并且处理设备依赖和特殊需要的
        程序。 在简单打印机设置这节里,
        我们安装了一个纯文本过滤器 &mdash;
        一个应该可以用在大多数打印机上的极简单的过滤器
        (<link linkend="printing-textfilter">
          安装文本过滤器</link>)。</para>

      <para>然而,为了进行格式转换, 打印记帐,
        适应特殊的打印机, 等等,
        您需要明白过滤器是怎样工作的。
        在根本上过滤器负责处理这些方面。
        但坏消息是大多数时候
        <emphasis></emphasis> 必须自己提供过滤器。
        好消息是很多过滤器通常都已经有了; 当没有的时候,
        它们通常也是很好写的。</para>

      <para>&os; 也提供了一个过滤器,
        <filename>/usr/libexec/lpr/lpf</filename>,
        可以让大多数可以打印纯文本的打印机工作。
        ( 它处理文件里的退格和跳格,并且进行记帐,
        但这基本就是它所有能做的了。)
        这里还有几个过滤器和过滤器组件在 &os;
        Ports Collection 里。</para>

      <para>这是在这节里您将找到的内容:</para>

      <itemizedlist>
        <listitem>
          <para><link linkend="printing-advanced-filters">过滤器是如何工作的</link>
	    小节中将介绍在打印过程中过滤器的作用。
	    如果希望了解在 <application>LPD</application> 使用过滤器时,
	    在 <quote>幕后</quote> 发生的事情, 便应阅读这一小节。
	    了解这些知识能够帮助您在为打印机安装过滤器时更快地排查可能会遇到的各种问题。</para>
        </listitem>

        <listitem>
          <para><application>LPD</application> 假定任何打印机在默认状态下均能打印纯文本内容。
	    对于不能直接打印纯文本的 &postscript; 打印机 (以及其他基于打印语言的打印机)
            而言这会带来问题。 在 <link linkend="printing-advanced-if-conversion">&postscript; 打印机上使用纯文本任务</link>
	    这节中将会介绍如何解决这个问题的方法。 如果您使用
            &postscript; 打印机, 就应阅读这节内容。</para>
        </listitem>

        <listitem>
          <para>&postscript; 对于许多程序来说都是一个非常受欢迎的输出格式。
            一些人甚至直接写 &postscript; 代码。 但不幸的是,
            &postscript; 打印机非常昂贵。 <link linkend="printing-advanced-ps">模拟 &postscript; 在
              非 &postscript; 打印机上</link> 这节将告诉您怎样进一步修改
            打印机的文本过滤器, 使得一台 <emphasis>&postscript;</emphasis> 打印机接受
            并打印 &postscript; 数据。 如果
            您没有 &postscript; 打印机, 那么您应该阅读这个小节。</para>
        </listitem>

        <listitem>
          <para><link linkend="printing-advanced-convfilters">转换过滤器</link>
	    这节讲述了一个自动把指定格式文件, 比如图像或排版数据,
            转换成您打印机可以理解的格式的方法。 在阅读了这节之后,
	    您就应该可以配置打印机, 让用户可以用
            <command>lpr -t</command>
	    来打印 troff 数据、 用
            <command>lpr -d</command>
            来打印 &tex; DVI 数据, 或用
            <command>lpr -v</command>
            来打印光栅图像数据等工作了。 建议您阅读这节。</para>
        </listitem>

        <listitem>
          <para><link linkend="printing-advanced-of">输出
              过滤器</link> 这节讲述了这个不是经常使用的
	    <application>LPD</application>:
            的功能-输出过滤器。 除非您要打印页眉 (见 <link linkend="printing-advanced-header-pages">页眉</link> 这节 ),
            您或许可以完全跳过这节。</para>
        </listitem>

        <listitem>
          <para><link linkend="printing-advanced-lpf">lpf:
              一个文本过滤器</link> 描述了 <command>lpf</command>,
            一个 &os; 自带的相当完整而又简单的文本过滤器,
            可以使用在行式打印机(和那些担当行式打印机功能的激光打印机 )上。
            如果您需要一个快速的方法来让打印机统计打印纯文本的工作量,
            或者您有一台遇到退格字符就冒烟的打印机, 您应该考虑
            <command>lpf</command></para>
        </listitem>
      </itemizedlist>

      <note>
	<para>您可以在 <filename>/usr/share/examples/printing</filename>
	  目录中找到下面将提到的那些脚本的副本。</para>
      </note>

      <sect3 xml:id="printing-advanced-filters">
        <title>过滤器是怎样工作的</title>

        <para>前面说过, 过滤器是一个被
           <application>LPD</application> 启动, 用来处理与打印机通讯过程中设备依赖的部分
	  的可执行程序。</para>

        <para><application>LPD</application> 想要打印
	  一个任务中的文件, 它启动一个过滤器
          程序。 它把要打印的文件设置成过滤器的标准输入,
          标准输出设置成打印机, 并且把错误信息定向到
          错误日志文件 (在 <literal>lf</literal>
          标识里指定, 默认在 <filename>/etc/printcap</filename>, 或者
          <filename>/dev/console</filename> 文件里 )。</para>

        <indexterm>
          <primary><command>troff</command></primary>
        </indexterm>
        <para>过滤器被 <application>LPD</application> 启动,
          并且过滤器的参数依赖于 <filename>/etc/printcap</filename>
          文件中所列出的和用户为任务用
            &man.lpr.1; 命令所指定的。 例如, 如果用户输入
          <command>lpr -t</command><application>LPD</application> 会启动 troff 过滤器,
          即在目标打印机的 <literal>tf</literal> 标签里所列出的过滤器。
          如果用户想要打印纯文本, 它将会启动
          <literal>if</literal> 过滤器 (这是通常的情况: 参见 <link linkend="printing-advanced-of">输出过滤器</link> 来得到
          细节)。</para>

        <para><filename>/etc/printcap</filename> 文件中, 您可以指定三种过滤器:</para>

        <itemizedlist>
          <listitem>
            <para>The <emphasis> 文本过滤器 </emphasis>, 在 <application>LPD</application> 文档中也叫做
              <emphasis> 输入过滤器 </emphasis>
	      , 处理
              常规的文本打印。 可以把它想象成默认过滤器。
	      <application>LPD</application>
              假定每台打印机默认情况下都可以打印纯文本,
              而文本过滤器的任务就是来搞定退格、 跳格,
              或者其他在某种打印机上容易错误的特殊字符。
	      如果您所在的环境对打印机的使用情况进行记帐,
	      那么文本过滤器必须也对打印的页数进行统计,
              通常是根据打印的行数和打印机在每页上能打印的行数进行计算得出。
              文本过滤器的启动命令为:</para>

              <cmdsynopsis>
                <command>filter-name</command>
                <arg>-c</arg>
                <arg choice="plain">-w <replaceable>width</replaceable></arg>
                <arg choice="plain">-l <replaceable>length</replaceable></arg>
                <arg choice="plain">-i <replaceable>indent</replaceable></arg>
                <arg choice="plain">-n <replaceable>login</replaceable></arg>
                <arg choice="plain">-h <replaceable>host</replaceable></arg>
                <arg choice="plain"><replaceable>acct-file</replaceable></arg>
              </cmdsynopsis>

              <para>这里</para>

              <variablelist>
                <varlistentry>
                  <term><option>-c</option></term>

                  <listitem>
                    <para>当任务用 <command>lpr
                        -l</command> 这个命令提交时出现 </para>
                  </listitem>
                </varlistentry>

                <varlistentry>
                  <term><replaceable>width</replaceable></term>

                  <listitem>
                    <para>这里取您在 <filename>/etc/printcap</filename> 文件中指定的 <literal>pw</literal> (页
                      宽) 标签的值, 默认为 132</para>
                  </listitem>
                </varlistentry>

                <varlistentry>
                  <term><replaceable>length</replaceable></term>

                  <listitem>
                    <para>这里取您的 <literal>pl</literal> (页
                      长) 标签的值, 默认为 66</para>
                  </listitem>
                </varlistentry>

                <varlistentry>
                  <term><replaceable>indent</replaceable></term>

                  <listitem>
                    <para>这里是来自 <command>lpr
                        -i</command> 命令的总缩进量, 默认为 0</para>
                  </listitem>
                </varlistentry>

                <varlistentry>
                  <term><replaceable>login</replaceable></term>

                  <listitem>
                    <para>这里是正在打印文件的用户名 </para>
                  </listitem>
                </varlistentry>

                <varlistentry>
                  <term><replaceable>host</replaceable></term>

                  <listitem>
                    <para>这里是提交打印任务的主机名 </para>
                  </listitem>
                </varlistentry>

                <varlistentry>
                  <term><replaceable>acct-file</replaceable></term>

                  <listitem>
                    <para>这里是来自
                      <literal>af</literal> 变量中指定的用于记帐的文件名。</para>
                  </listitem>
                </varlistentry>
              </variablelist>
          </listitem>

          <listitem>
	    <indexterm>
	      <primary>printing</primary>
	      <secondary>filters</secondary>
	    </indexterm>

            <para><emphasis> 转换过滤器 </emphasis> 的功能是,
              将特定格式的文件转换成打印机能够识别并打印的格式。
              例如, ditroff 格式的排版数据就是无法直接打印的,
              但您可以安装一个转换过滤器来将 ditroff
              文件转换成一种打印机可以识别和打印的形式。 请参见 <link linkend="printing-advanced-convfilters">转换过滤器</link>
              这一节来了解更多细节。 如果您需要对打印进行记帐,
              那么转换过滤器也必须完成记帐工作。 转换过虑器的启动命令为:</para>

              <cmdsynopsis>
                <command>filter-name</command>
                <arg choice="plain">-x <replaceable>pixel-width</replaceable></arg>
                <arg choice="plain">-y <replaceable>pixel-height</replaceable></arg>
                <arg choice="plain">-n <replaceable>login</replaceable></arg>
                <arg choice="plain">-h <replaceable>host</replaceable></arg>
                <arg choice="plain"><replaceable>acct-file</replaceable></arg>
              </cmdsynopsis>

	    <para>这其中 <replaceable>pixel-width</replaceable> 的值来自
               <literal>px</literal> 标签 (默认为 0), 而
              <replaceable>pixel-height</replaceable> 的值来自
              <literal>py</literal> 标签 (默认为 0)。</para>
          </listitem>

          <listitem>
            <para><emphasis> 输出过滤器 </emphasis> 仅在没有文本过滤器时,
	      或者报头页被打开时使用。 就我们的经验而言,
	      输出过滤器是很少用到的.  在 <link linkend="printing-advanced-of">输出过滤器</link> 这节中会介绍它们。
	      启动输出过滤器的命令行只有两个参数:</para>

              <cmdsynopsis>
                <command>filter-name</command>
                <arg choice="plain">-w <replaceable>width</replaceable></arg>
                <arg choice="plain">-l <replaceable>length</replaceable></arg>
              </cmdsynopsis>

              <para>它们的作用与文本过滤器的 <option>-w</option><option>-l</option> 参数是一样的。</para>
          </listitem>
        </itemizedlist>

        <para>过滤器也应该在 <emphasis> 退出</emphasis>
          时给出下面的几种退出状态:</para>

        <variablelist>
          <varlistentry>
            <term>exit 0</term>

            <listitem>
              <para>过滤器已经成功的打印了文件. </para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term>exit 1</term>

            <listitem>
              <para>过滤器打印失败了, 但希望
		<application>LPD</application> 试着再打印一次。
		如果过滤器返回了这个状态, <application>LPD</application>
		将重新启动过滤器。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term>exit 2</term>

            <listitem>
              <para>过滤器打印失败并且不希望
                <application>LPD</application> 重试。 这种情况下
		<application>LPD</application> 会放弃这个文件。</para>
            </listitem>
          </varlistentry>
        </variablelist>

        <para>文本过滤器随 &os; 一起发布,
          文件名为 <filename>/usr/libexec/lpr/lpf</filename>,
          它利用页宽和页长参数来决定何时发送送纸指令,
          并提供位打印记帐的方法。 它使用登录名、 主机名,
          和记帐文件参数来生成记帐记录。</para>

        <para>如果您想购买过滤器, 要注意它是否是与 LPD 兼容。
          如果兼容的话, 则它们必须支持前面提到的那些参数。
          如果您打算编写普通的过滤器程序,
          则同样需要使之支持前面那些参数和退出状态码。</para>
      </sect3>

      <sect3 xml:id="printing-advanced-if-conversion">
        <title>&postscript; 打印机上打印纯文本任务</title>
        <indexterm><primary>print jobs</primary></indexterm>

        <para>如果您是您的计算机和 &postscript; (或其他语言的)
          打印机的唯一用户, 而且您不打算发送纯文本到打印机,
          并因此不打算从应用程序程序直接将纯文本发到打印机的话,
          就完全不需要再关心这节的内容了。</para>

        <para>但是, 如果打印机同时需要接收 &postscript; 和纯文本的任务,
          就需要对打印机进行设置了。 要完成这项工作,
          我们需要一个文本过滤器来检测到达的任务是纯文本的还是 &postscript;
          格式的。 所有 &postscript; 的任务必须以
          <literal>%!</literal> (其他打印机语言请参见打印机的文档)
          开头。 如果任务的头两个字符是这两个,
          就代表这是 &postscript; 格式的, 并且可以直接略过任务剩余的部分。
          如果任务开头的两个字符不是这两个, 那么过滤器将把文本转换成
          &postscript; 并打印结果。</para>

        <para>我们怎样去做?</para>

        <indexterm>
          <primary>printers</primary>
          <secondary>serial</secondary>
        </indexterm>
        <para>如果你有一台串口打印机, 一个好办法就是安装
          <command>lprps</command><command>lprps</command>
          是一个可以与打印机进行双向通信 &postscript;
          打印机过滤器。 它用打印机传来的详细信息来更新打印机的状态文件,
          所以用户和管理员可以准确的看到打印机处在什么样的状态 (比如
          <errorname>缺墨</errorname> 或者 <errorname>卡纸</errorname>)。
          但更重要的是, 它包含了一个叫做 <command>psif</command>
          的程序, 它可以检测接收到的文件是否是纯文本的, 并且将使用
          <command>textps</command> 命令 ( 也是由
          <command>lprps</command> 提供的程序) 转换文本到 &postscript;。 然后它会用
          <command>lprps</command> 将任务发送到打印机。</para>

        <para><command>lprps</command> 可以在 &os; Ports Collection
          (详见 <link linkend="ports">The Ports Collection</link>) 中找到。
          你可以根据页面的尺寸选择安装
	  <package>print/lprps-a4</package><package>print/lprps-letter</package>。
	  在安装了 <command>lprps</command> 之后, 只需指定
          <command>psif</command> 这个程序的路径, 这也是包含在
          <command>lprps</command> 中的一个程序。 如果您已经用 ports 安装好了
          <command>lprps</command>, 将下面的内容添加到
          <filename>/etc/printcap</filename> 文件中 &postscript;
          打印机的记录部分中:</para>

        <programlisting>:if=<filename>/usr/local/libexec/psif</filename>:</programlisting>

        <para>同时还需要指定 <literal>rw</literal> 标签来告诉
          <application>LPD</application> 使用读-写模式打开打印机。</para>

        <para>如果您有一台并口的 &postscript; 打印机 (因此不能与打印机进行
          <command>lprps</command> 需要的双向通信), 可以使用下面这段 shell
          脚本来充当文本过滤器:</para>

        <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" &amp;&amp; cat &amp;&amp; printf "\004" &amp;&amp; exit 0
    exit 2
else
    #
    #  Plain text, convert it, then print it.
    #
    ( echo "$first_line"; cat ) | /usr/local/bin/textps &amp;&amp; printf "\004" &amp;&amp; exit 0
    exit 2
fi</programlisting>

        <para>在上面的脚本中, <command>textps</command>
          命令是一个独立安装的程序用来将纯文本转换成 &postscript;。
          您可以使用任何您喜欢的文本到 &postscript; 转换程序。
          &os; Ports Collection (详见 <link linkend="ports">Ports Collection</link>)
          中包含了一个功能非常完整的文本到 &postscript; 的转换程序, 它叫做
          <literal>a2ps</literal></para>
      </sect3>

      <sect3 xml:id="printing-advanced-ps">
        <title>模拟 &postscript; 在非 &postscript; 打印机上</title>
        <indexterm>
          <primary>PostScript</primary>
          <secondary>emulating</secondary>
        </indexterm>
        <indexterm>
          <primary>Ghostscript</primary></indexterm>

        <para>&postscript; 是高质量排版和打印 <emphasis>事实上的</emphasis>
          标准。 而 &postscript; 也是一个
          <emphasis> 昂贵 </emphasis> 的标准。 幸好, Aladdin
          开发了一个和 &postscript; 类似的叫做
          <application>Ghostscript</application> 的程序可以用在 &os; 上。
          <application>Ghostscript</application> 可以读取大多数 &postscript;
	  的文件并处理其中的页面交给多种设备,包括许多品牌的非 &postscript;
	  打印机。 通过安装 <application>Ghostscript</application>
	  并使用一个特殊的文本过滤器,则可以使一台非 &postscript;
	  打印机用起来就像真的 &postscript; 打印机一样。</para>

        <para><application>Ghostscript</application> 被收录在
	  &os; Ports Collection 中,有许多可用的版本,
	  比较常用的版本是
	  <package>print/ghostscript-gpl</package></para>

        <para>要模拟 &postscript;, 文本过滤器要检测是否要打印一个
          &postscript; 文件。 如果不是, 那么过滤器将直接将文件发送到打印机;
          否则, 它会用 <application>Ghostscript</application>
	  先将文件转换成打印机可以理解的格式。</para>

        <para>这里有一个例子: 下面的脚本是一个针对
          Hewlett Packard DeskJet 500 打印机的文本过滤器。 对于其他打印机,
          替换 <command>gs</command> (<application>Ghostscript</application>)
	  命令中的 <option>-sDEVICE</option> 参数就可以了。 (输入
	  <command>gs -h</command> 来获得当前安装的
	  <application>Ghostscript</application> 所支持的设备列表。)</para>

        <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&amp;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=- - &amp;&amp; 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" &amp;&amp; cat &amp;&amp; printf "\033&amp;l0H" &amp;&amp;
exit 0
fi

exit 2</programlisting>

        <para>最后, 需要告知 <application>LPD</application>
	  所使用的过滤器, 通过 <literal>if</literal> 标签完成:</para>

        <programlisting>:if=<filename>/usr/local/libexec/ifhp</filename>:</programlisting>

        <para>您可以输入 <command>lpr plain.text</command><command>lpr whatever.ps</command>,
          它们都应该可以成功打印。</para>
      </sect3>

      <sect3 xml:id="printing-advanced-convfilters">
        <title>转换过滤器 </title>

        <para>在完成了 <link linkend="printing-simple"> 打印机简单设置 </link> 这节中所描述的内容之后, 头一件事
          恐怕就是为你喜爱的格式的文件安装转换过滤器了 (除了纯 ASCII 文本)。</para>

        <sect4>
          <title>为什么安装转换过滤器?</title>
          <indexterm>
            <primary>&tex;</primary>
            <secondary>printing DVI files</secondary>
          </indexterm>

          <para>转换过滤器使打印众多格式的文件变得很容易。
            比如, 假设我们大量使用 &tex;
            排版系统, 并且有一台 &postscript; 打印机。
            每次从 &tex; 生成一个 DVI 文件,
            我们都不能直接打印它直到我们将 DVI 文件转换成 &postscript;。
            转换的命令应该是下面的样子:</para>

          <screen>&prompt.user; <userinput>dvips seaweed-analysis.dvi</userinput>
&prompt.user; <userinput>lpr seaweed-analysis.ps</userinput></screen>

          <para>通过安装 DVI 文件的转换过滤器, 我们可以跳过每次手动转换这一步, 而让
	    <application>LPD</application> 来完成这个步骤。
            现在, 每次要打印 DVI 文件, 我们只需要一步就可以打印它:</para>

          <screen>&prompt.user; <userinput>lpr -d seaweed-analysis.dvi</userinput></screen>

          <para>我们要 <application>LPD</application> 转换 DVI 文件是通过指定
             <option>-d</option> 选项完成的。 <link linkend="printing-lpr-options-format">格式和转换
             选项</link> 这一节列出了所有的转换选项。</para>

          <para>对于每种想要打印机支持的转换,
            首先要安装 <emphasis> 转换过滤器 </emphasis> 然后在
            <filename>/etc/printcap</filename> 中指定它的路径。
            在简单打印设置中, 转换过滤器类似于文本过滤器
            (详见 <link linkend="printing-textfilter"> 安装文本过滤器 </link>)
            不同的是它不是用来打印纯文本,
            而是将一个文件转换成打印机能够理解的格式。</para>
        </sect4>

        <sect4>
          <title>我应该安装哪个转换过滤器?</title>

          <para>您应该安装您希望使用的转换过滤器。
            如果要打印很多 DVI 数据, 就需要 DVI 转换过滤器;
            如果有大量的 troff 数据,
            就应该安装 troff 过滤器。</para>

          <para>下面的表格总结了可以与
	    <application>LPD</application>配合
            工作的过滤器, 以及它们在
            <filename>/etc/printcap</filename>文件中的变量名, 还有如何在
            <command>lpr</command>命令中调用它们:</para>

          <informaltable frame="none" pgwide="1">
            <tgroup cols="3">
              <thead>
                <row>
                  <entry>文件类型</entry>
                  <entry><filename>/etc/printcap</filename>文件中的变量名</entry>
                  <entry><command>lpr</command>命令中调用使用的参数</entry>
                </row>
              </thead>

              <tbody>
                <row>
                  <entry>cifplot</entry>
                  <entry><literal>cf</literal></entry>
                  <entry><option>-c</option></entry>
                </row>

                <row>
                  <entry>DVI</entry>
                  <entry><literal>df</literal></entry>
                  <entry><option>-d</option></entry>
                </row>

                <row>
                  <entry>plot</entry>
                  <entry><literal>gf</literal></entry>
                  <entry><option>-g</option></entry>
                </row>

                <row>
                  <entry>ditroff</entry>
                  <entry><literal>nf</literal></entry>
                  <entry><option>-n</option></entry>
                </row>

                <row>
                  <entry>FORTRAN text</entry>
                  <entry><literal>rf</literal></entry>
                  <entry><option>-f</option></entry>
                </row>

                <row>
                  <entry>troff</entry>
                  <entry><literal>tf</literal></entry>
                  <entry><option>-f</option></entry>
                </row>

                <row>
                  <entry>raster</entry>
                  <entry><literal>vf</literal></entry>
                  <entry><option>-v</option></entry>
                </row>

                <row>
                  <entry>plain text</entry>
                  <entry><literal>if</literal></entry>
                  <entry>none, <option>-p</option>, or
                    <option>-l</option></entry>
                </row>
              </tbody>
            </tgroup>
          </informaltable>

          <para>在例子中, <command>lpr -d</command>就是指
            打印机需要在<filename>/etc/printcap</filename>文件中
            <literal>df</literal>变量所指的过滤器。</para>

          <indexterm><primary>FORTRAN</primary></indexterm>
          <para>不管别人怎么说, 像 FORTRAN 的文本
            和 plot 这些格式已经基本不用了。 所以在您的机器上,
            就可以安装其他的过滤器来替换这些参数原有的意义。
            例如, 假设想要能直接打印
            Printerleaf 文件 (由 Interleaf desktop
            publishing 程序生成), 而且不打算打印 plot 文件,
            就可以安装一个 Printerleaf 转换过滤器并且用
            <literal>gf</literal> 变量指定它。 然后就可以告诉您的用户使用
            <command>lpr -g</command> 就可以 <quote>打印 Printerleaf
            文件。</quote></para>
        </sect4>

        <sect4>
          <title>安装转换过滤器</title>

          <para>以为安装的转换过滤器不是 &os; 基本系统的一部分,
            所以它们可能是在
            <filename>/usr/local</filename> 目录下。 通常目录
            <filename>/usr/local/libexec</filename> 是保存它们的地方,
            因为它们通常是通过
	    <application>LPD</application> 运行的;
            普通用户应该并不需要直接运行它们。</para>

          <para>要启用一个转换过滤器, 只需要在
            <filename>/etc/printcap</filename>
            文件中为目标打印机中合适的变量赋上过滤器所在的路径。</para>

          <para>在接下来的例子当中, 我们将为
           一台叫做 <literal>bamboo</literal> 的打印机添加一个转换过滤器。
           下面是这个例子的 <filename>/etc/printcap</filename> 文件,
           其中使用新变量 <literal>df</literal> 来为打印机
           <literal>bamboo</literal> 设置转换过滤器:</para>

          <programlisting>#
#  /etc/printcap for host rose - added df filter for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=<filename>/var/spool/lpd/rattan</filename>:\
        :lp=<filename>/dev/lpt0</filename>:\
        :if=<filename>/usr/local/libexec/if-simple</filename>:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=<filename>/var/spool/lpd/bamboo</filename>:\
        :lp=<filename>/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:rw:\
        :if=<filename>/usr/local/libexec/psif</filename>:\
        :df=<filename>/usr/local/libexec/psdf</filename>:</programlisting>

          <para>这里的 DVI 过滤器是一段 shell 脚本, 名字叫做
            <filename>/usr/local/libexec/psdf</filename>。
            下面是它的代码:</para>

          <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 "$@"</programlisting>

          <para>这段脚本以过滤器模式运行 <command>dvips</command> (参数
            <option>-f</option> ) 并从标准输入读取要打印的任务。
            然后运行 &postscript; 文本过滤器
            <command>lprps</command> (详见 <link linkend="printing-advanced-if-conversion">&postscript; 打印机上打印纯文本任务</link> 这一节), 并且带着
	    <application>LPD</application>
            传给脚本的全部参数。 <command>lprps</command>
            工具将利用这些参数来为打印进行记帐。</para>
        </sect4>

        <sect4>
          <title>更多转换过滤器应用实例</title>

          <para>因为安装转换过滤器的步骤并不是固定的,
           所以这节介绍了一些可行的例子。
           在以后的安装配置过程中可以以这些例子为参考。
           甚至如果合适的话, 可以完全照搬过去。</para>

          <para>这段例子中的脚本是一个
            Hewlett Packard LaserJet III-Si
            打印机的光栅格式数据 (实际上也就是 GIF 文件):</para>

          <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 \
    &amp;&amp; exit 0 \
    || exit 2</programlisting>

          <para>它的工作原理就是将 GIF 文件转换成 portable anymap,
            再转换成 portable graymap, 然后再转换成
            portable bitmap, 最后再转换成 LaserJet/PCL- 兼容的数据。</para>

          <para>下面是为打印机配置上上述过滤器的 <filename>/etc/printcap</filename>
            文件:</para>

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

          <para>下面的脚本是一个在名叫
            <literal>bamboo</literal> 的这台 &postscript;
            打印机上打印用 groff 排版软件生成的 troff 数据的打印过滤器:</para>

          <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 "$@"</programlisting>

          <para>上面这段脚本还是用 <command>lprps</command>
           来与打印机进行通讯。 如果打印机是接在并口上的,
           那么就应该使用下面的这段脚本:</para>

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

          <para>这里是我们要启用过滤器需要在
            <filename>/etc/printcap</filename> 里增加的内容:</para>

          <programlisting>:tf=<filename>/usr/local/libexec/pstf</filename>:</programlisting>

          <para>下面的例子也许会让许多 FORTRAN 老手羞愧。
            它是一个 FORTRAN- 文本 的过滤器, 能在任意一台
            可以打印纯文本的打印机上使用。 我们将为打印机
	    <literal>teak</literal> 安装这个过滤器:</para>

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

printf "\033&amp;k2G" &amp;&amp; fpr &amp;&amp; printf "\033&amp;l0H" &amp;&amp;
 exit 0
exit 2</programlisting>

          <para>然后我们要在
            <filename>/etc/printcap</filename> 中为打印机能够
            <literal>teak</literal> 启用这个过滤器添加下面的内容:</para>

          <programlisting>:rf=<filename>/usr/local/libexec/hprf</filename>:</programlisting>

          <para>最后, 再给出一个有些复杂的例子。 我们将给以前介绍过的
            <literal>teak</literal> 这台激光打印机添加一个 DVI
            过滤器。 首先, 最容易的部分: 更新
            <filename>/etc/printcap</filename> 加入 DVI
            过滤器的路径:</para>

          <programlisting>:df=<filename>/usr/local/libexec/hpdf</filename>:</programlisting>

          <para>现在, 该困难的部分了: 编写过滤器。 为了实现过滤器, 我们需要一个
            DVI-到-LaserJet/PCL 转换程序。 &os; Ports
            Collection (详见 <link linkend="ports">Ports Collection</link> 这一节)
            中有一个: <package>print/dvi2xx</package>。
	    安装这个 port 就会得到我们需要的程序,
            <command>dvilj2p</command> , 它可以将 DVI 数据转换成 LaserJet IIp,
            LaserJet III, 和 LaserJet 2000 兼容的数据。</para>

          <para><command>dvilj2p</command> 工具使得过滤器
            <command>hpdf</command> 变得十分复杂, 因为
            <command>dvilj2p</command> 不能读取标准输入。
            它需要从文件中读取数据。 更糟糕的是, 这个文件的名字必须以
            <filename>.dvi</filename> 结尾。 所以使用
            <filename>/dev/fd/0</filename> 作为标准输入是有问题的。
            我们可以通过连接 (符号连接) 来解决这个问题。 连接一个临时的文件名
            (一个以 <filename>.dvi</filename> 结尾的文件名)
            到 <filename>/dev/fd/0</filename>, 从而强制
            <command>dvilj2p</command> 从标准输入读取。</para>

          <para>现在迎面而来的是另外一个问题, 我们不能使用
            <filename>/tmp</filename> 存放临时连接。 符号连接是被用户和组
            <systemitem class="username">bin</systemitem> 拥有的。 而过滤器则是以
            <systemitem class="username">daemon</systemitem> 用户运行的。
            并且 <filename>/tmp</filename> 目录设置了 sticky 位。
            所以过滤器只能建立符号连接,
            但它不能在用完之后清除掉这些连接。
            因为它们属于不同的用户。</para>

          <para>所以过滤器将在当前工作目录下建立符号连接,
            即后台打印队列目录 (用变量
            <literal>sd</literal><filename>/etc/printcap</filename> 中指定)。
            这是一个非常好的让过滤器完成它工作的地方,
            特别还是因为 (有时) 这个目录比起
            <filename>/tmp</filename> 来有更多的可用磁盘空间。</para>

          <para>最后, 给出过滤器的代码:</para>

          <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&gt;&amp;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&amp;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</programlisting>
        </sect4>

        <sect4 xml:id="printing-advanced-autoconv">
          <title>自动转换: 一种替代转换过滤器的方法</title>

          <para>以上这些转换过滤器基本上建成了您的打印环境,
            但也有不足就是必须由用户来指定
            (在 &man.lpr.1; 命令行中) 要使用哪一个过滤器。
            如果您的用户不是对计算机很在行,
            那么选用过滤器将是一件麻烦的事情。
            更糟的是, 当过滤器设定的不正确时,
            过滤器被用在了不它对应类型的文件上,
            打印机也许会喷出上百张纸。</para>

          <para>比只安装转换过滤器更好的方法,
            就是让文本过滤器 (因为它是默认的过滤器)
            来检测要打印文件的类型,
            然后自动运行正确的转换过滤器。 像
            <command>file</command> 这样的工具可以给我们一定的帮助。 当然,
            要区分开
            <emphasis>有些</emphasis> 文件的类型还是有困难的 &mdash; 但是, 当然,
            您可以仅为它们提供转换过滤器。</para>

          <indexterm><primary>apsfilter</primary></indexterm>
          <indexterm>
            <primary>printing</primary>
            <secondary>filters</secondary>
            <tertiary>apsfilter</tertiary>
          </indexterm>
          <para>&os; 的 Ports 套件提供了一个可以自动进行转换的文本过滤器,
            名字叫做 <command>apsfilter</command> (<package>print/apsfilter</package>)。
	    它可以检测纯文本、 &postscript;、 DVI 以及几乎任何格式的文件,
	    并在执行相应的转换之后完成打印工作。</para>
        </sect4>
      </sect3>

      <sect3 xml:id="printing-advanced-of">
        <title>输出过滤器</title>

        <para><application>LPD</application> 后台打印系统还支持一种我们还没有讨论过的过滤器:
	  输出过滤器。
          输出过滤器只是用来打印纯文本的, 类似于文本过滤器,
          但简化了许多地方。 如果您正在使用输出过滤器而不是文本过滤器,
          那么:</para>

        <itemizedlist>
          <listitem>
            <para><application>LPD</application> 为整个任务启动一个输出过滤器,
	      而不是为任务中的每个文件都启动一次。</para>
          </listitem>

          <listitem>
            <para><application>LPD</application> 不会提供任务中文件开始和结束的信息给输出过滤器。</para>
          </listitem>

          <listitem>
            <para><application>LPD</application> 不会提供用户名或者主机名给过滤器,
	      所以它是无法做打印记帐的。
              事实上它只有两个参数:</para>

            <cmdsynopsis>
              <command>过滤器-名字</command>
              <arg choice="plain">-w<replaceable>宽度</replaceable></arg>
              <arg choice="plain">-l<replaceable>长度</replaceable></arg>
            </cmdsynopsis>

            <para><replaceable>宽度</replaceable> 来自于
              <literal>pw</literal> 变量, 而
              <replaceable>length</replaceable> 来自于
              <literal>pl</literal> 变量,
              这些值都是实际问题中给打印机设置的。</para>
          </listitem>
        </itemizedlist>

        <para>不要让输出过滤器的简化所耽误。
          如果想要输出过滤器完成让任务中的每个文件都重新开始一页打印是
          <emphasis>不可能</emphasis> 的。 请使用文本过滤器
          (也叫输入过滤器); 详见 <link linkend="printing-textfilter">安装文本过滤器</link>。
          此外, 实际上, 输出过滤器 <emphasis>更复杂</emphasis> ,
          它要检查发给它的字节流中是否有特殊的标志字符,
          并且给自己发送信号来代替
          <application>LPD</application> 的。</para>

        <para>可是, 如果打算要报头页或者需要发送控制字符或者其他的初始化字符串来完成打印报头页,
          那么输出过滤器则是 <emphasis>必需的</emphasis>。
          (但是它也是
          <emphasis>无用的</emphasis> 如果打算对打印的用户计费, 因为
	  <application>LPD</application> 不会给输出过滤器任何用户或者主机的信息。)</para>

        <para>在一台单个的打印机上, <application>LPD</application>
	  同时允许输出过滤器、 文本过滤器和其他的过滤器。
	  在某些情况下, <application>LPD</application> 将仅会启动输出过滤器来打印报头页 (详见 <link linkend="printing-advanced-header-pages">报头页</link>)。
          然后 <application>LPD</application> 会要求输出过滤器 <emphasis>自己停止运行</emphasis> ,
	  它发送给过滤器两个字节: ASCII 031跟着一个
          ASCII 001。 当输出过滤器看见这两个字节
          (031, 001), 它应该通过发送 <literal>SIGSTOP</literal>
	  信号来停止自己的运行。 当
	  <application>LPD</application>
          已经运行好了其他的过滤器, 它会通过给输出过滤器发送 <literal>SIGCONT</literal> 信号来让输出过滤器重新运行。</para>

        <para>如果仅有一个输出过滤器而 <emphasis>没有</emphasis>
          文本过滤器, 并且 <application>LPD</application> 正在处理一个纯文本任务,
	  <application>LPD</application> 会使用输出过滤器来完成这个任务。
          像以前运行一样,
          输出过滤器会按顺序打印任务中的文件,
          而不会插入送纸或其他进纸的命令, 但这也许并
          <emphasis>不是</emphasis> 您想要的结果。 在大多数情况下,
          您还是需要一个文本过滤器。</para>

        <para><command>lpf</command> 这个我们前面介绍过的文本过滤器程序,
          也可以用来做输出过滤器。 如果需要使用快速且混乱的输出过滤器,
          但又不想写字节检测和信号发送代码,
          那么试试 <command>lpf</command><command>lpf</command> 也可以包含在一个 shell 脚本中来处理任何打印机可能需要的初始化代码。</para>
      </sect3>

      <sect3 xml:id="printing-advanced-lpf">
        <title><command>lpf</command>: 一个文本过滤器</title>

        <para><filename>/usr/libexec/lpr/lpf</filename> 这个程序包含在
          &os; 的二进制程序中, 它是一个文本过滤器 (输入过滤器)。
          它可以缩排输出 (用
          <command>lpr -i</command> 命令提交的任务),
          可以打印控制字符禁止断页用
          <command>lpr -l</command> 提交的任务),
          可以调整任务中退格和制表符打印的位置, 还可以对打印进行记帐。
          它同样可以像输出过滤器一样工作。</para>

        <para><command>lpf</command> 适用于很多打印环境。
          尽管它本身没有向打印机发送初始化代码的功能,
          但写一个 shell
          脚本来完成所需的初始化并执行
          <command>lpf</command> 是很容易的。</para>

        <indexterm><primary>page accounting</primary></indexterm>
        <indexterm>
          <primary>accounting</primary>
          <secondary>printer</secondary>
        </indexterm>
        <para>为了让 <command>lpf</command> 可以正确的进行打印记帐,
          那么需要 <filename>/etc/printcap</filename> 中的 <literal>pw</literal><literal>pl</literal> 变量都填入正确的值。
          它用这些值来测定一页能打印多少文本,
          并计算出任务有多少页。
          想得到更多关于打印记帐的信息, 请参见 <link linkend="printing-advanced-acct">对打印机使用进行记帐</link></para>
      </sect3>
    </sect2>

    <sect2 xml:id="printing-advanced-header-pages">
      <title>报头页</title>

      <para>如果您有 <emphasis>很多</emphasis> 用户, 他们正在使用各式各样的打印机,
        那么您或许要考虑一下把 <emphasis>报头页</emphasis> 当作无可避免之灾祸了。</para>

      <indexterm>
        <primary>banner pages</primary>
	<see>header pages</see>
      </indexterm>
      <indexterm><primary>header pages</primary></indexterm>
      <para>报头页, 也叫 <emphasis>banner</emphasis> 或者
        <emphasis>burst 页</emphasis>, 可以用来辨别打印出的文件是谁打印的。
        它们通常用大号的粗体字母打印出来,
        也可能用装饰线围绕四周, 所以在一堆打印出的文件中,
        突出的显示了这个文件属于哪个用户的哪个任务。
        这可以让用户快速的找到他们的任务。 而报头页一个明显的缺点就是,
        在每个任务中都要有一张或者几张纸作为报头页印出来,
        可是它们的有用的地方只发挥几分钟的作用,
        最后它们会被放进回收站或者扔进垃圾堆。
        (注意报头页只是一个任务一个, 而不是任务中的每个文件都有一个,
        所以可能对纸张还不算很浪费。)</para>

      <para><application>LPD</application> 系统可以自动为您的打印提供报头页,
	<emphasis>如果</emphasis> 您的打印机可以直接打印纯文本。
        如果您的打印机是一台 &postscript; 打印机,
        您将需要一个外部的程序来生成报头页; 详见 <link linkend="printing-advanced-header-pages-ps">&postscript; 打印机上打印报头页</link></para>

          <sect3 xml:id="printing-advanced-header-pages-enabling">
        <title>打开报头页</title>

        <para><link linkend="printing-simple">简单打印设置</link>
          这节, 我们通过在 <filename>/etc/printcap</filename> 文件中指定
          <literal>sh</literal> (<quote>禁止报头页</quote>) 来把报头页功能关掉了。
          要重新为打印机开启报头页功能,
          只需要删除掉 <literal>sh</literal></para>

        <para>听起来很容易, 不是么?</para>

        <para>是的。 您 <emphasis>可能</emphasis> 不得不让输出过滤器来给打印机发送初始化字符串。
          下面是一个用在 Hewlett Packard PCL-兼容打印机上的输出过滤器的例子:</para>

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

printf "\033&amp;k2G" || exit 2
exec /usr/libexec/lpr/lpf</programlisting>

        <para><literal>of</literal> 变量指定输出过滤器的路径。 参见 <link linkend="printing-advanced-of">输出过滤器</link> 这一节来得到更多信息。</para>

        <para>下面是一个为我们以前介绍的叫做 <literal>teak</literal>
          的打印机配置的 <filename>/etc/printcap</filename> 文件;
          在配置当中我们开启了报头页并且加入了上述的打印过滤器:</para>

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

        <para>现在, 当用户再发任务给打印机 <literal>teak</literal> 的时候,
          每个任务都会有一个报头页。 如果用户想要花时间来寻找他们自己打印的文件,
          那么他们可以通过
          <command>lpr -h</command> 命令来提交任务; 参考 <link linkend="printing-lpr-options-misc">报头页选项</link>
          这一节来得到更多关于 &man.lpr.1; 的选项。</para>

        <note>
          <para><application>LPD</application> 在报头页之后发出一个换纸字符。
	    如果您的打印机使用一个不同的字符或者字符串当作退纸指令,
            在 <filename>/etc/printcap</filename> 中用 <literal>ff</literal>
            变量指定即可。</para>
        </note>
      </sect3>

      <sect3 xml:id="printing-advanced-header-pages-controlling">
        <title>控制报头页</title>

        <para>通过启用报头页, <application>LPD</application>
	  将生成出一个 <emphasis>长报头</emphasis>,
          一整页的大字母, 标着用户, 主机和任务名。
          下面是一个例子 (<systemitem class="username">kelly</systemitem> 从主机
          <systemitem>rose</systemitem> 打印了一个叫做 <quote>outline</quote> 的任务):</para>

        <screen>      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</screen>

        <para><application>LPD</application> 会附加一个换页符在这段文本之后,
	  所以任务会在新的一页上开始
          (除非设置了 <literal>sf</literal> (禁止换纸)
          在 <filename>/etc/printcap</filename>
          文件里目标打印机的记录中)。</para>

        <para>如果您喜欢, <application>LPD</application>
	  可以生成一个 <emphasis>短报头</emphasis>;
          指定 <literal>sb</literal> (短 banner)
          在文件 <filename>/etc/printcap</filename> 中。
          报头页就会看起来像下面这样:</para>

        <screen>rose:kelly  Job: outline  Date: Sun Sep 17 11:07:51 1995</screen>

        <para>同样是默认的, <application>LPD</application>
	  也是先打印报头页, 然后才是任务。
          要想反过来, 在 <filename>/etc/printcap</filename>
          中指定 <literal>hl</literal> (最后报头)。</para>
      </sect3>

      <sect3 xml:id="printing-advanced-header-pages-accounting">
        <title>为带报头页的任务记帐</title>

        <para>使用 <application>LPD</application>
	  内置的报头页会在进行打印记帐的时候产生一种特殊情况:
          报头页肯定是
          <emphasis>免费</emphasis> 的。</para>

        <para>为什么?</para>

        <para>因为输出过滤器是仅有的一个在打印报头页时能进行记帐的外部程序,
          但却没有提供给它任何 <emphasis>用户或者主机</emphasis>
          的信息或者记帐文件, 所以它无法知道谁应该为打印机的使用付费。
          如果仅仅是
          <quote>增加一页计数</quote> 给文本过滤器或者其他过滤器
          (它们有用户和主机的信息) 是不够的, 因为用户可以用
          <command>lpr -h</command> 命令跳过报头页。
          他还是需要为自己并没有打印的报头页付钱。
          基本上, <command>lpr -h</command> 是明知用户的首选,
          但也不能强制让别人使用它。</para>

        <para>让每个过滤器生成自己的报头页
          (因此可以为它们计费) 是 <emphasis>仍然不够的</emphasis>。
          如果用户想要用 <command>lpr -h</command>
          命令禁止报头页, 它们将仍然印出报头页并且为它们付费。
          因为 <application>LPD</application>
	  不会把
          <option>-h</option> 这个参数传给任何过滤器。</para>

        <para>这样, 您该怎么办呢?</para>

        <para>您可以:</para>

        <itemizedlist>
          <listitem>
            <para>认可 <application>LPD</application> 的这个问题,
	      并且免费提供报头页打印。</para>
          </listitem>

          <listitem>
            <para>安装一个替代 <application>LPD</application> 的软件,
	      比如
		<application>LPRng</application>。 参考
              <link linkend="printing-lpd-alternatives">替换标准的后台打印软件</link>
                来得到更多关于可以替代 <application>LPD</application> 的软件的信息。
	    </para>
          </listitem>

          <listitem>
            <para>写一个 <emphasis>聪明的</emphasis> 输出过滤器。
              通常, 输出过滤器不应该去完成除了初始化打印机或者进行一些简单字符转换以外的任何事情。
              它适合完成报头页和纯文本任务
              (当没有文本 (输入) 过滤器时)。
              但是, 如果有文本过滤器为纯文本任务服务,
              那么 <application>LPD</application> 将仅为打印报头页启动输出过滤器。
	      而且, 这个输出过滤器可以理解报头页里
              <application>LPD</application> 生成的信息,
	      然后决定哪位用户和主机应该为报头页付费。
              这种方法仅有的问题是输出过滤器仍然不知道应该使用什么记帐文件
              (<literal>af</literal> 变量的内容并没有被传递过来),
              但是如果您有一个众所周知的记帐文件,
              就可以直接把文件名写进输出过滤器。
              为了简化解释报头的步骤,
              我们定义 <literal>sh</literal> (短报头) 变量在
              <filename>/etc/printcap</filename> 文件中。
              但这些还是太麻烦了,
              而且用户也更喜欢让他们免费打印报头页的慷慨的系统管理员。</para>
          </listitem>
        </itemizedlist>
      </sect3>

      <sect3 xml:id="printing-advanced-header-pages-ps">
        <title>&postscript; 打印机上打印报头页</title>

        <para>像上面描述的那样,<application>LPD</application>
	  可以生成一个纯文本的报头页来适应多种打印机。
          当然, &postscript; 不能直接打印纯文本,
          所以 <application>LPD</application> 没什么用&mdash;或者说大多时候是这样。</para>

        <para>一个显而易见的方法来得到报头页就是让每个转换过滤器和文本过滤器都来生成报头页。
          这些过滤器应该用用户名和主机的参数来生成一个相对应的报头页。
          这种方法的缺点就是用户总是打印出报头页,
          无论他们是否用
          <command>lpr -h</command>
          命令来提交的任务。</para>

        <para>让我们来深入深入的研究一下这个方法。
          下面的脚本输入三个参数
          (用户登录名, 主机名, 和任务名)
          然后生成一个简单的 &postscript; 报头页:</para>

        <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` &lt;user&gt; &lt;host&gt; &lt;job&gt;" 1&gt;&amp;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 &lt;&lt;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</programlisting>

        <para>现在, 每个转换过滤器和文本过滤器都能调用这段脚本来生成报头页,
          然后打印用户的任务。
          下面是我们早些时候在这个文档中提到的
          DVI 转换过滤器, 被修改之后来生成一个报头页:</para>

        <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&gt;&amp;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&gt;&amp;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</programlisting>

        <para>过滤器是怎样解释参数列表来决定用户名和主机名的。
          解释的方法对于其他转换过滤器来说也是一样的。
          尽管文本过滤器需要输入的参数有些小的不同,
          (参见 <link linkend="printing-advanced-filters">过滤器是怎样工作的</link>)。</para>

        <para>像我们以前提到的那样, 上面的配置, 尽管相当简单,
          关掉了 <quote>禁止报头页</quote> 的选项
          (<option>-h</option> 选项) 在 <command>lpr</command> 中。
          如果用户想要保护树木 (或者是几便士, 如果你对打印报头页收费的话),
          它还不能完成这件事情, 因为每个过滤器都要为每个任务打印一个报头页。</para>

        <para>要允许用户对于每个任务都可以关闭报头页,
          您需要使用在 <link linkend="printing-advanced-header-pages-accounting">为报头页记帐</link>
          这节中介绍的那种技巧:
          写一个输出过滤器来解释 LPD- 生成的报头页并且生成一个 &postscript; 的版本。
          如果用户用
          <command>lpr -h</command> 命令提交任务, 那么
	  <application>LPD</application> 将不会生成报头页,
          并且输出过滤器也不会生成报头页。
          否则, 输出过滤器将从
	  <application>LPD</application> 读取文本,
          然后发送适当的报头页的 &postscript; 编码给打印机。</para>

        <para>如果您有的是一台连在串口上的 &postscript; 打印机,
          您可以使用 <command>lprps</command> 里的一个输出过滤器,
          <command>psof</command> , 它可以完成上述任务。 但注意
          <command>psof</command> 不对报头页计费。</para>
      </sect3>
    </sect2>

    <sect2 xml:id="printing-advanced-network-printers">
      <title>网络打印</title>

      <indexterm>
        <primary>printers</primary>
        <secondary>network</secondary>
      </indexterm>
      <indexterm><primary>network printing</primary></indexterm>
      <para>&os; 支持网络打印: 发送任务给远程打印机。
        网络打印通常指两种不同的方式:</para>

      <itemizedlist>
        <listitem>
          <para>访问一台连接在远程主机上的打印机。
            在一台主机上安装一台常规的串口或并口打印机。
            然后, 设置 <application>LPD</application>
	    来通过网络访问其他主机上的打印机。
            具体见 <link linkend="printing-advanced-network-rm">安装在远程主机上的打印机</link>
              这节。</para>
        </listitem>

        <listitem>
          <para>访问一台直接连接在网络上的打印机。
            打印机另有一个网络接口 (或者替代常规的串口或者并口)。
            这样的打印机可能像下面这样工作:</para>

          <itemizedlist>
            <listitem>
              <para>它或许可以理解 <application>LPD</application>
		的协议, 并且甚至可以接收远程主机发来的任务排进队列。
                这样, 它就像一个普通的主机运行着
                <application>LPD</application> 一样。 做在
                <link linkend="printing-advanced-network-rm">安装在远程主机上的打印机</link>
                里介绍的步骤, 可以设置好这样的打印机。</para>
            </listitem>

            <listitem>
              <para>它或许支持网络数据流。
                这样, 把打印机 <quote></quote> 在一台网络上的主机上,
                由这台主机负责安排任务并发送任务到打印机。
                参见 <link linkend="printing-advanced-network-net-if">带网络数据流接口的打印机</link>
                这节来得到更多安装这类打印机的建议。</para>
            </listitem>
          </itemizedlist>
        </listitem>
      </itemizedlist>

      <sect3 xml:id="printing-advanced-network-rm">
        <title>安装在远程主机上的打印机</title>

        <para><application>LPD</application> 后台打印系统内建了对给其他也运行着
	  <application>LPD</application> (或者是与
	  <application>LPD</application> 兼容的) 的主机发送任务的功能。
          这个功能使您可以在一台主机上安装打印机,
          并让它可以在其他主机上访问。 这个功能同样适用在那些有网络接口并且可以理解
          <application>LPD</application> 协议的打印机上。</para>

        <para>要开启这种远程打印的功能, 首先在一台主机上安装打印机, 就是
          <emphasis>打印服务器</emphasis>, 可以使用在
          <link linkend="printing-simple">简单打印机设置</link>
          这节中简单设置的方法。 高级的设置可以参考 <link linkend="printing-advanced">高级打印机设置</link> 这节中你需要的部分。
          一定要测试一下打印机, 看看它是不是所有您开启的
          <application>LPD</application> 的功能都正常工作。 此外还需要确认
          <emphasis>本地主机</emphasis> 允许使用 <emphasis>远程主机</emphasis> 上的
	  <application>LPD</application>
          服务 (参见 <link linkend="printing-advanced-restricting-remote">限制远程主打印任务</link>)。</para>

        <indexterm>
          <primary>printers</primary>
          <secondary>network</secondary>
        </indexterm>
        <indexterm><primary>network printing</primary></indexterm>
        <para>如果您正在使用一台带网络接口并与
          <application>LPD</application> 兼容的打印机, 那么我们那下面讨论中的
	  <emphasis>打印服务器</emphasis>
          就是打印机本身, 而
          <emphasis>打印机名</emphasis> 就是您为打印机配置的名字。
          参考随打印机和/或者打印机-网络接口供给的文档。</para>

        <tip>
          <para>如果您正使用惠普的 Laserjet,
            则打印机名 <literal>text</literal> 将自动地为您完成 LF 到
            CRLF 的转换, 因而也就不需要
            <filename>hpif</filename> 脚本了。</para>
        </tip>

        <para>然后, 在另外一台你想要访问打印机的主机上的
          <filename>/etc/printcap</filename> 文件中加入它们的记录,
          像下面这样:</para>

        <orderedlist>
          <listitem>
            <para>可以随意给这个记录起名字。 简单起见,
              您可以给打印服务器使用相同的名字或者别名。</para>
          </listitem>

          <listitem>
            <para>保留 <literal>lp</literal> 变量为空,
              (<literal>:lp=:</literal>)。</para>
          </listitem>

          <listitem>
            <para>建立一个后台打印队列目录, 并用
              <literal>sd</literal> 变量指明其位置。 <application>LPD</application>
	      将把任务提交给打印服务器之前,
	      会把这些任务保存在这里。</para>
          </listitem>

          <listitem>
            <para><literal>rm</literal> 变量中放入打印服务器的名字。</para>
          </listitem>

          <listitem>
            <para><literal>rp</literal> 中放入打印服务器上打印机的名字。</para>
          </listitem>
        </orderedlist>

        <para>就是这样。 不需要列出转换过滤器,
          页面大小, 或者其他的一些东西在
          <filename>/etc/printcap</filename> 文件中。</para>

        <para>这有一个例子。 主机 <systemitem>rose</systemitem> 有两台打印机,
          <literal>bamboo</literal><literal>rattan</literal>。
          我们要让主机 <systemitem>orchid</systemitem> 的用户可以使用这两台打印机。
          下面是 <filename>/etc/printcap</filename> 文件, 用在主机
          <systemitem>orchid</systemitem> (详见 <link linkend="printing-advanced-header-pages-enabling">开启报头页</link>)
            上的。 文件中已经有了打印机
          <literal>teak</literal> 的记录; 我们在主机
          <systemitem>rose</systemitem> 上增加了两台打印机:</para>

        <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=<filename>/dev/lpt0</filename>:sd=<filename>/var/spool/lpd/teak</filename>:mx#0:\
        :if=<filename>/usr/local/libexec/ifhp</filename>:\
        :vf=<filename>/usr/local/libexec/vfhp</filename>:\
        :of=<filename>/usr/local/libexec/ofhp</filename>:

#
#  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=<filename>/var/spool/lpd/rattan</filename>:

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

        <para>然后, 我们只需要在主机
          <systemitem>orchid</systemitem> 上建立一个后台打印队列目录:</para>

	<screen>&prompt.root; <userinput>mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo</userinput>
&prompt.root; <userinput>chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo</userinput>
&prompt.root; <userinput>chown daemon:daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo</userinput></screen>

        <para>现在, 主机 <systemitem>orchid</systemitem> 上的用户可以打印到
          <literal>rattan</literal><literal>bamboo</literal> 了。 如果,
          比如, 一个用户在主机 <systemitem>orchid</systemitem> 上输入了:</para>

          <screen>&prompt.user; <userinput>lpr -P bamboo -d sushi-review.dvi</userinput></screen>

        <para><application>LPD</application> 系统在主机 <systemitem>orchid</systemitem>
	  上会复制这个任务到后台打印队列目录
          <filename>/var/spool/lpd/bamboo</filename> 并且记下这是一个
          DVI 任务。 当主机 <systemitem>rose</systemitem> 上的打印机
          <literal>bamboo</literal> 的后台打印队列目录有空间的时, 这两个
	  <application>LPD</application> 系统将会传输这个文件到主机
          <systemitem>rose</systemitem> 上。 文件将排在主机 <systemitem>rose</systemitem>
          的队列中直到最终被打印出来。 它将被从 DVI 转换成
          &postscript; (因为 <literal>bamboo</literal> 是一台 &postscript; 打印机) 在主机
          <systemitem>rose</systemitem></para>
      </sect3>

      <sect3 xml:id="printing-advanced-network-net-if">
        <title>带有网络数据流接口的打印机</title>

        <para>通常, 当您为打印机购买了一块网卡,
          可以得到两个版本: 一个是模拟后台打印 (贵一些的版本),
          或者一个只发送数据给打印机就像在使用串口或者并口一样
          (便宜一些的版本)。
          这节讲述如何使用这个便宜一些的版本。 要得到贵一些版本的更多信息,
          参见前面章节 <link linkend="printing-advanced-network-rm">安装在远程主机上的打印机</link></para>

        <para><filename>/etc/printcap</filename> 文件的格式让您指定使用哪个串口或并口,
          并且还要指定 (如果您正在使用串口),
          使用多快的波特, 是否使用流量控制,
          为制表符延迟, 转换换行, 等等。
          但是没有一种方法指定一个连接到一台正在监听 TCP/IP 的或者其他网络接口的打印机。</para>

        <para>要发送数据到网络打印机, 就需要开发一个通讯程序,
          它可以被文本或者转换过滤器调用。
          下面是一些例子: 脚本
          <command>netprint</command> 将标准输入的所有数据发送到一个连在网络上的打印机。
          我们将打印机的名字作为第一个参数, 端口号跟在后面作为第二个参数, 传给
          <command>netprint</command>。
          注意它只支持单向通讯 (&os; 到打印机);
          很多网络打印机支持双向通讯, 并且这是您可能利用到的
          (得到打印机状态, 进行打印记帐, 等等的时候。)。</para>

        <programlisting>#!/usr/bin/perl
#
#  netprint - Text filter for printer attached to network
#  Installed in /usr/local/libexec/netprint
#
$#ARGV eq 1 || die "Usage: $0 &lt;printer-hostname&gt; &lt;port-number&gt;";

$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', &amp;AF_INET, $printer_port, $address);

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

        <para>然后我们就可以在多种过滤器里使用这个脚本了。 加入我们有一台
          Diablo 750-N 行式打印机联在网络上。 打印机在 5100 端口上接收要打印的数据。
          打印机的主机名是 <systemitem>scrivener</systemitem>。
	  这里是为这个打印机写的文本过滤器:</para>

        <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</programlisting>
      </sect3>
    </sect2>

    <sect2 xml:id="printing-advanced-restricting">
      <title>限制打印机的使用</title>

      <indexterm>
        <primary>printers</primary>
        <secondary>restricting access to</secondary>
      </indexterm>
      <para>这节将讲述关于限制打印机使用的问题。
        <application>LPD</application> 系统让您可以控制谁可以访问打印机,
	无论本地或是远程的,
        是否他们可以打印机多份副本, 任务可以有多大,
        以及打印队列的尺寸等。</para>

      <sect3 xml:id="printing-advanced-restricting-copies">
        <title>限制多份副本</title>

        <para><application>LPD</application> 系统能够简化用户在打印多份副本时的工作。
	  用户可以用 <command>lpr -#5</command>
          (举例) 来提交打印任务, 则会将任务中每个文件都打印五份副本。
          这是不是一件很棒的事情呢。</para>

        <para>如果您感觉多份副本会对打印机造成不必要的磨损和损耗,
          您可以屏蔽掉 &man.lpr.1; 的 <option>-#</option> 选项,
          这可以通过在 <filename>/etc/printcap</filename>
          文件中增加 <literal>sc</literal> 变量来完成。 当用户用
          <option>-#</option> 选项提交任务时, 他们将看到:</para>

        <screen>lpr: multiple copies are not allowed</screen>

        <para>注意当为一台远程打印机进行设置时 (参见
          <link linkend="printing-advanced-network-rm">安装在远程主机上的打印机</link> 这一节)
          您还需要同时在远程主机的 <filename>/etc/printcap</filename> 文件中
          增加<literal>sc</literal> 变量,
          否则用户还是可以从其他主机上提交使用多份副本的任务。</para>

        <para>下面是一个例子。 这个是
          <filename>/etc/printcap</filename> 文件在主机
          <systemitem>rose</systemitem> 上。 打印机 <literal>rattan</literal>
          非常轻闲, 所以我们将允许多份副本, 但是激光打印机
          <literal>bamboo</literal> 则有些忙, 所以我们禁止多份副本,
          通过增加 <literal>sc</literal>
          变量:</para>

        <programlisting>#
#  /etc/printcap for host rose - restrict multiple copies on bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=<filename>/var/spool/lpd/rattan</filename>:\
        :lp=<filename>/dev/lpt0</filename>:\
        :if=<filename>/usr/local/libexec/if-simple</filename>:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=<filename>/var/spool/lpd/bamboo</filename>:sc:\
        :lp=<filename>/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:rw:\
        :if=<filename>/usr/local/libexec/psif</filename>:\
        :df=<filename>/usr/local/libexec/psdf</filename>:</programlisting>

        <para>现在, 我们还需要增机 <literal>sc</literal> 变量在主机
          <systemitem>orchid</systemitem><filename>/etc/printcap</filename> 文件中 (顺便我们也禁止打印机
          <literal>teak</literal> 多份打印) :</para>

        <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=<filename>/dev/lpt0</filename>:sd=<filename>/var/spool/lpd/teak</filename>:mx#0:sc:\
        :if=<filename>/usr/local/libexec/ifhp</filename>:\
        :vf=<filename>/usr/local/libexec/vfhp</filename>:\
        :of=<filename>/usr/local/libexec/ofhp</filename>:

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

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

        <para>通过使用 <literal>sc</literal> 变量, 我们阻止了
          <command>lpr -#</command> 命令的使用, 但仍然没有禁止用户多次运行
          &man.lpr.1; ,
          或者多次提交任务中同样的文件,
          像下面这样:</para>

        <screen>&prompt.user; <userinput>lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign</userinput></screen>

        <para>这里有很多种方法可以阻止这种行为 (包括忽略它),
          并且是免费的。</para>
      </sect3>

      <sect3 xml:id="printing-advanced-restricting-access">
        <title>限制对打印机的访问</title>

        <para>您可以控制谁可以打印到哪台打印机通过 &unix;
          的组机制和文件 <filename>/etc/printcap</filename> 中的
          <literal>rg</literal> 变量。
          只要把可以访问打印机的用户放进适当的组中, 然后在
          <literal>rg</literal> 变量中写上组的名字。</para>

        <para>如果这组以外的用户 (包括 <systemitem class="username">root</systemitem>)
          试图打印到被限制的打印机,将会得到这样的提示:</para>

        <screen>lpr: Not a member of the restricted group</screen>

        <para>像使用 <literal>sc</literal> (禁止多份副本)
          变量一样, 您需要指定 <literal>rg</literal>
          在远程同样对打印机有访问限制的主机上,
          如果您感觉合适的话 (参考 <link linkend="printing-advanced-network-rm">安装在远程主机上的打印机</link> 这一节)。</para>

        <para>比如, 我们将让任何人都可以访问打印机
          <literal>rattan</literal>, 但只有在
          <systemitem class="groupname">artists</systemitem> 组中的人可以使用打印机 <literal>bamboo</literal>。
          这里是类似的主机 <systemitem>rose</systemitem> 上的
          <filename>/etc/printcap</filename> 文件:</para>

        <programlisting>#
#  /etc/printcap for host rose - restricted group for bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=<filename>/var/spool/lpd/rattan</filename>:\
        :lp=<filename>/dev/lpt0</filename>:\
        :if=<filename>/usr/local/libexec/if-simple</filename>:

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

        <para>Let us leave the other example
          <filename>/etc/printcap</filename> file (for the host
          <systemitem>orchid</systemitem>) alone.  Of course, anyone on
          <systemitem>orchid</systemitem> can print to <literal>bamboo</literal>.  It
          might be the case that we only allow certain logins on
          <systemitem>orchid</systemitem> anyway, and want them to have access to the
          printer.  Or not.</para>

        <note>
          <para>这里每台仅能有一个限制的组。</para>
        </note>
      </sect3>

      <sect3 xml:id="printing-advanced-restricting-sizes">
        <title>控制提交的任务大小</title>

        <indexterm><primary>print jobs</primary></indexterm>
        <para>如果您有很多用户访问打印机,
          可能需要对用户可以提交的文件尺寸设置一个上限。
          毕竟, 文件系统中后台打印队列目录的空间是有限的,
          您需要保证这里有空间来存放其他用户的任务。</para>

        <indexterm>
          <primary>print jobs</primary>
          <secondary>controlling</secondary>
        </indexterm>
        <para><application>LPD</application> 允许通过使用
          <literal>mx</literal> 变量来限制任务中文件的最大字节数,
          方法是指定单位为块的
          <literal>BUFSIZ</literal> 数, 每块表示 1024 字节。
	  如果在这个变量的值是 0, 则表示不进行限制;
          不过, 如果不指定
          <literal>mx</literal> 变量的话,
          则会使用默认值 1000 块。</para>

        <note>
          <para>这个限制是对于任务中 <emphasis>文件</emphasis> 的,
          而 <emphasis>不是</emphasis> 任务总共的大小。</para>
        </note>

        <para><application>LPD</application> 不会拒绝比限制大小大的文件。
	  但它是将限制大小以内的部分排入队列,
          并且打印出来的只有这些。 剩下的部分将被丢弃。
          这个行为是否正确还需讨论。</para>

        <para>让我们来为例子打印机
          <literal>rattan</literal><literal>bamboo</literal> 增加限制。
          由于那些 <systemitem class="groupname">artists</systemitem>&postscript; 文件可能会很大,
          我们将限制大小为 5 兆字节。 我们将不对纯文本行式打印机做限制:</para>

        <programlisting>#
#  /etc/printcap for host rose
#

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

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

        <para>同样, 限制只对本地用户起作用。
          如果设置了允许远程用户使用您的打印机, 远程用户将不会受到这些限制。
          您也需要指定 <literal>mx</literal>
          变量在远程主机的 <filename>/etc/printcap</filename> 文件中。
          参见 <link linkend="printing-advanced-network-rm">安装在远程主机上的打印机</link>
          这一节来得到更多有关远程打印的信息。</para>

        <para>除此之外, 还有另一种限制远程任务大小的方法;
          参见 <link linkend="printing-advanced-restricting-remote">限制远程主机打印任务</link></para>
      </sect3>

      <sect3 xml:id="printing-advanced-restricting-remote">
        <title>限制远程主机打印任务</title>

        <para><application>LPD</application> 后台打印系统提供了多种方法来限制从远程主机提交的任务:</para>

        <variablelist>
          <varlistentry>
            <term>主机限制</term>

            <listitem>
              <para>您可以控制本地
		<application>LPD</application> 接收哪台远程主机发来的请求,
                通过 <filename>/etc/hosts.equiv</filename> 文件和
                <filename>/etc/hosts.lpd</filename> 文件。
		<application>LPD</application> 查看是否到来的任务请求来自被这两个文件中列出的主机。
                如果没有, <application>LPD</application>
		会拒绝这个请求。</para>

              <para>这些文件的格式非常简单: 每行一个主机名。
                注意
                <filename>/etc/hosts.equiv</filename> 文件也被
                  &man.ruserok.3; 协议使用, 并影响着
                  &man.rsh.1; and &man.rcp.1; 等程序, 所以要小心。</para>

              <para>举个例子, 下面是
                <filename>/etc/hosts.lpd</filename> 文件在主机
                <systemitem>rose</systemitem> 上:</para>

              <programlisting>orchid
violet
madrigal.fishbaum.de</programlisting>

              <para>意思是主机 <systemitem>rose</systemitem> 将接收来自
                <systemitem>orchid</systemitem><systemitem>violet</systemitem>,
                和 <systemitem class="fqdomainname">madrigal.fishbaum.de</systemitem> 的请求。
                如果任何其他的主机试图访问主机 <systemitem>rose</systemitem><application>LPD</application>, 任务将被拒绝。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term>大小限制</term>

            <listitem>
              <para>您可以控制后台打印队列目录需要保留多少空间。
                建立一个叫做
                <filename>minfree</filename> 的文件在后台打印队列目录下为本地打印机。
                在这个文件中插入一个数字来代表多少磁盘块数 (512 字节)
                的剩余空间来接收远程任务。</para>

              <para>这让您可以保证远程用户不会填满您的文件系统。
                您也可以用它来给本地用户一个优先:
                他们可以在磁盘剩余空间低于
                <filename>minfree</filename>
                文件中的指定值后仍然可以提交任务。</para>

              <para>比如, 让我们增加一个 <filename>minfree</filename>
                文件为打印机 <literal>bamboo</literal>。 我们检查
                <filename>/etc/printcap</filename> 文件来找到这个打印机的后台打印队列目录;
                这里是打印机 <literal>bamboo</literal>
                的记录:</para>

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

              <para>后台打印队列目录在 <literal>sd</literal>
                变量中给出。 我们设置 3 兆字节 (6144 磁盘块)
                为文件系统上必须存在的总共剩余空间, 让
                <application>LPD</application> 可以接受远程任务:</para>

              <screen>&prompt.root; <userinput>echo 6144 &gt; /var/spool/lpd/bamboo/minfree
              </userinput></screen>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term>用户限制</term>

            <listitem>
              <para>您可以控制哪些远程用户可以打印到本地打印机, 通过指定
                <literal>rs</literal> 变量在
                <filename>/etc/printcap</filename> 文件中。 当
                <literal>rs</literal> 出现在一个本地打印机的记录中时,
                <application>LPD</application> 将接收来自远程主机
                <emphasis></emphasis> 在本地有同样登录名的用户提交的任务。
                否则, <application>LPD</application> 会拒绝这个任务。</para>

              <para>这个功能在一个 (比如) 有许多部门共享一个网络的环境中特别有用,
                并且有些用户可以越过部门的边界。
                通过为他们在您的系统上建立帐号,
                他们可以他们自己的部门的系统里使用您的打印机。
                如果 <emphasis></emphasis> 允许他们您的打印机,
                而不是您的计算机资源, 您可以给他们
                <quote>象征</quote> 帐户, 不带主目录并且设置一个没用的
                shell , 比如 <filename>/usr/bin/false</filename></para>
            </listitem>
          </varlistentry>
        </variablelist>
      </sect3>
    </sect2>

    <sect2 xml:id="printing-advanced-acct">
      <title>对打印机使用记帐</title>

      <indexterm>
        <primary>accounting</primary>
        <secondary>printer</secondary>
      </indexterm>
      <para>当然, 你需要对打印付费。 为什么不? 纸张和墨水都需要花钱的。
        并且这里还有维护的费用 &mdash; 打印机是由很多部件组装成的,
        并且零件会坏掉。 您可以检查您的打印机,
        使用形式, 和维护费用来得出每页
        (或者每尺, 每米, 或者每什么) 的费用。 现在,
        您怎样启动打印记帐呢?</para>

      <para>好了, 坏消息是 <application>LPD</application>
	后台打印系统在这个部分没有提供很多帮助。
        记帐是一个对使用的打印机的种类,
        打印的格式, 和
        <emphasis>您的</emphasis> 在对打印机的使用计费的需求依赖性很高的。</para>

      <para>要实现记帐, 您必须更改打印机的文本过滤器
        (对纯文本任务记费) 和转换过滤器
        (对其他格式的文件计费), 要统计页数或者查询打印了多少页的话。
        您不可以通过使用简单的输出过滤器来逃脱计费,
        因为它不能进行记帐。 参见 <link linkend="printing-advanced-filter-intro">过滤器</link> 这节。</para>

      <para>通常, 有两种方法来进行记帐:</para>

      <itemizedlist>
        <listitem>
          <para><emphasis>定期记帐</emphasis> 是更常用的方法,
            可能因为它更简单。 无论合适何人打印一个任务,
            过滤器都将记录用户名, 主机名, 和打印的页数到一个记帐文件。
            每个月, 学期, 年, 或者任何您想设定的时间段,
            收集这些不同打印机上的记帐文件,
            按用户对打印的页数进行结算, 并对使用进行付费。
            然后删掉所有记录文件, 开始一个新的计费周期。</para>
        </listitem>

        <listitem>
          <para><emphasis>实时记帐</emphasis> 不太常用,
            可能因为它比较难。
            这种方法让过滤器对用户的打印进行实时的记帐。
            像磁盘配额, 记帐是实时的。
            您可以组织用户打印当他们的帐户超额的时候,
            并且可能提供一种方法让用户检查并调整他们的
            <quote>打印配额。</quote> 但这个方法需要一些数据库代码来跟踪用户和他们的配额。</para>
        </listitem>
      </itemizedlist>

      <para><application>LPD</application> 后台打印系统对两种方法都支持且很简单:
	所以您需要提供过滤器
        (大多数时候), 还要提供记帐代码。
        但这好的方面是: 您可以有非常灵活的记帐方法。
        比如, 您可以选择使用阶段记帐还是实时记帐。
        您可以选择记录哪些信息:
        用户名, 主机名, 任务类型, 打印页数,
        使用了多少平方尺的纸, 任务打印了多长时间, 等等。
        您可以通过修改过滤器来存储这些信息。</para>

      <sect3>
        <title>快速并且混乱的打印记帐</title>

        <para>&os; 包含两个可以让您立刻可以建立起简单的阶段记帐的程序。
          它们是文本过滤器
          <command>lpf</command>, 在 <link linkend="printing-advanced-lpf">lpf: 一个文本过滤器</link> 这节中描述, 和
            &man.pac.8;, 一个收集并统计打印机记帐文件中记录的程序。</para>

        <para>像在前面章节提到的过滤器一样
          (<link linkend="printing-advanced-filters">过滤器</link>),
	  <application>LPD</application>
	  启动文本或者转换过滤器并在过滤器命令行里带上记帐文件的名字。
          过滤器可以使用这个参数知道该往哪写记帐记录。
          这个文件的名字来自于
          <literal>af</literal> 变量在
          <filename>/etc/printcap</filename> 文件里, 并且如果没有指定绝对路径,
          则默认是相对于后台打印队列目录的。</para>

        <para><application>LPD</application> 启动 <command>lpf</command>
	  带着页宽和页长的参数
          (通过 <literal>pw</literal><literal>pl</literal>
          变量)。 <command>lpf</command> 使用这些参数来判定将使用多少张纸。
          在文件发送到打印机之后,
          它就会在记帐文件中写入记录。
          记录像下面这个样子:</para>

        <programlisting>2.00 rose:andy
3.00 rose:kelly
3.00 orchid:mary
5.00 orchid:mary
2.00 orchid:zhang</programlisting>

        <para>您应该让每个打印机都使用一个独立的记帐文件, 像
          <command>lpf</command> 就没有内建文件锁逻辑,
          这样两个 <command>lpf</command> 可能会发生彼此记录混合的情况,
          如果它们同时要在同一个文件写入内容的时候。
          一个最简单的保证每个打印机都使用一个独立的记帐文件的方法就是将
          <literal>af=acct</literal> 写在 <filename>/etc/printcap</filename> 文件中。
          然后, 每个打印机的记帐文件都会在这台打印机的后台打印队列目录中,
          文件的名字叫做 <filename>acct</filename></para>

        <para>当您准备对用户的打印进行收费时, 运行
          &man.pac.8; 程序。 只要转换到要收集信息的这台打印机的后台打印队列目录,
          然后输入 <command>pac</command>。
          您将会得到一个美元计费的摘要像下面这样:</para>

        <screen>  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</screen>

        <para>这些是 &man.pac.8; 需要的参数:</para>

        <variablelist>
          <varlistentry>
            <term><option>-P<replaceable>打印机</replaceable></option></term>

            <listitem>
              <para>哪台 <replaceable>打印机</replaceable> 要结帐。
                这个选项仅在用
                <literal>af</literal> 变量在
                <filename>/etc/printcap</filename> 文件中指定了绝对路径的情况下起作用。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term><option>-c</option></term>

            <listitem>
              <para>以金额来排序输出来代替以用户名字字母排序。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term><option>-m</option></term>

            <listitem>
              <para>忽略记帐文件中的主机名。 带上这个选项,
                用户 <systemitem class="username">smith</systemitem> 在主机
                <systemitem>alpha</systemitem> 上与同样的用户
                <systemitem class="username">smith</systemitem> 在主机 <systemitem>gamma</systemitem> 上一样。
                不带这个选项的话, 他们则是不同的用户。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term><option>-p<replaceable>单价</replaceable></option></term>

            <listitem>
              <para>使用 <replaceable>price</replaceable>
                作为每页或每尺美元的单价来替代
                <literal>pc</literal> 变量指定的单价在
                <filename>/etc/printcap</filename> 文件中, 或者两分 (默认)。
                <replaceable>price</replaceable>
                可以用一个浮点数来指定。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term><option>-r</option></term>

            <listitem>
              <para>反向排序。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term><option>-s</option></term>

            <listitem>
              <para>建立一个记帐摘要文件,
              并且截短记帐文件。</para>
            </listitem>
          </varlistentry>

          <varlistentry>
            <term><replaceable>名字</replaceable>
              <replaceable>&hellip;</replaceable></term>

            <listitem>
              <para>只打印指定
                <replaceable>名字</replaceable> 用户的记帐信息。</para>
            </listitem>
          </varlistentry>
        </variablelist>

        <para>在 &man.pac.8; 默认产生的摘要中,
          可以看到在不同主机上的每个用户打印了多少页。
          如果在您这里, 主机不考虑 (因为用户可以使用任何主机),
          运行 <command>pac -m</command>,
          来得到下面的摘要:</para>

        <screen>  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</screen>


        <para>要以美元计算应付钱数,
          &man.pac.8; 指定 <literal>pc</literal> 变量在
          <filename>/etc/printcap</filename> 文件中 (默认是 200, 或者 2 分每页).
          这个参数的单位是百分之一分,
          在这个变量中指定每页或者每尺的价格。
          您可以覆盖这个值当运行 &man.pac.8; 带着参数
          <option>-p</option> 的时候。 参数 <option>-p</option>
          的单位是美元, 而不是百分之一分。
          例如,</para>

          <screen>&prompt.root; <userinput>pac -p1.50</userinput></screen>

        <para>设定每页的价格是 1 美元 5 美分。
          您可以通过这个选项来达到目标利润。</para>

        <para>最终, 运行 <command>pac -s</command> 将存储这些信息在一个记帐文件里,
          文件名和打印机帐户的名字相同,
          但是带着 <literal>_sum</literal>
          的后缀。 然后截短记帐文件。
          当您再次运行 &man.pac.8; 的时候, 它再次读取记帐文件来得到初始的总计,
          然后在记帐文件中增加信息。</para>
      </sect3>

      <sect3>
        <title>怎样对打印的页数进行计数?</title>

        <para>为了进行远程的精确记帐,
          需要判断一个任务将会消耗多少张纸。
          这是打印记帐问题的关键。</para>

        <para>对于纯文本任务, 这个问题不是太难解决:
          对任务中的行数进行计数然后与打印机支持的每页行数进行比较。
          别忘了也对添印的行, 或者很长的逻辑上的一行但在打印机上会折成两行的这类进行记帐。</para>

        <para>文本过滤器 <command>lpf</command> (在 <link linkend="printing-advanced-lpf">lpf:一个文本过滤器</link> 这节中介绍)
          会在记帐时考虑这些问题。
          如果正在编写一个可以进行记帐的文本过滤器,
          您可能需要查看 <command>lpf</command> 的源代码。</para>

        <para>怎样处理其他格式的文件?</para>

        <para>好, 对于 DVI- 到 -LaserJet 或者 DVI- 到 -&postscript; 转换,
          可以让您的过滤器输出诊断信息, 关于
          <command>dvilj</command> 或者 <command>dvips</command> 命令,
          并且看到多少页被转换了。 您也许可以对于其他类型的文件和转换程序进行类似操作。</para>

        <para>但是这些方法的弱点就是事实上打印机并不是打印了所有的页。
          比如, 卡纸, 缺墨,
          或者炸掉了 &mdash; 但用户还是要为没有打印的部分付钱。</para>

        <para>您该怎样做?</para>

        <para>只有一条 <emphasis>肯定</emphasis> 的方法来进行
          <emphasis>精确</emphasis> 的记帐。 购买一台可以告诉您它使用了多少纸的打印机,
          并且将它连接到串口或者网络上。
          几乎所有 &postscript; 打印机都支持这个小功能。
          其他制造厂或其他型号也可以有这个功能 (比如 Imagen
          激光网络打印机)。 为这些打印机更改过滤器使它在打印完每个任务之后接收纸张用量,
          并 <emphasis></emphasis> 基于这个值进行记帐。
          不需要计算行数,
          也不需要容易出错的文件检查。</para>

        <para>当然, 您也总是可以大方的使打印免费。</para>
      </sect3>
    </sect2>
  </sect1>

  <sect1 xml:id="printing-using">
    <title>使用打印机</title>

    <indexterm>
      <primary>printers</primary>
      <secondary>usage</secondary>
   </indexterm>
    <para>这节将讲述如何使用在
      &os; 下设置好的打印机。 下面是一个用户级命令的总览:</para>

    <variablelist>
      <varlistentry>
	<term>&man.lpr.1;</term>

	<listitem>
	  <para>打印任务</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>&man.lpq.1;</term>

	<listitem>
	  <para>检查打印队列</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>&man.lprm.1;</term>

	<listitem>
	  <para>从打印机的队列中移除任务</para>
	</listitem>
      </varlistentry>
    </variablelist>

    <para>还有一个管理命令, &man.lpc.8;, 在 <link linkend="printing-lpc">管理打印机</link> 一节中有所介绍,
      它可以用于控制打印机及其队列。</para>

    <para> &man.lpr.1;, &man.lprm.1;, and &man.lpq.1;
      这三个命令都接受 <option>-P
	<replaceable>printer-name</replaceable></option> 选项来指定对哪个打印机 / 队列进行操作,
      在
      <filename>/etc/printcap</filename> 文件中列出的打印机。 这允许您提交,
      删除, 并检查任务在多个打印机上。 如果您不使用
      <option>-P</option> 选项, 那么这些命令会使用在
      环境变量 <envar>PRINTER</envar> 中指定的打印机。
      最终, 如果您也没有 <envar>PRINTER</envar> 这个环境变量,
      这些命令的默认值是叫做 <literal>lp</literal> 的这台打印机。</para>

    <para>从此以后, 术语 <emphasis>默认打印机</emphasis>
      就是指 <envar>PRINTER</envar> 环境变量中指定的这台,
      或者叫做 <literal>lp</literal> 的这一台当没有环境变量
      <envar>PRINTER</envar> 的时候。</para>

    <sect2 xml:id="printing-lpr">
      <title>打印任务</title>

      <para>要打印文件, 输入:</para>

      <screen>&prompt.user; <userinput>lpr filename ...</userinput></screen>

      <indexterm><primary>printing</primary></indexterm>
      <para>这个命令会打印所有列出的文件到默认打印机。
	如果没有列出文件, &man.lpr.1; 会从标准输入读取打印数据。
	比如, 这个命令打印一些重要的系统文件:</para>

      <screen>&prompt.user; <userinput>lpr /etc/host.conf /etc/hosts.equiv</userinput></screen>

      <para>要选择一个指定的打印机, 输入:</para>

      <screen>&prompt.user; <userinput>lpr -P printer-name filename ...</userinput></screen>

      <para>这个例子打印一个当前目录的长长的列表到叫做
	<literal>rattan</literal> 的这台打印机:</para>

      <screen>&prompt.user; <userinput>ls -l | lpr -P rattan</userinput></screen>

      <para>因为没有为
	  &man.lpr.1; 命令列出文件, <command>lpr</command> 从标准输入读入数据,
	在这里是 <command>ls
	  -l</command> 命令的输出。</para>

      <para> &man.lpr.1; 命令同样可以接受多种控制格式的选项,
	应用文件转换, 生成多份副本, 等等。
	要得到更多信息, 参考 <link linkend="printing-lpr-options">打印选项</link> 这节。</para>
    </sect2>

    <sect2 xml:id="printing-lpq">
      <title>检查任务</title>

      <indexterm><primary>print jobs</primary></indexterm>
      <para>当使用 &man.lpr.1; 进行打印时, 您希望打印的所有数据被放在一起打包成了一个
	<quote>打印任务</quote>, 它被发送到
	<application>LPD</application> 后台打印系统。
	每台打印机都有一个任务队列,
	并且您的任务在队列中等待其他用户的其他任务打印。
	打印机按照先来先印的规则打印这些任务。</para>

      <para>要显示默认打印机的队列, 输入 &man.lpq.1;。
	要指定打印机, 使用 <option>-P</option> 选项。
	例如, 命令

	<screen>&prompt.user; <userinput>lpq -P bamboo</userinput></screen>

	会显示打印机 <literal>bamboo</literal> 的队列。
	下面是命令 <command>lpq</command>
	输出的一个例子:</para>

      <screen>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</screen>

      <para>这里显示了队列中有三个任务在 <literal>bamboo</literal> 中。
	第一个任务, 用户 kelly 提交的, 标识 <quote>任务编号</quote>
	9。 每个要打印的任务都会获得一个不同的任务编号。
	大多时候可以忽略这个任务编号, 但在您需要取消任务时会用到这个号码;
	参考 <link linkend="printing-lprm">移除任务</link> 这节得到更多信息。</para>

      <para>编号为 9 的任务包含了两个文件; 在
	&man.lpr.1; 命令行中指定的多个文件被看作是一个单个的任务。
	它是当前激活的任务 (注意这个词 <literal>激活</literal><quote>Rank</quote> 这列下面), 意思是打印机当前正在打印那个任务。
	第二个任务包含了标准输入传给
	&man.lpr.1; 命令的数据。
	第三个任务来自用户 <systemitem class="username">mary</systemitem>; ,
	它是一个比较大的任务。 她要打印的文件的路径名太长了,
	所以 &man.lpq.1; 命令只显示了三个点。</para>

      <para> &man.lpq.1; 输出的头一行也很有用:
	它告诉我们打印机正在做什么 (或者至少是
	<application>LPD</application> 认为打印机应该正在做的)。</para>

      <para> &man.lpq.1; 命令同样支持 <option>-l</option> 选项来生成一个详细的长列表。
	下面是一个
	<command>lpq -l</command> 命令的例子:</para>

      <screen>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</screen>
    </sect2>

    <sect2 xml:id="printing-lprm">
      <title>移除任务</title>

      <para>如果您对一个打印任务改变了主意,
	可以用 &man.lprm.1; 将任务从队列中删除。 通常, 您甚至可以用
	&man.lprm.1; 命令来移除一个当前激活的任务, 但是任务的一部分或者所有还是可能打印出来。</para>

      <para>要从默认打印机中移除一个任务, 首先使用
	&man.lpq.1; 找到任务编号。 然后输入:</para>

      <screen>&prompt.user; <userinput>lprm job-number</userinput></screen>

      <para>要从指定打印机中删除任务, 增加
	<option>-P</option> 选项。 下面的命令会删除编号为
	10 的任务从 <literal>bamboo</literal> 这台打印机:</para>

      <screen>&prompt.user; <userinput>lprm -P bamboo 10</userinput></screen>

      <para> &man.lprm.1; 命令有一些快捷方式:</para>

      <variablelist>
	<varlistentry>
	  <term>lprm -</term>

	  <listitem>
	    <para>删除所有属于您的任务 (默认打印机的)。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>lprm <replaceable>user</replaceable></term>

	  <listitem>
	    <para>删除所有属于用户
	      <replaceable>user</replaceable> 的任务 (默认打印机的)。
	      超级用户可以删除用户的任务; 您只可以删除自己的任务。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term>lprm</term>

	  <listitem>
	    <para>命令行中不带任务编号, 任务名, 或者 <option>-</option>
	      选项, &man.lprm.1; 会删除默认打印机上当前激活的任务,
	      如果它属于你。 超级用户可以删除任务激活的任务。</para>
	  </listitem>
	</varlistentry>
      </variablelist>

      <para>使用参数 <option>-P</option> 和上面的快捷方式来用指定打印机替代默认打印机。
	例如, 下面的命令会删除当前用户在打印机
	<literal>rattan</literal> 队列中的所有任务:</para>

      <screen>&prompt.user; <userinput>lprm -P rattan -</userinput></screen>

      <note>
	<para>如果您正工作在一个网络环境中, &man.lprm.1;
	  将只允许在提交任务的主机上删除任务,
	  甚至是同一台打印机也可以在其他主机上使用时。
	  下面的命令证明了这个:</para>

	<screen>&prompt.user; <userinput>lpr -P rattan myfile</userinput>
&prompt.user; <userinput>rlogin orchid</userinput>
&prompt.user; <userinput>lpq -P rattan</userinput>
Rank   Owner	  Job  Files                          Total Size
active seeyan	  12	...                           49123 bytes
2nd    kelly      13   myfile                         12 bytes
&prompt.user; <userinput>lprm -P rattan 13</userinput>
rose: Permission denied
&prompt.user; <userinput>logout</userinput>
&prompt.user; <userinput>lprm -P rattan 13</userinput>
dfA013rose dequeued
cfA013rose dequeued
	</screen>
      </note>
    </sect2>

    <sect2 xml:id="printing-lpr-options">
      <title>超越纯文本:打印选项</title>

      <para> &man.lpr.1; 支持许多控制文本格式的参数,
	转换图形和其他格式文件,
	生成多份副本, 处理任务, 等等。
	这一节将描述这些选项。</para>

      <sect3 xml:id="printing-lpr-options-format">
	<title>格式与转换选项</title>

	<para>下面的 &man.lpr.1; 参数控制任务中文件的格式。
	  使用这些参数, 如果任务不含纯文本,
	  或者您想让纯文本通过
	  &man.pr.1; 格式化。</para>

        <indexterm><primary>&tex;</primary></indexterm>
	<para>例如, 下面的命令打印一个 DVI 文件 (来自
	  &tex; 排版系统) 文件名为 <filename>fish-report.dvi</filename>
	  到打印 <literal>bamboo</literal></para>

	<screen>&prompt.user; <userinput>lpr -P bamboo -d fish-report.dvi</userinput></screen>

	<para>这些选项应用到任务中的每个文件, 所以您不能混合
	  (说) DVI 和 ditroff 文件在同一个任务中。 替代的方法是,
	  用独立的任务提交这些文件, 使用不同的转换选项给不同的任务。</para>

	<note>
	  <para>所有这些选项除了 <option>-p</option><option>-T</option> 都需要转换过滤器安装给目标打印机。
	    例如, <option>-d</option> 选项需要
	    DVI 转换过滤器。 参考 <link linkend="printing-advanced-convfilters">转换过滤器</link>
	    这节得到更多细节。</para>
	</note>

	<variablelist>
	  <varlistentry>
	    <term><option>-c</option></term>

	    <listitem>
	      <para>打印 cifplot 文件。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-d</option></term>

	    <listitem>
	      <para>打印 DVI 文件。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-f</option></term>

	    <listitem>
	      <para>打印 FORTRAN 文本文件。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-g</option></term>

	    <listitem>
	      <para>打印 plot 数据。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-i <replaceable>number</replaceable></option></term>

	    <listitem>
	      <para>缩进 <replaceable>number</replaceable> 列;
		如果没有指定 <replaceable>number</replaceable>,
		则缩进 8 列。 这个选项仅可以工作在某些过滤器上。</para>

	      <note>
		<para>不要在选项 <option>-i</option> 和数字之间加入空格。</para>
	      </note>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-l</option></term>

	    <listitem>
	      <para>打印文字数据,
		包括控制字符。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-n</option></term>

	    <listitem>
	      <para>打印 ditroff (无设备依赖 troff) 数据。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term>-p</term>

	    <listitem>
	      <para>打印之前用 &man.pr.1; 格式化纯文本。 参考
		&man.pr.1; 得到更多信息。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-T <replaceable>title</replaceable></option></term>

	    <listitem>
	      <para>使用 <replaceable>title</replaceable> 在
		&man.pr.1; 上来替代文件名。
		这个选项仅在使用 <option>-p</option>
		选项时起作用。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-t</option></term>

	    <listitem>
	      <para>打印 troff 数据。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-v</option></term>

	    <listitem>
	      <para>打印 raster 数据。</para>
	    </listitem>
	  </varlistentry>
	</variablelist>

	<para>下面是一个例子: 这个命令打印了一个很好的
	  &man.ls.1; 联机手册到默认打印机:</para>

	<screen>&prompt.user; <userinput>zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t</userinput></screen>

	<para> &man.zcat.1; 命令解压缩
	  &man.ls.1; 的手册并且将内容传给 &man.troff.1;
	  命令, 它将格式化这些内容并且生成 GNU troff
	  输出给 &man.lpr.1; , 它提交任务到
	  <application>LPD</application> 后台打印。
	  因为使用了 <option>-t</option>
	  选项为 &man.lpr.1; , 后台打印将会转换 GNU
	  troff 输出到默认打印机可以理解的格式当任务被打印时。</para>
      </sect3>

      <sect3 xml:id="printing-lpr-options-job-handling">
	<title>任务处理选项</title>

	<para>下面的 &man.lpr.1; 选项告诉
	  <application>LPD</application> 对任务特殊处理:</para>

	<variablelist>
	  <varlistentry>
	    <term>-# <replaceable>copies</replaceable></term>

	    <listitem>
	      <para>生成 <replaceable>copies</replaceable> 个副本给任务中的每个文件,
		替代每个文件一份副本。
		管理员可以禁止这个选项来减少打印机的浪费和鼓励复印机的使用。
		参考
		<link linkend="printing-advanced-restricting-copies">限制多份副本</link></para>

	      <para>这个例子打印三份副本的文件
		<filename>parser.c</filename> 跟着三份副本的文件
		<filename>parser.h</filename> 到默认打印机:</para>

	      <screen>&prompt.user; <userinput>lpr -#3 parser.c parser.h</userinput></screen>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term>-m</term>

	    <listitem>
	      <para>打印完成后发信。 使用这个选项,
		<application>LPD</application> 系统将会发送邮件到您的帐户,
		当它完成了处理您的任务后。
		在信中, 它将会告诉您任务是否成功完成或者出现了错误,
		并且 (通常) 指明是什么错误。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term>-s</term>

	    <listitem>
	      <para>不要复制文件到后台打印队列目录,
		要使用符号连接。</para>

	      <para>如果您正在打印一个很大的任务, 您可能需要这个选项。
		它节省后台打印队列目录的空间
		(您的任务可能使后台打印队列目录所在的文件系统剩余空间超出)。
		它同样也节省了时间, 因为
		<application>LPD</application>
		将不会副本任务的每个字节到后台打印队列目录。</para>

	      <para>这也有一个缺点: 因为
		<application>LPD</application> 将直接指向源文件,
		您不能修改或者删除它们直到它们被打印出来。</para>

	      <note>
		<para>如果您打印到一台远程打印机,
		  <application>LPD</application>
		  将最终将文件从本地主机副本到远程主机上,
		  所以选项 <option>-s</option> 只能节省本地后台打印队列目录的空间,
		  而不是远程的。
		  虽然如此, 但它还是很有用。</para>
	      </note>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term>-r</term>

	    <listitem>
	      <para>移除任务中的文件在它们被复制到后台打印队列目录之后,
		或者在用
		<option>-s</option> 选项打印它们之后。
		谨慎使用这个选项!</para>
	    </listitem>
	  </varlistentry>
	</variablelist>
      </sect3>

      <sect3 xml:id="printing-lpr-options-misc">
	<title>报头页选项</title>

	<para>这些 &man.lpr.1; 的选项调整了通常出现在任务报头页上的文本。
	  如果报头页被跳过了在目标打印机上,
	  这些选项将不会起作用。 参考
	  <link linkend="printing-advanced-header-pages">报头页</link>
	  得到更多关于设置报头页的信息。</para>

	<variablelist>
	  <varlistentry>
	    <term>-C <replaceable>text</replaceable></term>

	    <listitem>
	      <para>替换报头页上的主机名为
		<replaceable>text</replaceable>。
		主机名通常都是提交任务的主机名称。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term>-J <replaceable>text</replaceable></term>

	    <listitem>
	      <para>替换报头页上的任务名为
		<replaceable>text</replaceable>。 任务名通常是任务中头一个文件的名字,
		或者
		<filename>stdin</filename> 如果您正在打印标准输入。</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term>-h</term>

	    <listitem>
	      <para>不打印任何报头页。</para>

	      <note>
		<para>在某些地点, 这个选项可能无效,
		  与报头页的产生方法有关。 参考 <link linkend="printing-advanced-header-pages">报头页</link>
		  得到详细信息。</para>
	      </note>
	    </listitem>
	  </varlistentry>
	</variablelist>
      </sect3>
    </sect2>

    <sect2 xml:id="printing-lpc">
      <title>管理打印机</title>

      <para>作为一个打印机的管理者, 您必须要安装,
	设置, 并且测试它们。 使用 &man.lpc.8; 命令,
	您可以与打印机以更多的方式交流。 用 &man.lpc.8; ,
	您可以</para>

      <itemizedlist>
	<listitem>
	  <para>启动或停止打印机</para>
	</listitem>

	<listitem>
	  <para>启用或禁止它们的队列</para>
	</listitem>

	<listitem>
	  <para>重新安排每个队列中的任务。</para>
	</listitem>
      </itemizedlist>

      <para>首先, 一个关于术语的解释: 如果一个打印机被
	<emphasis>停止</emphasis> 了, 它将不会打印它队列中的任何东西。
	但用户还是可以提交任务, 它们会在队列中等待直到打印机被
	<emphasis>启动</emphasis> 或者队列被清空。</para>

      <para>如果一个队列被 <emphasis>禁止</emphasis>, 没有用户 (除了
	<systemitem class="username">root</systemitem>) 可以提交任务到打印机。 一个
	<emphasis>启用</emphasis> 的队列允许任务被提交。
	一个打印机可以被 <emphasis>启动</emphasis> 但它的队列被禁止,
	在这种情况下打印机将打印队列中的任务, 直到队列为空。</para>

      <para>通常, 您必须有 <systemitem class="username">root</systemitem> 权限来使用
	&man.lpc.8; 命令。 普通用户可以使用 &man.lpc.8;
	命令来获得打印机状态并且重启一台挂了的打印机。</para>

      <para>这里是一个关于 &man.lpc.8; 命令的摘要。 大部分命令带着一个
	<replaceable>printer-name</replaceable> 参数来知道要对哪台打印机操作。
	您可以用 <literal>all</literal>
	填在 <replaceable>printer-name</replaceable> 的位置来代表所有在
	<filename>/etc/printcap</filename> 文件中列出的打印机。</para>

      <variablelist>
	<varlistentry>
	  <term><command>abort
	      printer-name</command></term>

	  <listitem>
	    <para>取消当前任务并停止打印机。
	      用户仍然可以提交任务, 如果队列还是启用的。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>clean
	      printer-name</command></term>

	  <listitem>
	    <para>从打印机的后台打印队列目录移除旧的文件。
	      有时, 组成任务的文件没有被
	      <application>LPD</application> 正确的删除,
	      特别是在打印中出现错误或者管理活动比较多的时候。
	      这个命令查找不属于后台打印队列目录的文件并删除它们。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>disable
	      printer-name</command></term>

	  <listitem>
	    <para>禁止新任务入队。 如果打印机正在工作,
	      它将会继续打印队列中剩余的任务。
	      超级用户 (<systemitem class="username">root</systemitem>) 总是可以提交任务,
	      甚至提交到一个禁止的队列。</para>

	    <para>这个命令在测试一台新打印机或者安装过滤器时非常有用:
	      禁止队列并提交以
	      <systemitem class="username">root</systemitem> 提交任务。
	      其他用户将不能提交任务直到您完成了测试并用命令
	      <command>enable</command> 重新启用了队列的时候。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>down printer-name
	      message</command></term>

	  <listitem>
	    <para>打印机下线。 等于
	      <command>disable</command> 命令后跟一个 <command>stop</command> 命令。
	      <replaceable>message</replaceable> 将作为打印机状态,
	      当用户使用 &man.lpq.1; 或者 <command>lpc status</command>
	      命令查看打印机队列状态的时候显示出来。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>enable
	      printer-name</command></term>

	  <listitem>
	    <para>为打印机开启队列。
	      用户可以提交任务到打印机但是在打印机启动之前不会打印出任何东西。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>help
	      command-name</command></term>

	  <listitem>
	    <para>打印关于
	      <replaceable>command-name</replaceable> 命令的帮助。 不带
	      <replaceable>command-name</replaceable>,
	      则打印可用命令的摘要。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>restart
	      printer-name</command></term>

	  <listitem>
	    <para>启动打印机。 普通用户可以使用这个命令,
	      当一些特别的环境导致
	      <application>LPD</application> 锁死时, 但他们不能启用一台使用
	      <command>stop</command> 或者
	      <command>down</command> 命令停用的打印机。
	      <command>restart</command> 命令等同于
	      <command>abort</command> 后跟着一个
	      <command>start</command></para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>start
	      printer-name</command></term>

	  <listitem>
	    <para>启用打印机。 打印机将开始打印队列中的任务。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>stop
	      printer-name</command></term>

	  <listitem>
	    <para>停止打印机。 打印机将完成当前任务并且将不再打印队列中的任务任务。
	      尽管打印机被停用,
	      但用户仍然可以提交任务到一个开启的队列。</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>topq printer-name
	      job-or-username</command></term>

	  <listitem>
	    <para>重新以
	      <replaceable>printer-name</replaceable> 安排队列,
	      通过将列出的 <replaceable>job</replaceable> 编号或者指定的所属
	      <replaceable>username</replaceable> 的任务放在队列的最前面。
	      对于这个命令, 您不可以使用
	      <literal>all</literal> 当作
	      <replaceable>printer-name</replaceable></para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>up
	      printer-name</command></term>

	  <listitem>
	    <para>打印机上线; 相对于
	      <command>down</command> 命令。 等同于
	      <command>start</command> 后跟着一个
	      <command>enable</command> 命令。</para>
	  </listitem>
	</varlistentry>
      </variablelist>

      <para>&man.lpc.8; 的命令行接受上面的命令。
	如果您不输入任何命令, &man.lpc.8; 则进入一个交互模式,
	在这里您可以输入命令直到输入 <command>exit</command><command>quit</command>, 或者文件结束符。</para>
    </sect2>
  </sect1>

  <sect1 xml:id="printing-lpd-alternatives">
    <title>替换标准后台打印</title>

    <para>如果您已经通读过了这个手册,
      那么到现在您应该已经了解了关于 FreeBSD 包含的后台打印系统
      <application>LPD</application>
      的一切。 您可能发现了它很多的缺点,
      它们很自然的让您提出这样的问题:
      <quote>这里还有什么后台打印系统吗 (并且可以工作在
        &os; 上) ?</quote></para>

    <variablelist>
      <varlistentry>
	<term>LPRng</term>

	<listitem>
	  <indexterm><primary>LPRng</primary></indexterm>

	  <para><application>LPRng</application>, 它的意思是
	    <quote>LPR: 下一代</quote>,
	    是一个完全重写的 PLP。 Patrick Powell
	    和 Justin Mason (PLP 维护的主要负责人) 合作完成了
	    <application>LPRng</application><application>LPRng</application> 的主站是 <uri xlink:href="http://www.lprng.org/">http://www.lprng.org/</uri></para>
	</listitem>
      </varlistentry>
      <varlistentry>
	<term>CUPS</term>

	<listitem>
	  <indexterm><primary>CUPS</primary></indexterm>

	  <para><application>CUPS</application>, 通用 UNIX 打印系统,
	    提供了一个轻便的打印层给 &unix;-基础的操作系统。
	    它是由 Easy Software
	    Products 开发的, 并且成为了 &unix;
	    供应商和用户的标准打印解决方案。</para>

	  <para><application>CUPS</application> 使用 Internet 打印协议
	    (<acronym>IPP</acronym>) 作为管理打印任务和队列的基础。
	    行式打印机守护程序
	    (<acronym>LPD</acronym>) 服务器消息块
	    (<acronym>SMB</acronym>), 和 AppSocket (a.k.a. JetDirect)
	    协议的部分功能也被支持。 CUPS
	    增加了基于浏览网络打印机和 PostScript 打印机描述
	    (<acronym>PPD</acronym>) 的打印选项来支持
	    &unix; 下的真实打印。</para>

	  <para><application>CUPS</application> 的主站是 <uri xlink:href="http://www.cups.org/">http://www.cups.org/</uri></para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>HPLIP</term>

	<listitem>
	  <indexterm><primary>HPLIP</primary></indexterm>

	  <para><application>HPLIP</application>, HP &linux; 成像及打印系统 (Imaging and
	    Printing system), 是一套由 HP 开发的用于支持 HP 的打印、
	    扫描和传真设备的工具。 这套程序利用 <application>CUPS</application>
	    打印系统作为后端来提供一些打印方面的功能。</para>

	  <para><application>HPLIP</application>
	    的主页位于 <uri xlink:href="http://hplipopensource.com/hplip-web/index.html">http://hplipopensource.com/hplip-web/index.html</uri></para>
	</listitem>
      </varlistentry>
    </variablelist>
  </sect1>

  <sect1 xml:id="printing-troubleshooting">
    <title>疑难问题</title>

    <para>在使用 &man.lptest.1; 进行简单的测试之后,
      您可能得到了下面的结果,
      而不是正确的结果:</para>

    <variablelist>
      <varlistentry>
	<term>过了一会儿, 它工作了; 或者, 它没有退出一整张纸。</term>

	<listitem>
	  <para>打印机进行了打印, 但在这之前它呆了一段而且什么都没做。
	    事实上, 您可能需要按一下打印机上的
	    打印剩余 或者 送纸 按钮来让结果出现。</para>

	  <para>如果这是问题所在, 打印机可能在等待,
	    看看在打印之前, 您的任务是否还有更多的数据。
	    要修正这个问题, 您可以让文本过滤器发送一个送纸字符
	    (或者其他需要的) 到打印机。
	    这通常足够让打印机立即打印出内部缓存内剩余的文本。
	    它同样可以用来确保每个任务的结尾都占用一整张纸,
	    这样下一个任务才不会在前一个任务最后一张纸的中间开始。</para>

	  <para>接下来的 shell 脚本
	    <filename>/usr/local/libexec/if-simple</filename>
	    的脚本打印了一个送纸符在它发送任务到打印机之后:</para>

	  <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 &amp;&amp; printf "\f" &amp;&amp; exit 0
exit 2</programlisting>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>它的输出产生了 <quote>楼梯效果</quote></term>

	<listitem>
	  <para>您可能在纸上得到下面这些:</para>

	  <screen>!"#$%&amp;'()*+,-./01234
                "#$%&amp;'()*+,-./012345
                                 #$%&amp;'()*+,-./0123456</screen>

	  <indexterm><primary>MS-DOS</primary></indexterm>
 	  <indexterm><primary>OS/2</primary></indexterm>
 	  <indexterm><primary>ASCII</primary></indexterm>
	  <para>您也成为了 <emphasis>楼梯效果</emphasis>
	    的受害者, 这是由对新行的标志字符的解释不一致造成的。
	    &unix; 风格的操作系统使用一个单个字符:
	    ASCII 码 10,
	    即换行 (LF)。 &ms-dos;, &os2;, 和其他的系统使用一对儿字符,
	    ASCII 码 10 <emphasis></emphasis> ASCII 码
	    13 (回车 CR)。 许多打印机使用 &ms-dos;
	    的习惯来代表新行。</para>

	  <para>当您在 &os; 上打印时, 您的文本仅用了换行字符。
	    打印机, 打印机看到换行字符后,
	    走一行纸, 但还光标位置还是在这张纸上要打印的下一个字符处。
	    这就是回车的作用:
	    将下一个要打印的字符的位置移到纸张的左边缘。</para>

	  <para>这里是 &os; 想要打印机做的:</para>

	  <informaltable frame="none" pgwide="1">
	    <tgroup cols="2">
	      <tbody>
		<row>
		  <entry>打印机收到 CR</entry>
		  <entry>打印机打印 CR</entry>
		</row>

		<row>
		  <entry>打印机收到 LF</entry>
		  <entry>打印机打印 CR + LF</entry>
		</row>
	      </tbody>
	    </tgroup>
	  </informaltable>

	  <para>下面有几种完成这个的办法:</para>

	  <itemizedlist>
	    <listitem>
	      <para>使用打印机的配置开关或者控制面板来更改它对这些字符的解释。
		查看打印机的手册来找到怎样更改。</para>

	      <note>
	        <para>如果您引导您的系统到其他除了
		  &os; 之外的操作系统, 您可能不得不
		  <emphasis>重新配置</emphasis> 打印机使用
		  这个操作系统对 CR 和 LF 字符的解释。
		  您可能更喜欢下面这另一种解决方案。</para>
	      </note>
	    </listitem>

	    <listitem>
	      <para>&os; 的串口驱动自动转换 LF 到 CR+LF。
		当然, 这 <emphasis>仅仅</emphasis> 工作在串口打印机上。
		要开启这个功能,
		定义 <literal>ms#</literal> 变量并
		设置 <literal>onlcr</literal> 模式在
		<filename>/etc/printcap</filename> 文件中相应打印机处。</para>
	    </listitem>

	    <listitem>
	      <para>发送一个 <emphasis>转义码</emphasis> 到打印机来让它临时对 LF 字符做不同的处理。
		参考您的打印机手册来了解您的打印机支持哪些转义码。
		当您找到合适的转义码,
		修改文本过滤器让其先发送这个转义码,
		然后再发送打印任务。</para>

	      <indexterm><primary>PCL</primary></indexterm>
	      <para>这里是一个为懂得
		Hewlett-Packard PCL 转义码的打印机编写的文本过滤器。
		这个过滤器使得打印机将 LF 作为一个 LF 和一个 CR 来对待;
		然后它发送任务; 最后发送一个送纸符弹出任务的最后一张纸。
		它应该可以在几乎所有
		Hewlett Packard 打印机上工作。</para>

	      <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&amp;k2G" &amp;&amp; cat &amp;&amp; printf "\033&amp;l0H" &amp;&amp; exit 0
exit 2</programlisting>

	      <para>下面是一个 <filename>/etc/printcap</filename> 文件的例子在叫做
		<systemitem>orchid</systemitem> 的主机上。 它只有一台打印机连接在第一个并口上,
		一台 Hewlett Packard
		LaserJet 3Si 名字叫做 <literal>teak</literal>。 它使用上面那段脚本作为文本过滤器:</para>

	      <programlisting>#
#  /etc/printcap for host orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=<filename>/dev/lpt0</filename>:sh:sd=<filename>/var/spool/lpd/teak</filename>:mx#0:\
        :if=<filename>/usr/local/libexec/hpif</filename>:</programlisting>
	    </listitem>
          </itemizedlist>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>行行覆盖。</term>

	<listitem>
	  <para>打印机从来不进纸换行。
	    所有的文本都打印在头一行文本的上面。</para>

	  <para>这个问题是 <quote>相反</quote> 于楼梯效果,
	    像上面描述的那样, 并且更少见。
	    一些地方, LF 这个 &os; 用来结束一行的字符被作为
	    CR 这个将打印位置返回到纸的左边的字符对待。
	    而没有向下走纸一行。</para>

	  <para>使用打印机的配置开关或者控制面板来强制对
	    LF 和 CR 进行下面的转换:</para>

	  <informaltable frame="none" pgwide="1">
	    <tgroup cols="2">
	      <thead>
		<row>
		  <entry>打印机收到</entry>
		  <entry>打印机打印</entry>
		</row>
	      </thead>

	      <tbody>
		<row>
		  <entry>CR</entry>
		  <entry>CR</entry>
		</row>

		<row>
		  <entry>LF</entry>
		  <entry>CR + LF</entry>
		</row>
	      </tbody>
	    </tgroup>
	  </informaltable>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>打印丢掉字符。</term>

	<listitem>
	  <para>当打印时, 每行里打印机都丢掉一些字符没有打。
	    这个问题可能随着打印的进行越发严重,
	    丢掉越来越多的字符。</para>

	  <para>这个问题是由打印机跟不上计算机通过串口发送数据的速度造成的
	    (这个问题应该不会发生在并口打印机上)。
	    有两种方法能克服这个问题:</para>

	  <itemizedlist>
	    <listitem>
	      <para>如果打印机支持 XON/XOFF 流量控制,
		那就让 &os; 使用它, 通过加入 <literal>ixon</literal> 模式在
		<literal>ms#</literal> 变量里。</para>
	    </listitem>

	    <listitem>
	      <para>如果打印机支持请求/清除硬件握手信号
                (通常时 <literal>RTS/CTS</literal>),
		指定 <literal>crtscts</literal> 模式在
		<literal>ms#</literal> 变量里。
		并且要确定连接打印机和计算机的线是支持硬件流量控制的。</para>
	    </listitem>
	  </itemizedlist>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>它打印出垃圾。</term>

	<listitem>
	  <para>打印机打印出的东西看起来是一些随机的字符,
	    而不是想要打印的东西。</para>

	  <para>这通常意味着另一种串口打印机通讯参数设置不正确的错误。
	    复查
	    <literal>br</literal> 变量中设定的波特, 和
	    <literal>ms#</literal> 中的校验设置; 确定打印机也在使用和
	    <filename>/etc/printcap</filename> 文件中相同的设置。</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>没有反应。</term>

	<listitem>
	  <para>如果没有反应, 问题就可能出在
	    &os; 而不是硬件上了。 增加日志文件
	    (<literal>lf</literal>) 变量到
	    <filename>/etc/printcap</filename> 文件里出现问题的打印机的记录处。
	    比如, 下面是打印机 <literal>rattan</literal> 的记录, 使用了
	    <literal>lf</literal> 变量:</para>

	  <programlisting>rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=<filename>/var/spool/lpd/rattan</filename>:\
        :lp=<filename>/dev/lpt0</filename>:\
        :if=<filename>/usr/local/libexec/if-simple</filename>:\
        :lf=<filename>/var/log/rattan.log</filename></programlisting>

	  <para>然后, 再次打印。 检查日志文件 (在我们的例子当中, 是
	    <filename>/var/log/rattan.log</filename> 这个文件) 来看是否有错误信息出现。
	    根据出现的信息,
	    试着来修正问题。</para>

	  <para>如果您没有指定 <literal>lf</literal> 变量,
	    <application>LPD</application> 会使用
	    <filename>/dev/console</filename> 作为默认值。</para>
	</listitem>
      </varlistentry>
    </variablelist>
  </sect1>
</chapter>