<!--
     The FreeBSD Russian Documentation Project

     $FreeBSD$
     $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/handbook/printing/chapter.sgml,v 1.12 2005/01/09 16:23:35 den Exp $

     Original revision: 1.91
-->

<chapter id="printing">
  <chapterinfo>
    <authorgroup>
      <author>
	<firstname>Sean</firstname>
	<surname>Kelly</surname>
	<contrib>Написал </contrib>
      </author>
      <!-- 30 Sept 1995 -->
    </authorgroup>
    <authorgroup>
      <author>
	<firstname>Jim</firstname>
	<surname>Mock</surname>
	<contrib>Реструктурировал и обновил </contrib>
	<!-- Mar 2000 -->
      </author>
    </authorgroup>
    <authorgroup>
      <author>
	<firstname>Валерий</firstname>
	<surname>Кравчук</surname>
	<contrib>Перевод на русский язык: </contrib>
      </author>
    </authorgroup>
  </chapterinfo>

  <title>Печать</title>

  <sect1 id="printing-synopsis">
    <title>Краткий обзор</title>
    <indexterm><primary>система спулинга LPD</primary></indexterm>
    <indexterm><primary>печать</primary></indexterm>

    <para>FreeBSD можно использовать для печати на широком спектре принтеров, от
      старых матричных до новейших лазерных, без исключений, что позволяет
      создавать высококачественные распечатки из используемых приложений.</para>

    <para>FreeBSD можно также сконфигурировать для работы в качестве сервера
      печати в сети; в этом качестве FreeBSD может получать задания печати от множества
      других компьютеров, включая другие компьютеры под управлением ОС FreeBSD, хосты &windows;
      и &macos;. FreeBSD будет гарантировать печать заданий по одному и может сохранять
      информацию о том, какие пользователи и машины выполняют основную часть печати,
      выдавать страницы-<quote>баннеры</quote>, показывающие, кому принадлежит распечатка,
      и многое другое.</para>

    <para>При прочтении этой главы вы узнаете:</para>

    <itemizedlist>
      <listitem>
	<para>Как конфигурировать спулер печати FreeBSD.</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 id="printing-intro-spooler">
    <title>Введение</title>

    <para>Для использования принтеров в ОС FreeBSD надо настроить их для
      работы с системой спулинга печати Беркли (Berkeley line printer spooling system),
      также известной как система спулинга <application>LPD</application>.
      Это &mdash; стандартная система управления принтером во FreeBSD. В этой главе
      представлена система спулинга <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>

      <indexterm><primary>задания печати</primary></indexterm>
      <listitem>
	<para>Она позволяет пользователям посылать файлы на печать; эти
	  данные
	  называют <emphasis>заданиями</emphasis>.</para>
      </listitem>

      <listitem>
	<para>Она предотвращает одновременный доступ к принтеру нескольких
	  пользователей путем поддержки <emphasis>очереди</emphasis> для каждого
	  принтера.</para>
      </listitem>

      <listitem>
	<para>Она позволяет печатать <emphasis>страницы заголовка</emphasis> (их также
	  называют <emphasis>баннерными</emphasis> или <emphasis>начальными</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 id="printing-intro-why">
      <title>Зачем использовать спулер</title>

      <para>Если вы &mdash; единственный пользователь системы, вы можете спросить,
	зачем возиться со спулером, если управление доступом,
	страницы заголовка или учет использования принтера вам не нужны. Хотя можно
	обеспечить непосредственный доступ к принтеру, в любом случае следует
	использовать спулер, поскольку:</para>

      <itemizedlist>
	<listitem>
	  <para><application>LPD</application> печатает задания в фоновом режиме;
	    вам не придется ждать, пока данные будут скопированы на принтер.</para>
	</listitem>

	<indexterm><primary>&tex;</primary></indexterm>
	<listitem>
	  <para><application>LPD</application> позволяет легко пропустить
	    задание печати через фильтры для добавления заголовков с
	    датой/временем или преобразования специального формата файлов
	    (такого как &tex; DVI) в формат, который понимает принтер.
	    Вам не придется выполнять эти шаги вручную.</para>
	</listitem>

	<listitem>
	  <para>Многие свободно распространяемые и коммерческие программы,
	     обеспечивающие возможность печати, обычно предполагают
	    взаимодействие со спулером системы. Путем настройки
	    системы спулинга вы упростите поддержку другого
	    программного обеспечения, которое может быть добавлено
	    в дальнейшем или уже установлено.</para>
	</listitem>
      </itemizedlist>
    </sect2>
  </sect1>

  <sect1 id="printing-intro-setup">
    <title>Основная настройка</title>

    <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 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> &mdash; самая сложная часть.
	Расширенные опции, вроде выдачи страниц заголовков и учета
	использования, установить несложно, как только принтер
	заработает.</para>

      <sect3 id="printing-hardware">
	<title>Настройка оборудования</title>

	<para>В этом разделе описаны различные способы подключения
	  принтера к ПК. Рассматриваются различные порты и кабели, а
	  также параметры конфигурации ядра, которые может потребоваться
	  установить, чтобы ОС FreeBSD могла взаимодействовать с
	  принтером.</para>

	<para>Если вы уже подключили ваш принтер и успешно печатали на
	  него в другой операционной системе, можете перейти к разделу
	  <link linkend="printing-software">Настройка программного
	  обеспечения</link>.</para>

	<sect4 id="printing-ports">
	  <title>Порты и кабели</title>

	  <para>Принтеры, которые продаются сегодня для использования на ПК,
	    обычно поддерживают один или несколько из следующих 
	    интерфейсов:</para>

	  <itemizedlist>
	    <indexterm>
	      <primary>принтеры</primary>
	      <secondary>последовательные</secondary>
	    </indexterm>
	    <listitem>
	      <para><emphasis>Последовательные</emphasis> интерфейсы, также
	        известные как RS232C или RS232D, или COM-порты, используют
		для посылки данных на принтер последовательный порт 
		компьютера.  Последовательные интерфейсы широко 
		распространены в компьютерной индустрии, кабели для них легко
		найти и просто сделать. Для последовательных интерфейсов
		иногда нужны специальные кабели, и для их использования может
		потребоваться настраивать достаточно сложные опции 
		взаимодействия. Большинство последовательных портов ПК имеют
		максимальную скорость передачи 115200&nbsp;бит/сек, поэтому
		печатать через них большие графические задания 
		неудобно.</para>
	    </listitem>

	    <indexterm>
	      <primary>принтеры</primary>
	      <secondary>параллельные</secondary>
	    </indexterm>
	    <listitem>
	      <para><emphasis>Параллельные</emphasis> интерфейсы используют
		параллельный порт компьютера для посылки данных на принтер.
		Параллельные интерфейсы широко распространены на рынке ПК
		и работают быстрее, чем последовательные RS232.
		Кабели легко найти, но сделать самостоятельно сложнее. При
		использовании параллельных интерфейсов опции взаимодействия
		обычно задавать не надо, что делает их конфигурирование
		существенно проще.</para>

	      <indexterm>
		<primary>centronics</primary>
		<see>параллельные принтеры</see>
	      </indexterm>
	      <para>Параллельные интерфейсы иногда называют
		интерфейсами <quote>Centronics</quote>, по названию типа
		разъема на принтере.</para>
	    </listitem>

	      <indexterm>
		<primary>принтеры</primary>
		<secondary>USB</secondary>
	      </indexterm>

	    <listitem>
	      <para>Интерфейсы USB (сокращение от Universal Serial
		Bus &mdash; универсальная последовательная шина), могут работать
		на еще больших скоростях, чем параллельные или 
		последовательные интерфейсы RS232. Кабели для них&nbsp;&mdash;
		простые и дешевые. USB превосходит последовательный RS232 
		и параллельный интерфейсы для печати, но не слишком
		хорошо поддерживается в &unix;-системах. Обойти эту проблему
		можно, купив принтер с двумя интерфейсами, USB и 
		параллельным, как у многих принтеров.</para>
	    </listitem>
	  </itemizedlist>

	  <para>В общем случае, параллельные интерфейсы обычно 
	    обеспечивают только одностороннюю передачу (с компьютера 
	    на принтер), тогда как последовательные и USB поддерживают 
	    двустороннюю. Более новые параллельные порты (EPP и ECP) и принтеры 
	    могут взаимодействовать в обоих направлениях под FreeBSD, если
	    используется кабель, соответствующий стандарту IEEE1284.</para>

	  <indexterm><primary>PostScript</primary></indexterm>
	  <para>Двустороннее взаимодействие с принтером через параллельный 
	    порт обычно выполняется одним из двух способов. Первый метод 
	    опирается на использование специально созданного драйвера 
	    принтера для FreeBSD, который поддерживает специфический язык 
	    данного принтера. Этот метод типичен для струйных принтеров и 
	    может использоваться для получения информации об уровне чернил и
	    другой информации о состоянии. Второй метод используется, когда 
	    принтер поддерживает &postscript;.</para>

	  <para>Фактически, задания &postscript;
	    являются программами, посылаемыми для выполнения принтеру;
	    они вообще могут не выдавать результат на бумагу и возвращать
	    его непосредственно компьютеру. &postscript; также использует
	    двустороннее взаимодействие для сообщения компьютеру о проблемах,
	    таких как ошибки в &postscript;-программе или замятие бумаги.
	    Такая информация может пригодиться пользователям. Более того,
	    лучший способ эффективного учета использования
	    &postscript;-принтера требует двустороннего взаимодействия:
	    вы запрашиваете у принтера значение счетчика страниц (сколько
	    страниц напечатал принтер за все время существования), затем
	    посылаете задание пользователя, затем снова запрашиваете значение
	    его счетчика страниц. Вычитаем одно значение из другого, и узнаем,
	    сколько бумаги потратил пользователь.</para>
	</sect4>

	<sect4 id="printing-parallel">
	  <title>Параллельные порты</title>

	  <para>Для подключения принтера через параллельный интерфейс,
	    соедините принтер и компьютер кабелем Centronics.
	    Инструкции для принтера, для компьютера или обе должны полностью
	    описывать эту процедуру.</para>

	  <para>Помните, какой параллельный порт компьютера вы использовали.
	    Первый параллельный порт в ОС FreeBSD &mdash;
	    <filename>/dev/ppc0</filename>; второй &mdash;
	    <filename>/dev/ppc1</filename>, и так далее. Имена устройств для
	    принтеров используют ту же схему: <filename>/dev/lpt0</filename>
	    для принтера на первом параллельном порту и т.д.</para>
	</sect4>

	<sect4 id="printing-serial">
	  <title>Последовательные порты</title>

	  <para>Для подключения принтера через последовательный интерфейс,
	    соедините принтер с компьютером подходящим последовательным кабелем.
	    Инструкции для принтера, для компьютера или обе должны полностью
	    описывать эту процедуру.</para>

	  <para>Если вы не знаете, что такое <quote>подходящий последовательный
	    кабель</quote>, можете попробовать использовать один из следующих:</para>

	  <itemizedlist>
	    <listitem>
	      <para><emphasis>Модемный</emphasis> кабель соединяет каждый штырёк
		на одном конце кабеля напрямую с соответствующим штырьком
		на другом конце. Кабель такого типа также называют
		кабелем <quote>DTE-to-DCE</quote>.</para>
	    </listitem>

	    <indexterm><primary>нуль-модемный кабель</primary></indexterm>
	    <listitem>
	      <para><emphasis>Нуль-модемный</emphasis> кабель соединяет часть
		штырьков напрямую, другие &mdash; меняет (пересылку данных на приём
		данных, например), а некоторые &mdash; закорачивает на каждом разъеме.
		Кабель такого типа также называют кабелем
		<quote>DTE-to-DTE</quote> cable.</para>
	    </listitem>

	    <listitem>
	      <para>Кабель <emphasis>последовательного принтера</emphasis>,
		необходимый для некоторых редко используемых принтеров, похож
		на нуль-модемный кабель, но посылает часть сигналов на
		соответствующие штырьки, а не закорачивает их.</para>
	    </listitem>
	  </itemizedlist>

	  <indexterm><primary>скорость передачи</primary></indexterm>
	  <indexterm><primary>четность</primary></indexterm>
	  <indexterm><primary>протокол управления передачей</primary></indexterm>
	  <para>Вам надо также настроить эти параметры взаимодействия с принтером,
	    обычно &mdash; через элементы управления на лицевой панели или переключатели
	    (DIP switches) на принтере. Выберите максимальную скорость передачи
	    <literal>bps</literal> (бит в секунду, иногда &mdash;
	    <emphasis>baud rate</emphasis>), которую могут поддерживать как
	    компьютер, так и принтер. Выберите 7 или 8 битов данных; четность none,
	    even или odd; и 1 или 2 стоп-бита. Также надо выбрать протокол управления
	    передачей: none или XON/XOFF (также известный как
	    <quote>внутриполосный</quote> или <quote>программный</quote>).
	    Запомните выбранные установки для последующего конфигурирования
	    программного обеспечения.</para>
	</sect4>
      </sect3>

      <sect3 id="printing-software">
	<title>Настройка программного обеспечения</title>

	<para>В этом разделе описана настройка программного обеспечения,
	  необходимая для печати с помощью системы спулинга
	  <application>LPD</application> в ОС FreeBSD.
	</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 id="printing-kernel">
	  <title>Конфигурирование ядра</title>

	  <para>Ядро операционной системы компилируется для работы с
	    конкретным набором устройств. Последовательный или параллельный
	    интерфейс для принтера входит в этот набор. Поэтому может
	    понадобиться добавить поддержку для дополнительного
	    последовательного или параллельного порта, если он еще
	    не сконфигурирован в ядре.</para>

	  <para>Чтобы узнать, поддерживает ли используемое в настоящий
	    момент ядро последовательный интерфейс, наберите:</para>

	  <screen>&prompt.root; <userinput>grep sio<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen>

	  <para>Где <replaceable>N</replaceable> &mdash; номер последовательного
	    порта, начиная с нуля. Если вы получаете результат, подобный
	    следующему:</para>

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

	  <para>значит, ядро поддерживает порт.</para>

	  <para>Чтобы узнать, поддерживает ли ядро параллельный интерфейс,
	    наберите:</para>

	  <screen>&prompt.root; <userinput>grep ppc<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen>

	  <para>Где <replaceable>N</replaceable>  номер параллельного порта,
	    начиная с нуля. Если вы получаете результат, подобный
	    следующему:</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 id="printing-dev-ports">
	<title>Добавление файлов <filename>/dev</filename> для портов</title>

	<note><para>FreeBSD&nbsp;5.0 включает файловую систему
	  <literal>devfs</literal>, которая автоматически создает
	  специальные файлы устройств по мере необходимости.
	  Если вы используете версию FreeBSD с включенной поддержкой
	  <literal>devfs</literal>, можно пропустить этот раздел.</para></note>

	<para>Хотя ядро может уже поддерживать взаимодействие по
	  последовательному или параллельному порту, вам необходим
	  программный интерфейс, через которых работающие в системе программы
	  смогут посылать и принимать данные. Именно для этого и
	  существуют специальные файлы устройств в каталоге
	  <filename>/dev</filename>.</para>

	<para><emphasis>Для добавления файла в каталог <filename>/dev</filename>
	  для порта:</emphasis></para>

	<procedure>
	  <step>
	    <para>Станьте пользователем <username>root</username> с помощью
		команды &man.su.1;.
	       Введите пароль пользователя <username>root</username>
	       в ответ на приглашение.</para>
	  </step>

	  <step>
	    <para>Перейдите в каталог <filename>/dev</filename>:</para>

	    <screen>&prompt.root; <userinput>cd /dev</userinput></screen>
	  </step>

	  <step>
	    <para>Введите команду:</para>

	    <screen>&prompt.root; <userinput>./MAKEDEV <replaceable>port</replaceable></userinput></screen>

	    <para>Где <replaceable>port</replaceable> &mdash; имя специального файла
	      устройства для порта, который вы хотите создать. Используйте
	      <literal>lpt0</literal> для принтера на первом параллельном порту,
	      <literal>lpt1</literal> для принтера на втором порту и т.д.;
	      используйте <literal>ttyd0</literal> для первого последовательного
	      порта, <literal>ttyd1</literal> &mdash; для второго и так далее.</para>
	  </step>

	  <step>
	    <para>Введите команду:</para>

	    <screen>&prompt.root; <userinput>ls -l <replaceable>port</replaceable></userinput></screen>

	    <para>чтобы убедиться, что требуемый специальный файл устройства
	      создан.</para>
	  </step>
	</procedure>

	<sect4 id="printing-parallel-port-mode">
	  <title>Настройка режима взаимодействия для параллельного порта</title>

	  <para>При использовании параллельного интерфейса можно выбрать,
	    должна ли ОС FreeBSD взаимодействовать с принтером на основе
	    прерываний или путем опроса. Универсальный драйвер принтера
	    (&man.lpt.4;) во FreeBSD&nbsp;4.X и 5.X использует
	    систему &man.ppbus.4;, которая управляет чипсетом порта
	    с помощью драйвера &man.ppc.4;.</para>

	  <itemizedlist>
	    <listitem>
	      <para>Метод взаимодействия <emphasis>на основе прерываний</emphasis>
		является стандартным для ядра GENERIC. По этому методу,
		операционная система использует линию запроса прерывания (IRQ line)
		для определения готовности принтера к приему данных.</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>Если необходимо установить режим на основе прерываний,
		    для FreeBSD&nbsp;4.X добавьте спецификацию
		    <literal>irq</literal>:</para>

		  <programlisting>device ppc0 at isa? irq <replaceable>N</replaceable></programlisting>

		  <para>Где <replaceable>N</replaceable> &mdash; номер IRQ
		    для параллельного порта компьютера.</para>

		  <para>Для FreeBSD&nbsp;5.X, отредактируйте следующую строку:</para>

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

		  <para>в файле <filename>/boot/device.hints</filename>, заменив
		    <replaceable>N</replaceable> соответствующим номером IRQ.
		    Файл конфигурации ядра также должен содержать драйвер
		    &man.ppc.4;:</para>

		  <screen>device ppc</screen>

		</listitem>

		<listitem>
		  <para>Если необходимо установить режим опроса, не добавляйте
		    спецификацию <literal>irq</literal>:</para>

		  <para>Для FreeBSD&nbsp;4.X используйте следующую строку в
		    файле конфигурации ядра:</para>

		  <programlisting>device ppc0 at isa?</programlisting>

		  <para>Для FreeBSD&nbsp;5.X просто удалите из файла
		    <filename>/boot/device.hints</filename> следующую
		    строку:</para>

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

		  <para>В некоторых случаях, этого недостаточно для перевода
		    порта в режим опроса под FreeBSD&nbsp;5.X. Чаще всего,
		    проблема связана с драйвером &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;:</para>

	  <procedure>
	    <step>
	      <para>Введите команду:</para>

	      <screen>&prompt.root; <userinput>lptcontrol -i -d /dev/lpt<replaceable>N</replaceable></userinput></screen>

	      <para>для установки режима взаимодействия на основе прерываний
		для <literal>lpt<replaceable>N</replaceable></literal>.</para>
	    </step>

	    <step>
	      <para>Введите команду:</para>

	      <screen>&prompt.root; <userinput>lptcontrol -p -d /dev/lpt<replaceable>N</replaceable></userinput></screen>

	      <para>для установки режима взаимодействия по опросу для
	    <literal>lpt<replaceable>N</replaceable></literal>.</para>
	    </step>
	  </procedure>

	  <para>Вы можете поместить эти команды в файл
	    <filename>/etc/rc.local</filename> для установки требуемого режима
	    при каждой загрузке системы. Дополнительную информацию об этом
	    ищите на странице справочного руководства &man.lptcontrol.8;.</para>
	</sect4>

	<sect4 id="printing-testing">
	  <title>Проверка взаимодействия с принтером</title>

	  <para>Прежде чем переходить к конфигурированию системы спулинга,
	    надо убедиться, что операционная система может успешно посылать данные
	    на принтер. Намного проще отлаживать взаимодействие с принтером и
	    систему спулинга отдельно.</para>

	  <para>Для тестирования принтера мы пошлем на него текст. Для принтеров,
	    которые могут непосредственно печатать посланные на них символы,
	    идеально подходит программа &man.lptest.1;: она генерирует все 96
	    печатных символов ASCII в 96 строках.</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 компании Hewlett
	      Packard. Хотя PCL имеет прекрасные функциональные возможности, в нем
	      можно смешивать обычный текст с его управляющими
	      последовательностями. &postscript; не позволяет непосредственно
	      печатать обычный текст, и это язык принтера именно того рода,
	      для которого надо выполнять специальные настройки.</para>
	  </note>

	  <sect5 id="printing-checking-parallel">
	    <title>Проверка параллельного принтера</title>

	    <indexterm>
	      <primary>принтеры</primary>
	      <secondary>параллельные</secondary>
	    </indexterm>
	    <para>В этом разделе описано, как проверить, может ли ОС FreeBSD
	      взаимодействовать с принтером, подключенным к параллельному порту.</para>

	    <para><emphasis>Для тестирования принтера на параллельном порту:</emphasis></para>

	    <procedure>
	      <step>
		<para>Станьте пользователем <username>root</username> с помощью
		команды &man.su.1;.</para>
	      </step>

	      <step>
		<para>Пошлите данные на принтер.</para>

		<itemizedlist>
		  <listitem>
		    <para>Если принтер может печатать обычный текст, используйте
		      утилиту &man.lptest.1;. Введите команду:</para>

		    <screen>&prompt.root; <userinput>lptest &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>

		    <para>Где <replaceable>N</replaceable> &mdash; номер параллельного порта,
		      начиная с нуля.</para>
		  </listitem>

		  <listitem>
		    <para>Если принтер понимает &postscript; или другой язык принтера,
		      пошлите на принтер небольшую программу. Введите команду:</para>

		    <screen>&prompt.root; <userinput>cat &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>

		    <para>Затем, построчно, <emphasis>внимательно</emphasis> введите
		      программу, поскольку вы не сможете отредактировать строку
		      после нажатия клавиши <literal>RETURN</literal>
		      или <literal>ENTER</literal>. По окончании ввода программы,
		      нажмите <literal>CONTROL+D</literal> или другую комбинацию клавиш,
		      используемую для ввода символа конца файла.</para>

		    <para>Можно также поместить программу в файл и выполнить команду:</para>

		    <screen>&prompt.root; <userinput>cat <replaceable>file</replaceable> &gt; /dev/lpt<replaceable>N</replaceable></userinput></screen>

		    <para>Где <replaceable>file</replaceable> &mdash; имя файла, содержащего
		      программу, которую вы хотите послать принтеру.</para>
		  </listitem>
		</itemizedlist>
	      </step>
	    </procedure>

	    <para>Вы должны увидеть распечатку. Не переживайте, если текст выглядит
	      не так, как предполагалось; этими проблемами мы займемся позже.</para>
	  </sect5>

	  <sect5 id="printing-checking-serial">
	    <title>Проверка последовательного принтера</title>

	    <indexterm>
	      <primary>принтеры</primary>
	      <secondary>последовательные</secondary>
	    </indexterm>
	    <para>В этом разделе описано, как проверить, может ли ОС FreeBSD
	      взаимодействовать с принтером, подключенным к последовательному
	      порту.</para>

	    <para><emphasis>Для тестирования принтера на последовательном
	      порту:</emphasis></para>

	    <procedure>
	      <step>
		<para>Станьте пользователем <username>root</username> с помощью
		  команды &man.su.1;.</para>
	      </step>

	      <step>
		<para>Отредактируйте файл <filename>/etc/remote</filename>.
		  Добавьте следующую запись:</para>

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

		<indexterm><primary>бит в секунду</primary></indexterm>
		<indexterm><primary>последовательный порт</primary></indexterm>
		<indexterm><primary>четность</primary></indexterm>
		<para>Где <replaceable>port</replaceable> &mdash; специальный файл
		  устройства для последовательного порта (<literal>ttyd0</literal>,
		  <literal>ttyd1</literal> и т.д.), <replaceable>bps-rate</replaceable> &mdash;
		  скорость обработки данных принтером, в битах в секунду,
		  а <replaceable>parity</replaceable> &mdash; требуемая принтером четность
		  (значение <literal>even</literal>, <literal>odd</literal>,
		  <literal>none</literal> или <literal>zero</literal>).</para>

		<para>Вот пример записи для принтера, подключенного
		  к третьему последовательному порту на скорости 19200&nbsp;bps
		  без четности:</para>

		<programlisting>printer:dv=/dev/ttyd2: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/cuaa<replaceable>N</replaceable></filename>
		  вместо <filename>/dev/ttyd<replaceable>N</replaceable></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>, поскольку нажатие клавиши Backspacе
		      или других клавиш редактирования может иметь значение
		      для принтера. Может также понадобиться нажать специальную
		      комбинацию клавиш, обозначающую конец файла, чтобы принтер
		      понял, что получена вся программа.  Для
		      &postscript;-принтеров нажмите <literal>CONTROL+D</literal>.</para>

		    <para>Можно также поместить программу в файл и ввести команду:</para>

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

		    <para>Где <replaceable>file</replaceable> &mdash; имя файла,
		      содержащего программу. После того, как утилита
		      &man.tip.1; пошлет файл, нажмите требуемую для
		      ввода признака конца файла комбинацию клавиш.</para>
		  </listitem>
		</itemizedlist>
	      </step>
	    </procedure>

	    <para>Вы должны увидеть распечатку. Не переживайте, если текст выглядит
	      не так, как предполагалось; этими проблемами мы займемся позже.</para>
	  </sect5>
	</sect4>
      </sect3>

      <sect3 id="printing-printcap">
	<title>Включение спулера: файл <filename>/etc/printcap</filename></title>

	<para>Сейчас ваш принтер уже должен быть подключен, ядро
	  (при необходимости) &mdash; сконфигурировано для взаимодействия с ним,
	  и вы смогли послать на принтер простые данные. Теперь мы готовы
	  к конфигурированию системы <application>LPD</application> для управления
	  доступом к принтеру.</para>

	<para>Система <application>LPD</application> конфигурируется путем
	  редактирования файла <filename>/etc/printcap</filename>. Система
	  спулинга <application>LPD</application> читает этот файл при
	  каждом использовании спулера, так что, изменения в файле
	  сразу же учитываются.</para>

	<indexterm>
	  <primary>принтеры</primary>
	  <secondary>характеристики</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>

	  <indexterm><primary>начальные страницы</primary></indexterm>
	  <step>
	    <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 id="printing-naming">
	  <title>Именование принтера</title>

	  <para>Первый (простой) шаг &mdash; выбрать имя для принтера.
	    На самом деле, не важно, выберете ли вы функциональное имя или
	    причудливое, поскольку для принтера можно также задать несколько
	    псевдонимов.</para>

	  <para>По крайней мере, один из принтеров, указанных в файле
	    <filename>/etc/printcap</filename>, должен иметь псевдоним
	    <literal>lp</literal>. Это &mdash; стандартное имя принтера.
	    Если пользователи не установят переменную среды <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 и лазерный &postscript;-принтер
	     Panasonic KX-P4455):</para>

	  <programlisting>#
#  /etc/printcap для хоста 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 id="printing-no-header-pages">
	  <title>Подавление выдачи начальных страниц</title>
	  <indexterm>
	    <primary>печать</primary>
	    <secondary>начальных страниц</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 для хоста rose - никаких начальных страниц
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:</programlisting>

	  <para>Обратите внимание, как мы использовали правильный формат: первая
	    строка начинается с самого левого столбца, а последующие строки
	    смещены на один символ табуляции. Каждая строка в записи,
	    кроме последней, завершается символом обратной косой черты.</para>
	</sect4>

	<sect4 id="printing-spooldir">
	  <title>Создание каталога для спулинга</title>
	  <indexterm><primary>printer spool</primary></indexterm>
	  <indexterm><primary>задания печати</primary></indexterm>

	  <para>Следующий шаг в простой настройке спулера &mdash; создать
	    <emphasis>каталог для спулинга</emphasis>, каталог, в котором
	    находятся задания печати, пока не будут напечатаны, и где находятся
	    еще несколько других файлов для поддержки спулера.</para>

	  <para>Из-за присущих каталогам спулинга постоянных изменений, принято
	    помещать эти каталоги в каталог <filename>/var/spool</filename>.
	    Кроме того, не нужно создавать резервные копии содержимого каталогов
	    спулинга. Пересоздать их можно с помощью простой команды
	    &man.mkdir.1;.</para>

	  <para>Принято также задавать для каталога имя, совпадающее с именем
	    принтера, как показано ниже:</para>

	  <screen>&prompt.root; <userinput>mkdir /var/spool/<replaceable>имя-принтера</replaceable></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 и группе daemon, и никому больше. Мы установим это для
	      каталогов спулинга принтеров из нашего примера:</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>Наконец, надо сообщить системе <application>LPD</application>
	    об этих каталогах с помощью файла <filename>/etc/printcap</filename>.
	    Полное имя каталога спулинга задается с помощью характеристики
	    <literal>sd</literal>:</para>

	  <programlisting>#
#  /etc/printcap для хоста rose - добавлены каталоги спулинга
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:

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

	  <para>Обратите внимание, что имя принтера начинается с самого
	    первого столбца, а все последующие строки смещены на один
	    символ табуляции и каждая строка в записи,
	    кроме последней, завершается символом обратной косой черты.</para>

	  <para>Если вы не зададите каталог спулинга с помощью характеристики
	    <literal>sd</literal>, система спулинга будет использовать по умолчанию
	    каталог <filename>/var/spool/lpd</filename>.</para>
	</sect4>

	<sect4 id="printing-device">
	  <title>Выбор устройства для принтера</title>

	  <para>В разделе <link linkend="printing-dev-ports">Добавление файлов
	    <filename>/dev</filename> для портов</link> мы выяснили, какой специальный
	    файл устройства в каталоге <filename>/dev</filename> FreeBSD будет
	    использовать для взаимодействия с принтером. Теперь мы сообщаем эту
	    информацию системе <application>LPD</application>. Когда у системы
	    спулинга есть задание для печати, она будет открывать указанное устройство
	    от имени программы-фильтра (которая отвечает за передачу данных
	    на принтер).</para>

	  <para>Задайте полное имя устройства <filename>/dev</filename> в файле
	    <filename>/etc/printcap</filename> с помощью характеристики
	    <literal>lp</literal>.</para>

	  <para>В нашем текущем примере давайте предположим, что принтер
	    <literal>rattan</literal> подключен к первому параллельному порту,
	    а принтер <literal>bamboo</literal> &mdash; к шестому последовательному
	    порту; вот что нужно добавить в файл <filename>/etc/printcap</filename>:</para>

	  <programlisting>#
#  /etc/printcap для хоста rose - указано, какие устройства использовать
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:

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

	  <para>Если вы не укажете характеристику <literal>lp</literal> для
	    принтера в файле <filename>/etc/printcap</filename>, система
	    <application>LPD</application> использует по умолчанию
	    устройство <filename>/dev/lp</filename>. Устройство
	    <filename>/dev/lp</filename> сейчас в ОС FreeBSD не существует.</para>

	  <para>Если устанавливаемый принтер подключен к параллельному порту,
	    перейдите к разделу <link linkend="printing-textfilter">Установка
	    текстового фильтра</link>. Иначе выполните сначала инструкции,
	    представленные в следующем разделе.</para>
	</sect4>

	<sect4 id="printing-commparam">
	  <title>Конфигурирование параметров взаимодействия спулера</title>
	  <indexterm>
	    <primary>принтеры</primary>
	    <secondary>последовательные</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#<replaceable>bps-rate</replaceable></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 или 115200 бит в секунду.</para>
	      </listitem>
	    </varlistentry>

	    <varlistentry>
	      <term><literal>ms#<replaceable>stty-mode</replaceable></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>Давайте зададим опции для нашего принтера на шестом последовательном
	    порту. Мы установим скорость передачи 38400. В качестве режима
	    установим режим без четности с помощью <literal>-parenb</literal>,
	    8-битовые символы с помощью <literal>cs8</literal>,
	    отсутствие модемного управления с помощью <literal>clocal</literal> и
	    аппаратное управление потоком с помощью опции <literal>crtscts</literal>:</para>

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

	<sect4 id="printing-textfilter">
	  <title>Установка текстового фильтра</title>
	  <indexterm>
	    <primary>печать</primary>
	    <secondary>фильтры</secondary>
	  </indexterm>

	  <para>Теперь мы готовы задать системе <application>LPD</application>,
	    какой текстовый фильтр использовать для посылки заданий на принтер.
	    <emphasis>Текстовый фильтр</emphasis>, известный также как
	    <emphasis>входной фильтр</emphasis>, &mdash; это программа,
	    которую система <application>LPD</application> запускает при
	    получении задания на
	    печать. Когда система <application>LPD</application> запускает
	    текстовый фильтр для принтера, она направляет на стандартный
	    входной поток фильтра задание печати, а его стандартный выходной
	    поток &mdash; на устройство принтера, заданное характеристикой <literal>lp</literal>.
	    Предполагается, что фильтр прочитает задание из стандартного входного
	    потока, выполнит все необходимые для принтера преобразования и
	    выдаст результат в стандартный выходной поток, который и будет
	    напечатан. Подробнее о текстовом фильтре см. в разделе
	    <link linkend="printing-advanced-filters">Фильтры</link>.</para>

	  <para>Для простой настройки принтера в качестве текстового фильтра можно
	    задать небольшой скрипт командного интерпретатора, который просто
	    выполняет <command>/bin/cat</command> для посылки задания на принтер.
	    В составе FreeBSD поставляется другой фильтр, <filename>lpf</filename>,
	    обрабатывающий забой и подчеркивание для принтеров, которые не слишком
	    хорошо справляются с потоком данных, содержащих такие символы. И,
	    конечно же, вы можете использовать любую другую необходимую
	    программу-фильтр. Фильтр <command>lpf</command> детально описан в разделе
	    <link linkend="printing-advanced-lpf">lpf: текстовый фильтр</link>.</para>

	  <para>Сначала давайте создадим скрипт командного интерпретатора
	    <filename>/usr/local/libexec/if-simple</filename> для простого
	    тестового фильтра. Поместите в этот файл следующий текст с помощью
	    любимого текстового редактора:</para>

	  <programlisting>#!/bin/sh
#
# if-simple - Простой фильтр входного текста для lpd
# Установлен в /usr/local/libexec/if-simple
#
# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.

/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>А теперь потребуйте от системы LPD его использовать, указав его в
	    качестве значения характеристики <literal>if</literal> в файле
	    <filename>/etc/printcap</filename>. Мы добавим его для двух принтеров,
	    имеющихся пока в примере файла <filename>/etc/printcap</filename>:</para>

	  <programlisting>#
#  /etc/printcap для хоста rose - добавлен текстовый фильтр
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\ :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

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

	  <note>
	    <para>Копию скрипта <filename>if-simple</filename> можно
	      найти в каталоге <filename
	      class="directory">/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 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 -P<replaceable>printer-name</replaceable></userinput></screen>

	  <para>Где <replaceable>printer-name</replaceable> &mdash; имя
	    (или псевдоним) принтера, заданное в файле
	    <filename>/etc/printcap</filename>. Для проверки стандартного
	    принтера, введите команду &man.lpr.1; без аргумента <option>-P</option>.
	    Как уже отмечалось, если тестируется принтер, предполагающий использование
	    &postscript;, пошлите ему &postscript;-программу вместо использования
	    утилиты &man.lptest.1;. Это можно сделать, поместив программу в файл
	    и выполнив команду <command>lpr <replaceable>file</replaceable></command>.</para>

	  <para>Для &postscript;-принтера вы должны получить результаты выполнения
	    программы. Если вы используете &man.lptest.1;, ваши результаты должны
	    иметь такой вид:</para>

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

	  <para>Для дальнейшего тестирования принтера, попытайтесь загрузить
	    программы побольше (для принтеров, поддерживающих определенный язык)
	    или выполните команду &man.lptest.1; с другими аргументами. Например,
	    команда <command>lptest 80 60</command> выдаст 60 строк по 80
	    символов в каждой.</para>

	  <para>Если принтер не работает, см. раздел <link
	    linkend="printing-troubleshooting">Выявление проблем</link>.</para>
	</sect4>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="printing-advanced">
    <title>Расширенная настройка принтера</title>

    <para>В этом разделе описаны фильтры для печати специально сформатированных
      файлов, начальных страниц, печати по сети, ограничения и учета использования
      принтера.</para>

    <sect2 id="printing-advanced-filter-intro">
      <title>Фильтры</title>
      <indexterm>
    <primary>печать</primary>
    <secondary>фильтры</secondary>
      </indexterm>

      <para>Хотя система <application>LPD</application> поддерживает сетевые
	протоколы, очереди, контроль доступа и другие аспекты печати, большая
	часть <emphasis>реальной</emphasis> работы происходит в
	<emphasis>фильтрах</emphasis>. Фильтры &mdash; это программы,
	взаимодействующие с принтером и обеспечивающие учет особенностей
	устройства и специальных требований. При простой настройке принтера
	мы установили фильтр для обычного текста &mdash; крайне простой, который
	должен работать с большинством принтеров (см. раздел
	<link linkend="printing-textfilter">Установка текстового
	фильтра</link>).</para>

      <para>Однако, чтобы обеспечить преобразования формата, учет использования
	принтера и индивидуальных особенностей отдельных принтеров и т.п.,
	надо разобраться, как работают фильтры. В конечном итоге, всеми этими
	аспектами печати должен заниматься фильтр. А плохая новость состоит
	в том, что, в большинстве случаев, вы <emphasis>сами</emphasis>
	должны предоставить соответствующие фильтры. Хорошая новость состоит
	в том, что многие фильтры общедоступны; а если подходящих нет,
	их обычно легко написать.</para>

      <para>Кроме того, в составе ОС FreeBSD поставляется один фильтр,
	<filename>/usr/libexec/lpr/lpf</filename>, работающий со многими
	принтерами, которые могут печатать обычный текст. (Он обрабатывает
	символы забоя и табуляции в файле, выполняет учет использования, но
	и не более того.) Есть также ряд фильтров и компонентов фильтров
	в наборе портов FreeBSD.</para>

      <para>Вот что вы найдете в этом разделе:</para>

      <itemizedlist>
	<listitem>
	  <para>В разделе <link linkend="printing-advanced-filters">Как работают
	    фильтры</link> сделана попытка дать обзор роли фильтра в процессе
	    печати. Прочтите этот раздел, чтобы понять, что происходит
	    <quote>за кадром</quote>, когда система <application>LPD</application>
	    использует фильтры. Это понимание поможет предвидеть и решать
	    проблемы, с которыми вы можете столкнуться при добавлении дополнительных
	    фильтров для каждого из принтеров.</para>
	</listitem>

	<listitem>
	  <para>Система <application>LPD</application> предполагает, что 
	    каждый принтер, по умолчанию, может печатать обычный текст. Это 
	    проблематично для &postscript;-принтеров (или принтеров на базе 
	    другого языка), поскольку они не могут печатать обычный текст 
	    непосредственно. В разделе 
	    <link linkend="printing-advanced-if-conversion">Прием заданий с
	    обычным текстом на &postscript;-принтеры</link> описано, что 
	    нужно сделать, чтобы решить эту проблему. Прочтите этот раздел,
	    если используете &postscript;-принтер.</para>
	</listitem>

	<listitem>
	  <para>&postscript; &mdash; популярный формат выдачи для многих программ. 
	    Некоторые люди даже пишут &postscript;-код непосредственно. К
	    сожалению, &postscript;-принтеры дороги. В разделе <link
	    linkend="printing-advanced-ps">Имитация &postscript; на
	    не-&postscript; принтерах</link> описано, как можно дополнительно
	    изменить текстовый фильтр принтера для приема и печати данных
	    &postscript; не <emphasis>не-&postscript;</emphasis> принтере.
	    Прочтите этот раздел, если ваш принтер не поддерживает 
	    &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> &mdash; для печати растровых изображений, и
	      так далее. Я рекомендую прочитать этот раздел.</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>, &mdash; достаточно
	    полный, хотя и простой текстовый фильтр для строчных принтеров
	    (и лазерных принтеров, работающих как строчные), поставляемый в
	    составе ОС FreeBSD. Если надо быстро настроить учет использования
	    принтера для обычного текста или если используется принтер,
	    из которого при получении символов забоя идет дым, несомненно,
	    стоит подумать об использовании <command>lpf</command>.</para>
	</listitem>
      </itemizedlist>

      <note>
	<para>Различные скрипты, описанные далее, можно найти в каталоге
	  <filename 
	  class="directory">/usr/share/examples/printing</filename>.</para>
      </note>

      <sect3 id="printing-advanced-filters">
	<title>Как работают фильтры</title>

	<para>Как уже упоминалось, фильтр &mdash; это выполняемая программа, запускаемая
	  системой <application>LPD</application> для поддержки специфических
	  особенностей устройства при взаимодействии с принтером.</para>

	<para>Когда системе <application>LPD</application> надо напечатать
	  входящий в задание файл, она запускает программу-фильтр. Стандартный
	  входной поток фильтра связывается с файлом, который надо распечатать,
	  его стандартный выходной поток &mdash; с принтером, а стандартный поток
	  ошибок перенаправляется в файл регистрации ошибок (задается
	  характеристикой <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><emphasis>Текстовый фильтр</emphasis>, который в документации
	      <application>LPD</application> двусмысленно называют
	      <emphasis>входным фильтром</emphasis>, обеспечивает печать
	      обычного текста. Рассматривайте его как стандартный фильтр.
	      Система <application>LPD</application> предполагает, что любой
	      принтер может по умолчанию печатать обычный текст, а на текстовый
	      фильтр возлагается задача обеспечить, чтобы символы забоя,
	      табуляции или другие специальные символы не сбивали принтер с
	      толку. Если вы работаете в среде, где надо учитывать
	      использование принтера, текстовый фильтр должен также
	      учитывать количество напечатанных страниц, обычно, подсчитывая
	      количество напечатанных строк и сравнивая их с количеством строк на
	      страницу, поддерживаемых принтером. Текстовый фильтр запускается со
	      следующим списком аргументов:

	      <cmdsynopsis>
		<command>имя-фильтра</command>
		<arg>-c</arg>
		<arg choice="plain">-w<replaceable>ширина</replaceable></arg>
		<arg choice="plain">-l<replaceable>длина</replaceable></arg>
		<arg choice="plain">-i<replaceable>сдвиг</replaceable></arg>
		<arg choice="plain">-n <replaceable>имя-пользователя</replaceable></arg>
		<arg choice="plain">-h <replaceable>хост</replaceable></arg>
		<arg choice="plain"><replaceable>учетный-файл</replaceable></arg>
	      </cmdsynopsis>

	      где

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

		  <listitem>
		    <para>указывается, если задание послано командой
		      <command>lpr -l</command></para>
		  </listitem>
		</varlistentry>
		
		<varlistentry>
		  <term><replaceable>ширина</replaceable></term>

		  <listitem>
		    <para>значение из характеристики <literal>pw</literal> (page
		      width &mdash; ширина страницы), указанной в файле
		      <filename>/etc/printcap</filename>, по умолчанию &mdash; 132</para>
		  </listitem>
		</varlistentry>
		
		<varlistentry>
		  <term><replaceable>длина</replaceable></term>

		  <listitem>
		    <para>значение из характеристики <literal>pl</literal> (page
		      length &mdash; длина страницы), по умолчанию &mdash; 66</para>
		  </listitem>
		</varlistentry>
		
		<varlistentry>
		  <term><replaceable>сдвиг</replaceable></term>

		  <listitem>
		    <para>сдвиг, заданный командой <command>lpr -i</command>,
		    по умолчанию &mdash; 0</para>
		  </listitem>
		</varlistentry>
		
		<varlistentry>
		  <term><replaceable>имя-пользователя</replaceable></term>

		  <listitem>
		    <para>регистрационное имя пользователя, печатающего файл</para>
		  </listitem>
		</varlistentry>
		
		<varlistentry>
		  <term><replaceable>хост</replaceable></term>

		  <listitem>
		    <para>имя хоста, с которого было послано задание</para>
		  </listitem>
		</varlistentry>
		
		<varlistentry>
		  <term><replaceable>учетный-файл</replaceable></term>

		  <listitem>
		    <para>имя учетного файла, задаваемое характеристикой
		      <literal>af</literal>.</para>
		  </listitem>
		</varlistentry>
	      </variablelist>
	    </para>
	  </listitem>

      <indexterm>
      <primary>печать</primary>
      <secondary>фильтры</secondary>
    </indexterm>
	  <listitem>
	    <para><emphasis>Фильтр преобразования</emphasis> преобразует
	      специфичный формат файла в то, что принтер может воспроизвести
	      на бумаге. Например, данные системы набора ditroff нельзя печатать
	      непосредственно, но можно установить фильтр преобразования
	      для файлов ditroff, чтобы преобразовывать данные ditroff
	      в тот вид, который принтер может воспринять и напечатать. В разделе
	      <link linkend="printing-advanced-convfilters">Фильтры
	      преобразования</link> написано всё об этих фильтрах. Фильтры
	      преобразования также необходимы для учета, если предполагается
	      учет использования принтера. Фильтры преобразования
	      запускаются со следующими аргументами:

	      <cmdsynopsis>
		<command>имя-фильтра</command>
		<arg
		  choice="plain">-x<replaceable>ширина-пиксела</replaceable></arg>
		<arg choice="plain">-y<replaceable>высота-пиксела</replaceable></arg>
		<arg choice="plain">-n <replaceable>имя-пользователя</replaceable></arg>
		<arg choice="plain">-h <replaceable>хост</replaceable></arg>
		<arg choice="plain"><replaceable>учетный-файл</replaceable></arg>
	      </cmdsynopsis>

	      где <replaceable>ширина-пиксела</replaceable> &mdash; значение
	      характеристики <literal>px</literal> (по умолчанию &mdash; 0),
	      а <replaceable>высота-пиксела</replaceable> &mdash; значение характеристики
	      <literal>py</literal> (по умолчанию &mdash; 0).</para>
	  </listitem>

	  <listitem>
	    <para><emphasis>Выходной фильтр</emphasis> используется только
	      если нет текстового фильтра или если включена выдача начальных
	      страниц. Судя по моему опыту, выходные фильтры используются редко.
	      Они описаны в разделе <link linkend="printing-advanced-of">Выходные
	      фильтры</link>. У выходного фильтра есть всего два аргумента:

	      <cmdsynopsis>
		<command>имя-фильтра</command>
		<arg choice="plain">-w<replaceable>ширина</replaceable></arg>
		<arg choice="plain">-l<replaceable>длина</replaceable></arg>
	      </cmdsynopsis>

	      которые идентичны аргументам <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>Поставляемый в составе FreeBSD текстовый фильтр
	  <filename>/usr/libexec/lpr/lpf</filename> использует аргументы, задающие
	  ширину и длину страницы для определения того, когда посылать символ
	  прогона страницы (form feed) и как учитывать использование принтера.
	  Он использует переданные в качестве аргументов имя пользователя,
	  хост и учетный файл для внесения учетных записей.</para>

	<para>При поиске фильтров убедитесь, что они совместимы с системой LPD.
	  Если да, они должны поддерживать описанные выше списки аргументов.
	  Если вы планируете создавать фильтры для общего использования,
	  позаботьтесь о поддержке этих списков аргументов и кодов выхода.</para>
      </sect3>

      <sect3 id="printing-advanced-if-conversion">
	<title>Прием заданий с обычным текстом на &postscript;-принтеры</title>
	<indexterm><primary>задания печати</primary></indexterm>

	<para>Если вы &mdash; единственный пользователь компьютера и &postscript;-принтера
	  (или принтера на основе другого языка), и вы обещаете никогда не
	  посылать на принтер обычный текст и никогда не использовать возможностей
	  различных программ, требующих посылки на принтер обычного текста,
	  вам можно не заботиться о том, что описано в этом разделе.</para>

	<para>Но, если вы хотите посылать на принтер как задания &postscript;,
	  так и обычный текст, рекомендуется дополнить настройку принтера. Для
	  этого надо, чтобы текстовый фильтр определял, является ли поступающее
	  задание обычным текстом или программой на языке &postscript;. Все
	  &postscript;-задания должны начинаться с <literal>%!</literal> (для
	  других языков принтеров обратитесь к соответствующей документации).
	  Если первые два символа в задании &mdash; именно эти, речь идет о &postscript;,
	  и мы можем остальную часть задания передавать непосредственно. Если же
	  первые два символа в файле &mdash; другие, фильтр будет преобразовывать
	  текст в &postscript; и печатать результат.</para>

	<para>Как нам это сделать?</para>

	<indexterm>
	  <primary>принтеры</primary>
	  <secondary>последовательные</secondary>
	</indexterm>
	<para>Если вы используете последовательный принтер, хороший способ
	  достичь поставленной цели состоит в установке <command>lprps</command>.
	  <command>lprps</command> &mdash; это фильтр для &postscript;-принтера,
	  выполняющий двустороннее взаимодействие с принтером. Он обновляет файл
	  состояния принтера, помещая в него подробную информацию, выданную
	  принтером, так что пользователи и администраторы могут узнать,
	  в каком именно состоянии (например, <errorname>toner low</errorname>
	  или <errorname>paper jam</errorname>) находится принтер. Но еще
	  важнее, что он включает программу <command>psif</command>, которая
	  определяет, является ли входящее задание обычным текстом, и вызывает
	  <command>textps</command> (еще одну программу, поставляемую вместе
	  с <command>lprps</command>) для преобразования его в &postscript;.
	  Затем <command>lprps</command> посылает преобразованное задание
	  на принтер.</para>

	<para><command>lprps</command> входит в набор портов FreeBSD
	  (см. <link linkend="ports">Набор портов</link>). Вы, конечно, можете
	  загрузить, собрать и установить его самостоятельно. После установки
	  <command>lprps</command> просто укажите путь к программе
	  <command>psif</command>, входящей в состав пакета
	  <command>lprps</command>. Если вы установили <command>lprps</command>
	  из набора портов, используйте следующий текст в записи для
	  последовательного &postscript;-принтера в файле
	  <filename>/etc/printcap</filename>:</para>

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

	<para>Надо также задать характеристику <literal>rw</literal>;
	  она требует от системы <application>LPD</application> открывать принтер
	  в режиме чтения и записи.</para>

	<para>При использовании параллельного &postscript;-принтера (что не
	  позволяет обеспечить двустороннее взаимодействие с принтером,
	  необходимое для системы <command>lprps</command>), можно
	  использовать в качестве текстового фильтра следующий скрипт командного
	  интерпретатора:</para>

	<programlisting>#!/bin/sh
#
#  psif - Печать PostScript или обычного текста на PostScript-принтере
#  Скрипт, а НЕ версия, входящая в состав lprps
#  Установлен в /usr/local/libexec/psif
#

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

if [ "$first_two_chars" = "%!" ]; then
    #
    #  Задание PostScript, печатать его.
    #
    echo "$first_line" &amp;&amp; cat &amp;&amp; printf "\004" &amp;&amp; exit 0
    exit 2
else
    #
    #  Обычный текст, преобразовать его, а затем напечатать.
    #
    ( echo "$first_line"; cat ) | /usr/local/bin/textps &amp;&amp; printf "\004" &amp;&amp; exit 0
    exit 2
fi</programlisting>

	<para>В представленном выше скрипте, <command>textps</command> &mdash; отдельно
	  установленная программа для преобразования обычного текста в
	  &postscript;. Можно использовать любую программу преобразования текста
	  в &postscript;. Набор портов FreeBSD (см. <link linkend="ports">Набор
	  портов</link>) включает полнофункциональную программу преобразования
	  текста в &postscript; под названием <literal>a2ps</literal>, которую
	  тоже можно попробовать использовать.</para>
      </sect3>

      <sect3 id="printing-advanced-ps">
	<title>Имитация &postscript; на не-&postscript; принтерах</title>
	<indexterm>
	  <primary>PostScript</primary>
	  <secondary>эмуляция</secondary>
	</indexterm>
	<indexterm>
	  <primary>Ghostscript</primary></indexterm>
	<para>&postscript; является <emphasis>фактическим</emphasis> стандартом для
	  высококачественного набора и печати. &postscript;, однако, &mdash;
	  <emphasis>дорогой</emphasis> стандарт. К счастью, благодаря компании
	  Aladdin Enterprises есть свободный аналог &postscript; под названием
	  <application>Ghostscript</application>, который работает с FreeBSD.
	  Ghostscript может читать большинство &postscript;-файлов и выдавать
	  соответствующие страницы на множество устройств, включая многие
	  моделей не-PostScript принтеров. Установив Ghostscript и используя
	  специальный текстовый фильтр для принтера, можно заставить ваш
	  не-&postscript; принтер работать фактически как &postscript;-принтер.</para>

	<para>Ghostscript входит в набор портов FreeBSD, если вы хотите
	  устанавливать его оттуда. Вы можете также легко загрузить, собрать и
	  установить его самостоятельно.</para>

	<para>Для имитации &postscript; надо, чтобы текстовый фильтр
	  определял, печатается ли &postscript;-файл. Если нет, фильтр будет
	  передавать файл на принтер непосредственно; в противном случае, он
	  будет использовать Ghostscript, чтобы сначала преобразовать файл в
	  формат, который поймет принтер.</para>

	<para>Рассмотрим пример: следующий сценарий представляет собой
	  текстовый фильтр для принтеров Hewlett Packard DeskJet 500.
	  Для других принтеров замените аргумент <option>-sDEVICE</option>
	  в команде <command>gs</command> (Ghostscript). (Введите
	  команду <command>gs -h</command> для получения списка устройств,
	  поддерживаемых установленной версией Ghostscript.)</para>

	<programlisting>#!/bin/sh
#
#  ifhp - Печать Ghostscript-эмулированного PostScript на DeskJet 500
#  Установлен в /usr/local/libexec/ifhp

#
#  Обрабатывать LF как CR+LF (чтобы избежать "эффекта ступенек"
#  на принтерах HP/PCL:
#
printf "\033&amp;k2G" || exit 2

#
#  Прочитать первые два символа файла
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

if [ "$first_two_chars" = "%!" ]; then
    #
    #  Это PostScript; используем Ghostscript для чтения, преобразования и печати.
    #
    /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \
        -sOutputFile=- - &amp;&amp; exit 0
else
    #
    #  Обычный текст или HP/PCL, поэтому просто печатаем его напрямую; печатаем в
    #  конце символ прогона страницы, чтобы была выдана последняя страница.
    #
    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=/usr/local/libexec/ifhp:</programlisting>

	<para>Вот и все. Теперь можно выполнять <command>lpr plain.text</command>
	  и <filename>lpr whatever.ps</filename>, и обе команды должны успешно
	  печатать.</para>
      </sect3>

      <sect3 id="printing-advanced-convfilters">
	<title>Фильтры преобразования</title>

	<para>После завершения простой настройки, описанной в разделе
	  <link linkend="printing-simple">Простая настройка принтера</link>,
	  прежде всего, вам может потребоваться установить фильтры
	  преобразования для любимых форматов файлов (кроме обычных
	  текстов ASCII).</para>

	<sect4>
	  <title>Зачем устанавливать фильтры преобразования?</title>
	  <indexterm>
	    <primary>&tex;</primary>
	    <secondary>печать файлов dvi</secondary>
	  </indexterm>

	  <para>Фильтры преобразования упрощают печать различного рода файлов.
	    В качестве примера, предположим, что активно используется
	    издательская система &tex; и имеется &postscript;-принтер.
	    При каждой генерации DVI-файла из &tex;, мы не можем печатать его
	    непосредственно, пока не преобразуем в &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</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>растровое изображение</entry>
		  <entry><literal>vf</literal></entry>
		  <entry><option>-v</option></entry>
		</row>
		
		<row>
		  <entry>обычный текст</entry>
		  <entry><literal>if</literal></entry>
		  <entry>никакой, <option>-p</option> или
		    <option>-l</option></entry>
		</row>
	      </tbody>
	    </tgroup>
	  </informaltable>

	  <para>В нашем примере использование <command>lpr -d</command> означает,
	    что для принтера должна быть задана характеристика
	    <literal>df</literal> в записи в файле
	    <filename>/etc/printcap</filename>.</para>

	  <indexterm><primary>FORTRAN</primary></indexterm>
	  <para>Вопреки мнению многих, форматы вроде текста на языке FORTRAN
	    и plot, вероятно, устарели. У себя на машине вы можете дать
	    новые значения этим или любым другим опциям форматирования,
	    установив соответствующие специализированные фильтры. Например,
	    пусть необходимо напрямую печатать файлы Printerleaf (файлы
	    настольной издательской системы Interleaf), но вообще вы не собираетесь
	    печатать файлы типа plot. Можно установить фильтр преобразования
	    Printerleaf в качестве значения характеристики <literal>gf</literal>
	    и научить своих пользователей, что команда <command>lpr -g</command>
	    означает <quote>печатать файлы Printerleaf</quote>.</para>
	</sect4>

	<sect4>
	  <title>Установка фильтров преобразования</title>

	  <para>Поскольку фильтры преобразования представляют собой программы,
	    не входящие в базовую поставку FreeBSD, их, видимо, надо помещать
	    в каталоге <filename>/usr/local</filename>. Популярное
	    местонахождение &mdash; каталог <filename>/usr/local/libexec</filename>,
	    поскольку эти фильтры являются специализированными программами для
	    выполнения системой <application>LPD</application>; обычным
	    пользователям никогда не понадобится их выполнять.</para>

	  <para>Для включения фильтра преобразования, укажите его полное
	    имя в качестве значения соответствующей характеристики для принтера
	    в файле <filename>/etc/printcap</filename>.</para>

	  <para>В качестве примера, давайте добавим фильтр преобразования DVI
	    в запись для принтера <literal>bamboo</literal>. Вот опять пример
	    файла <filename>/etc/printcap</filename>, с новой характеристикой
	    <literal>df</literal> для принтера <literal>bamboo</literal>.</para>

	  <programlisting>#
#  /etc/printcap для хоста rose - добавлен фильтр df для bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

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

          <para>Фильтр DVI &mdash; скрипт командного интерпретатора по имени
            <filename>/usr/local/libexec/psdf</filename>. Вот его текст:</para>

          <programlisting>#!/bin/sh
#
#  psdf - фильтр принтера, преобразующий DVI в PostScript
#  Установлен в /usr/local/libexec/psdf
#
# Вызывается системой lpd при выполнении пользователем команды 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>Следующий пример фильтра преобразует растровый файл (точнее,
	    GIF-файл) для печати на принтере Hewlett Packard LaserJet III-Si:</para>

	  <programlisting>#!/bin/sh
#
#  hpvf - Преобразовать GIF-файлы в HP/PCL и напечатать
#  Установлен в /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-файла в переносимый формат anymap,
	    его &mdash; в переносимый формат graymap, затем &mdash; в переносимый bitmap,
	    а уже его &mdash; в данные, подходящие для LaserJet/PCL.</para>

	  <para>Вот файл <filename>/etc/printcap</filename> с записью для
	    принтера, в которой используется представленный выше фильтр:</para>

	  <programlisting>#
#  /etc/printcap для хоста orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:</programlisting>

          <para>Следующий скрипт является фильтром преобразования для печати
            данных troff, получаемых из системы набора groff, на
            &postscript;-принтере <literal>bamboo</literal>:</para>

	  <programlisting>#!/bin/sh
#
#  pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
#  Установлен в /usr/local/libexec/pstf
#
exec grops | /usr/local/libexec/lprps "$@"</programlisting>

	  <para>Представленный выше скрипт снова использует команду
	    <command>lprps</command> для взаимодействия с принтером.
	    Если принтер подключен к параллельному порту, придется
	    использовать следующий скрипт:</para>

	  <programlisting>#!/bin/sh
#
#  pstf - Преобразует выдаваемые groff данные troff в PS и печатает.
#  Установлен в /usr/local/libexec/pstf
#
exec grops</programlisting>

	  <para>Вот и все. Вот какую запись надо добавить в файл
	    <filename>/etc/printcap</filename>, чтобы включить этот фильтр:</para>
		
	  <programlisting>:tf=/usr/local/libexec/pstf:</programlisting>

	  <para>Вот пример, который пригодится старым специалистам по языку FORTRAN.
	    Это фильтр для печати текста программы на языке FORTRAN на любом принтере,
	    который может непосредственно печатать обычный текст. Мы установим его
	    для принтера <literal>teak</literal>:</para>

	  <programlisting>#!/bin/sh
#
# hprf - Фильтр текста на языке FORTRAN для LaserJet 3si:
# Установлен в /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=/usr/local/libexec/hprf:</programlisting>

	  <para>Перейдем к последнему, более сложному примеру. Мы добавим фильтр
	    DVI для уже использовавшегося принтера LaserJet по имени
	    <literal>teak</literal>. Сначала простая часть: изменить файл
	    <filename>/etc/printcap</filename>, указав местонахождение
	    фильтра DVI:</para>

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

	  <para>А теперь &mdash; часть посложнее: создать фильтр. Для этого нам
	    понадобится программа преобразования DVI в LaserJet/PCL. Набор
	    портов FreeBSD (см. <link linkend="ports">Набор портов</link>)
	    содержит одну: соответствующий пакет называется
	    <command>dvi2xx</command>. Установка этого пакета дает нам
	    необходимую программу, <command>dvilj2p</command>, которая
	    преобразует DVI в коды, подходящие для LaserJet IIp,
	    LaserJet III и LaserJet 2000.</para>

	  <para>Команда <command>dvilj2p</command> требует создания
	    достаточно сложного фильтра <command>hpdf</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>.
	    Символьные связи принадлежат пользователю и группе <username>bin</username>.
	    Фильтр же работает от имени пользователя <username>daemon</username>. А у
	    каталога <filename>/tmp</filename> установлен sticky bit. Фильтр сможет
	    создать связь, но не сможет почистить за собой и удалить ее, поскольку
	    связь будет принадлежать другому пользователю.</para>

	  <para>Вместо этого, фильтр будет создавать символическую связь в текущем
	    рабочем каталоге, которым является каталог спулинга (задаваемый
	    характеристикой <literal>sd</literal> в файле
	    <filename>/etc/printcap</filename>). Это отличное место для выполнения
	    фильтрами своих действий, особенно потому, что (иногда)
	    в каталоге спулинга места больше, чем в <filename>/tmp</filename>.</para>

	  <para>Вот, наконец, и сам фильтр:</para>

	  <programlisting>#!/bin/sh
#
#  hpdf - Печать данных DVI на принтере HP/PCL
#  Установлен в /usr/local/libexec/hpdf

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

#
#  Определяем функцию для удаления временных файлов. Они существуют
#  в текущем каталоге - в каталоге спулинга для принтера.
#
cleanup() {
   rm -f hpdf$$.dvi
}

#
#  Определяем функцию для обработки критических ошибок: напечатать заданное
#  сообщение и выйти с кодом 2. Код выхода 2 сообщает системе LPD, что не
#  надо повторно пытаться печатать задание.
#
fatal() {
    echo "$@" 1&gt;&amp;2
    cleanup
    exit 2
}

#
#  Если пользователь удаляет задание, система LPD будет посылать сигнал SIGINT,
#  поэтому перехватываем SIGINT (и пару других сигналов), чтобы убрать за собой.
#
trap cleanup 1 2 15

#
#  Гарантируем, что не конфликтуем с существующими файлами.
#
cleanup

#
#  Связываем входной файл DVI со стандартным входным потоком (файлом для печати).
#
ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"

#
#  Заменяем LF = CR+LF
#
printf "\033&amp;k2G" || fatal "Cannot initialize printer"

#
#  Преобразуем и печатаем. Значение, возвращаемое программой dvilj2p, не надежно,
#  так что мы его игнорируем.
#
dvilj2p -M1 -q -e- dfhp$$.dvi

#
#  Убираем за собой и завершаем работу
#
cleanup
exit 0</programlisting>
	</sect4>

	<sect4 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>печать</primary>
	    <secondary>фильтры</secondary>
	    <tertiary>apsfilter</tertiary>
	  </indexterm>
	  <para>В наборе портов FreeBSD есть текстовый фильтр, выполняющий
	    автоматическое преобразование; это <command>apsfilter</command>.
	    Он может выявлять обычный текст, &postscript; и файлы DVI,
	    выполнять соответствующие преобразования и печатать
	    результат.</para>
	</sect4>
      </sect3>

      <sect3 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>длина</replaceable> &mdash; из
	      характеристики <literal>pl</literal> для соответствующего
	      принтера.</para>
	  </listitem>
	</itemizedlist>

	<para>Не соблазняйтесь простотой выходного фильтра. Если вы хотите,
	  чтобы каждый файл в задании начинал печататься с новой страницы,
	  выходной фильтр <emphasis>не поможет</emphasis>. Используйте текстовый
	  фильтр (также известный как входной); см. раздел
	  <link linkend="printing-textfilter">Установка текстового фильтра</link>.
	  Более того, выходной фильтр, фактически, &mdash; <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>
	  в скрипт командного интерпретатора для обработки любых
	  кодов инициализации, которые может потребовать принтер.</para>
      </sect3>

      <sect3 id="printing-advanced-lpf">
	<title><command>lpf</command>: текстовый фильтр</title>

	<para>Программа <filename>/usr/libexec/lpr/lpf</filename>,
	  поставляемая в составе двоичного дистрибутива FreeBSD,
	  представляет собой текстовый (входной) фильтр, который может
	  печатать с отступом (если задание послано командой
	  <command>lpr -i</command>), пропускать все символы на печать
	  (если задание послано командой <command>lpr -l</command>),
	  настраивать позицию печати при получении в задании символов
	  забоя и табуляции, а также учитывать количество напечатанных страниц.
	  Она может также использоваться как выходной фильтр.</para>

	<para>Программа <command>lpf</command> подходит для многих сред печати.
	  И хотя она не позволяет посылать на принтер инициализационные
	  последовательности, легко написать скрипт командного интерпретатора,
	  который будет выполнять необходимую инициализацию, а затем вызывать
	  <command>lpf</command>.</para>

	<indexterm><primary>учет страниц</primary></indexterm>
	<indexterm>
	  <primary>учет</primary>
	  <secondary>использования принтера</secondary>
	</indexterm>
	<para>Чтобы программа <command>lpf</command> корректно выполняла учет
	  страниц, ей необходимо указать корректные значения характеристик
	  <literal>pw</literal> и <literal>pl</literal> в файле
	  <filename>/etc/printcap</filename>. Она использует эти значения для
	  определения того, сколько текста может поместиться на странице и сколько
	  страниц было в задании пользователя. Подробнее об учете использования
	  принтера см. в разделе <link linkend="printing-advanced-acct">Учет
	  использования принтера</link>.</para>
      </sect3>
    </sect2>

    <sect2 id="printing-advanced-header-pages">
      <title>Начальные страницы</title>

      <para>При наличии <emphasis>множества</emphasis> пользователей, использующих
	различные принтеры, вероятно, можно считать <emphasis>начальные
	страницы</emphasis> неизбежным злом.</para>

      <indexterm>
	<primary>баннерные страницы</primary>
    <see>начальные страницы</see>
      </indexterm>
      <indexterm><primary>начальные страницы</primary></indexterm>
      <para>Начальные страницы, которые также называют <emphasis>баннерными</emphasis>
	или <emphasis>разделительными страницами</emphasis>, идентифицируют,
	кому принадлежат задания после их печати. Обычно информация на них
	выдается большими, жирными буквами, возможно, с декоративными рамочками,
	чтобы в пачке распечаток они отличались от реальных документов,
	образующих задания пользователей. Они позволяют пользователям быстро
	находить свои задания. Очевидный недостаток выдачи начальных страниц
	состоит в том, что для каждого задания надо печатать на одну страницу
	больше, причем, страница эта хоть сколько-нибудь нужна несколько минут, а
	затем она оказывается в мусорной корзине или сдается в макулатуру.
	(Учтите, что начальная страница выдается в начале задания, а не перед каждым
	файлом, так что бумаги может теряться не так уж и много.)</para>

      <para>Система <application>LPD</application> может выдавать заголовочные
	страницы для ваших распечаток автоматически, <emphasis>если</emphasis>
	ваш принтер может непосредственно печатать обычный текст. Если используется
	&postscript;-принтер, потребуется внешняя программа для генерации начальной
	страницы; см. <link linkend="printing-advanced-header-pages-ps">Начальные
	страницы на &postscript;-принтерах</link>.</para>

	  <sect3 id="printing-advanced-header-pages-enabling">
	<title>Включение выдачи начальных страниц</title>

	<para>В разделе <link linkend="printing-simple">Простая настройка
	  принтера</link> мы отключили выдачу начальных страниц, задав характеристику
	  <literal>sh</literal> (что означает <quote>suppress header</quote>) в
	  файле <filename>/etc/printcap</filename>. Для включения
	  выдачи начальных страниц на принтер, просто удалите характеристику
	  <literal>sh</literal>.</para>

	<para>Кажется слишком просто, правда?</para>

	<para>Вы правы. <emphasis>Может</emphasis> потребоваться задать выходной
	  фильтр для посылки строк инициализации на принтер. Вот пример выходного
	  фильтра для Hewlett Packard PCL-совместимых принтеров:</para>

	<programlisting>#!/bin/sh
#
#  hpof - Выходной фильтр для Hewlett Packard PCL-совместимых принтеров
#  Установлен в /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>Вот пример файла <filename>/etc/printcap</filename> для принтера
	  <literal>teak</literal>, который мы представили ранее; мы включили
	  выдачу начальных страниц и добавили показанный выше выходной фильтр:</para>

	<programlisting>#
#  /etc/printcap для хоста orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:\
        :vf=/usr/local/libexec/hpvf:\
        :of=/usr/local/libexec/hpof:</programlisting>

	<para>Теперь, когда пользователи выдают задания на принтер
	  <literal>teak</literal>, они получают начальную страницу с каждым
	  заданием. Если пользователи хотят тратить время на поиск своих
	  распечаток, они могут подавить вывод начальных страниц,
	  посылая задание с опцией <command>lpr -h</command>;
	  другие опции &man.lpr.1; см. в разделе
	  <link linkend="printing-lpr-options-misc">Опции начальных
	  страниц</link>.</para>

	<note>
	  <para>Система <application>LPD</application> выдает символ прогона
	    страницы (form feed) после начальной страницы. Если ваш принтер
	    использует другой символ или последовательность символов
	    для выброса напечатанной страницы, укажите их в
	    качестве значения характеристики <literal>ff</literal>
	    в файле <filename>/etc/printcap</filename>.</para>
	</note>
      </sect3>

      <sect3 id="printing-advanced-header-pages-controlling">
	<title>Управление начальными страницами</title>

	<para>Включая выдачу начальных страниц, система <application>LPD</application>
	  будет выдавать длинный <emphasis>длинный заголовок</emphasis>, целую страницу
	  с большими буквами, идентифицирующими пользователя, хост и задание. Ниже
	  представлен пример (kelly напечатала задание по имени outline с хоста <hostid>rose</hostid>):</para>

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

	<para>Система <application>LPD</application> добавляет прогон страницы
	  после этого текста, чтобы задание начиналось с новой страницы
	  (если только вы не указали характеристику <literal>sf</literal> (suppress
	  form feeds) в записи соответствующего принтера в файле
	  <filename>/etc/printcap</filename>).</para>

	<para>Если вы предпочитаете, чтобы система <application>LPD</application>
	  создавала <emphasis>короткий заголовок</emphasis>, укажите
	  характеристику <literal>sb</literal> (short banner) в файле
	  <filename>/etc/printcap</filename>. Начальная страница будет
	  иметь следующий вид:</para>

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

	<para>Также по умолчанию система <application>LPD</application> печатает
	  начальную страницу перед заданием. Для изменения порядка на обратный,
	  укажите характеристику <literal>hl</literal> (header last) в файле
	  <filename>/etc/printcap</filename>.</para>
      </sect3>

      <sect3 id="printing-advanced-header-pages-accounting">
	<title>Учет начальных страниц</title>

	<para>Использование встроенных начальных страниц системы
	  <application>LPD</application> порождает определенную парадигму
	  учета использования принтера: начальные страницы пользователи
	  <emphasis>не должны оплачивать</emphasis>.</para>

	<para>Почему?</para>

	<para>Поскольку выходной фильтр &mdash; единственная внешняя программа,
	  управляющая выдачей начальных страниц, которая может выполнять учет,
	  а ей не передают информацию о <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> (short header) в файле
	      <filename>/etc/printcap</filename>. Повторимся, что это может
	      оказаться слишком сложным, и пользователи, несомненно, больше оценят
	      великодушного системного администратора, который сделает начальные
	      страницы бесплатными.</para>
	  </listitem>
	</itemizedlist>
      </sect3>

      <sect3 id="printing-advanced-header-pages-ps">
	<title>Начальные страницы на &postscript;-принтерах</title>

	<para>Как было описано выше, система <application>LPD</application> может
	  генерировать начальную страницу в виде обычного текста, что подходит для
	  многих принтеров. Конечно, &postscript;-принтеры не могут непосредственно
	  печатать обычный текст, так что, для них возможность выдачи начальных
	  страниц системы <application>LPD</application> бесполезна &mdash; или почти
	  бесполезна.</para>

	<para>Один очевидный способ получить начальные страницы &mdash; заставить
	  каждый фильтр преобразования и текстовый фильтр генерировать начальную
	  страницу. Эти фильтры должны использовать аргументы имя пользователя и хост
	  для генерации соответствующей начальной страницы. Недостаток этого
	  метода состоит в том, что пользователи будут всегда получать начальные
	  страницы, даже если будут посылать задания с помощью команды
	  <command>lpr -h</command>.</para>

	<para>Давайте рассмотрим этот метод детально. Следующий сценарий
	  принимает три аргумента (регистрационное имя пользователя,
	  имя хоста и имя задания) и создает простую
	  начальную страницу на языке &postscript;:</para>

	<programlisting>#!/bin/sh
#
#  make-ps-header - выдать начальную страницу на языке PostScript в stdout
#  Установлен в /usr/local/libexec/make-ps-header
#

#
#  Это единицы измерения PostScript (72 на дюйм). Измените значения для A4 или
#  другого используемого формата бумаги:
#
page_width=612
page_height=792
border=72

#
#  Проверяем аргументы
#
if [ $# -ne 3 ]; then
    echo "Usage: `basename $0` &lt;user&gt; &lt;host&gt; &lt;job&gt;" 1&gt;&amp;2
    exit 1
fi

#
#  Сохраняем значения в переменных, в основном, для упрощения понимания
#  последующего PostScript-кода.
#
user=$1
host=$2
job=$3
date=`date`

#
#  Посылаем PostScript-код в stdout.
#
exec cat &lt;&lt;EOF
%!PS

%
%  Гарантируем, что не будем влиять на следующее далее задание пользователя
%
save

%
%  Делаем тонкую некрасивую рамку по краям бумаги.
%
$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

%
%  Выдаем регистрационное имя пользователя, красивыми, большими и рельефными буквами
%
/Helvetica-Bold findfont 64 scalefont setfont
$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
($user) show

%
%  Теперь выдаем всякие детали
%
/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

%
% Вот и все
%
restore
showpage
EOF</programlisting>

	<para>Теперь, каждый из фильтров преобразования и текстовый фильтр
	  может вызвать этот сценарий, чтобы сначала сгенерировать
	  начальную страницу, а затем напечатать задание пользователя.
	  Вот фильтр преобразования DVI, представленный ранее в этом
	  документе, измененный для выдачи начальной страницы:</para>

	<programlisting>#!/bin/sh
#
#  psdf - фильтр преобразования DVI в PostScript
#  Установлен в /usr/local/libexec/psdf
#
#  Вызывается системой lpd при выполнении пользователем команды 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 id="printing-advanced-network-printers">
      <title>Печать по сети</title>

      <indexterm>
	<primary>принтеры</primary>
	<secondary>сетевые</secondary>
      </indexterm>
      <indexterm><primary>печать по сети</primary></indexterm>
      <para>FreeBSD поддерживает печать по сети: посылку заданий на
	удаленные принтеры. Печатью по сети обычно называют две разные
	ситуации:</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 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> имеет право
	  использовать службу <application>LPD</application> на
	  <emphasis>удаленном хосте</emphasis> (см. раздел
	  <link linkend="printing-advanced-restricting-remote">Ограничение приема
	  заданий с удаленных хостов</link>).</para>

	<indexterm>
	  <primary>принтеры</primary>
	  <secondary>сетевые</secondary>
	</indexterm>
	<indexterm><primary>печать по сети</primary></indexterm>
	<para>Если вы используете принтер с сетевым интерфейсом,
	  совместимый с системой <application>LPD</application>, упомянутым
	  в обсуждении выше <emphasis>хостом принтера</emphasis> будет сам
	  принтер, а в качестве <emphasis>имени принтера</emphasis> будет
	  выступать имя, которое вы сконфигурировали для принтера. См.
	  документацию, поставляемую с принтером и/или сетевым интерфейсом
	  принтера.</para>

	<tip>
	  <para>Если вы используете Hewlett Packard 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>Укажите имя принтера на <emphasis>хосте принтера</emphasis>
	      в качестве значения характеристики <literal>rp</literal>.</para>
	  </listitem>
	</orderedlist>

	<para>Вот и все. Не нужно перечислять фильтры преобразования, размеры
	  страницы и вообще ничего больше в файле
	  <filename>/etc/printcap</filename>.</para>

	<para>Рассмотрим пример. На хосте <hostid>rose</hostid> есть два принтера,
	  <literal>bamboo</literal> и <literal>rattan</literal>.
	  Мы позволим пользователям хоста <hostid>orchid</hostid> печатать на эти
	  принтеры. Вот файл <filename>/etc/printcap</filename> для хоста
	  <hostid>orchid</hostid> (из раздела
	  <link linkend="printing-advanced-header-pages-enabling">Включение
	  выдачи начальных страниц</link>). В нем уже есть запись для принтера
	  <literal>teak</literal>; мы добавили две записи для принтеров на
	  хосте <hostid>rose</hostid>:</para>

	<programlisting>#
#  /etc/printcap для хоста orchid - добавлены (удаленные) принтеры на rose
#

#
#  teak - локальный принтер; он подключен непосредственно к orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

#
#  rattan подключен к rose; посылать задания для rattan на хост rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

#
#  bamboo тоже подключен к rose:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:</programlisting>

	<para>Затем достаточно только создать каталоги спулинга на
	  <hostid>orchid</hostid>:</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>Теперь пользователи хоста <hostid>orchid</hostid> могут печатать на
	  принтеры <literal>rattan</literal> и <literal>bamboo</literal>. Если,
	  например, пользователь на <hostid>orchid</hostid> выполнит команду

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

	  система <application>LPD</application> на <hostid>orchid</hostid>
	  будет копировать задание в каталог спулинга
	  <filename>/var/spool/lpd/bamboo</filename> и учтет, что печатается
	  задание DVI. Как только на хосте <hostid>rose</hostid> появится место
	  в каталоге спулинга принтера <literal>bamboo</literal>, две системы
	  <application>LPD</application> передадут файл на хост <hostid>rose</hostid>.
	  Файл будет ждать в очереди на <hostid>rose</hostid> пока, наконец, не будет
	  напечатан. Он будет преобразован из формата DVI в &postscript; (поскольку
	  <literal>bamboo</literal> является &postscript;-принтером) на хосте
	  <hostid>rose</hostid>.</para>
      </sect3>

      <sect3 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> принимает все данные со стандартного
	  входного потока и посылает их на принтер, подключенный к сети.
	  Мы указываем имя хоста принтера в качестве первого аргумента, а
	  номер порта, к которому надо подключаться &mdash; в качестве второго
	  аргумента команды <command>netprint</command>. Учтите, что
	  поддерживается только одностороннее взаимодействие (с ОС FreeBSD
	  на принтер); многие сетевые принтеры поддерживают двустороннее
	  взаимодействие, и вы можете захотеть его использовать (для
	  получения состояния принтера, учета и т.п.).</para>

	<programlisting>#!/usr/bin/perl
#
#  netprint - Текстовый фильтр для принтера, подключенного к сети
#  Установлен в /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. Имя хоста для принтера &mdash;
	  scrivener. Вот текстовый фильтр для этого принтера:</para>

	<programlisting>#!/bin/sh
#
#  diablo-if-net - Текстовый фильтр для принтера Diablo `scrivener',
#  прослушивающего порт 5100. Установлен в /usr/local/libexec/diablo-if-net
#
exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100</programlisting>
      </sect3>
    </sect2>

    <sect2 id="printing-advanced-restricting">
      <title>Ограничение использования принтера</title>

      <indexterm>
	<primary>принтеры</primary>
	<secondary>ограничение доступа</secondary>
      </indexterm>
      <para>В этом разделе представлена информация об ограничении доступа к
	принтеру. Система <application>LPD</application> позволяет управлять
	тем, кто может обращаться к принтеру, как локально, так и удаленно,
	смогут ли они печатать несколько копий, насколько большими могут
	быть их задания и насколько могут разрастаться очереди печати.</para>

      <sect3 id="printing-advanced-restricting-copies">
	<title>Ограничение количества копий</title>

	<para>Система <application>LPD</application> позволяет пользователям
	  легко печатать несколько копий файла. Пользователи могут печатать
	  задания с помощью команды <command>lpr -#5</command>
	  (например) и получать пять копий каждого файла в задании. Хорошо это
	  или нет &mdash; решать вам.</para>

	<para>Если вы считаете, что многочисленные копии только изнашивают ваши
	  принтеры, можете отключить опцию <option>-#</option> команды
	  &man.lpr.1;, добавив характеристику <literal>sc</literal> в файл
	  <filename>/etc/printcap</filename>. Когда пользователи пошлют
	  задания с опцией <option>-#</option>, они увидят:</para>

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

	<para>Учтите, что если вы настроили удаленный доступ к принтеру (см.
	  раздел <link linkend="printing-advanced-network-rm">Принтеры,
	  установленные на удаленных хостах</link>), необходимо задать
	  характеристику <literal>sc</literal> также и в файлах
	  <filename>/etc/printcap</filename> удаленных хостов, иначе
	  пользователи все равно смогут посылать задания с несколькими
	  копиями с других хостов.</para>

	<para>Рассмотрим пример. Вот файл <filename>/etc/printcap</filename>
	  для хоста <hostid>rose</hostid>. Принтер <literal>rattan</literal>
	  вполне надежен, поэтому мы разрешим печатать на него несколько
	  копий, но лазерный принтер <literal>bamboo</literal> несколько
	  более изношен, поэтому мы отключим для него печать нескольких
	  копий, добавив характеристику <literal>sc</literal>:</para>

	<programlisting>#
#  /etc/printcap для хоста rose - запрещает печать нескольких копий на bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

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

	<para>Теперь нам также нужно добавить характеристику <literal>sc</literal>
	  в файле <filename>/etc/printcap</filename> на хосте <hostid>orchid</hostid>
	  (и раз уж мы его меняем, давайте отключим печать нескольких копий для
	  принтера <literal>teak</literal>):</para>

	<programlisting>#
#  /etc/printcap для хоста orchid - отключена печать нескольких копий на
#  локальном принтере teak и на удаленном принтере bamboo
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
        :if=/usr/local/libexec/ifhp:\
        :vf=/usr/local/libexec/vfhp:\
        :of=/usr/local/libexec/ofhp:

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

bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:</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 id="printing-advanced-restricting-access">
	<title>Ограничение доступа к принтерам</title>

	<para>Вы можете управлять тем, кто и на какие принтеры может печатать,
	  с помощью механизма групп &unix; и характеристики
	  <literal>rg</literal> в файле <filename>/etc/printcap</filename>.
	  Просто поместите пользователей, которым необходимо предоставить
	  доступ к принтеру, в определенную группу, a затем укажите эту
	  группу в качестве значения характеристики <literal>rg</literal>.</para>

	<para>Пользователи, не входящие в эту группу (включая <username>root</username>)
	  будут получать уведомление

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

	  при попытке печатать на контролируемый принтер.</para>

	<para>Как и в случае с характеристикой <literal>sc</literal> (подавить
	  выдачу нескольких копий), при необходимости, надо указывать
	  характеристику <literal>rg</literal> и на удаленных хостах, имеющих
	  доступ к вашим принтерам (см. раздел
	  <link linkend="printing-advanced-network-rm">Принтеры, установленные
	  на удаленных хостах</link>).</para>

	<para>Например, давайте разрешим всем обращаться к принтеру
	  <literal>rattan</literal>, но только пользователи группы
	  <literal>artists</literal> смогут использовать принтер
	  <literal>bamboo</literal>. Вот знакомый уже файл
	  <filename>/etc/printcap</filename> для хоста <hostid>rose</hostid>:</para>

	<programlisting>#
#  /etc/printcap для хоста rose - ограничение группы для bamboo
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

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

	<para>Давайте не будем менять другой рассматриваемый файл
	  <filename>/etc/printcap</filename> (для хоста
	  <hostid>orchid</hostid>). Конечно, в результате, любой пользователь
	  <hostid>orchid</hostid> может печатать на <literal>bamboo</literal>.
	  Возможно, на хосте <hostid>orchid</hostid> учетных записей и так
	  немного, и вы хотите, чтобы все они имели доступ к принтеру. Или нет.</para>

	<note>
	  <para>Для принтера может быть только одна ограниченная группа.</para>
	</note>
      </sect3>

      <sect3 id="printing-advanced-restricting-sizes">
	<title>Контроль размеров посылаемых заданий</title>

	<indexterm><primary>задания печати</primary></indexterm>
	<para>Если к принтеру обращается несколько пользователей, вам,
	  возможно, понадобиться установить ограничение на максимальный
	  размер файлов, которые пользователи могут посылать на печать.
	  В конечном итоге, размер файловой системы, в которой находятся
	  каталоги спулинга, ограничен, и надо гарантировать, что
	  в нем останется место для заданий других пользователей.</para>

	<indexterm>
	  <primary>задания печати</primary>
	  <secondary>управления</secondary>
	</indexterm>
	<para>Система <application>LPD</application> ограничить максимально
	  допустимый размер файла в задании с помощью характеристики
	  <literal>mx</literal>. Размер задается в блоках, размер которых,
	  <literal>BUFSIZ</literal>, составляет 1024 байта.
	  Если задать этой характеристике значение ноль, размер файла
	  ограничиваться не будет; однако, если характеристика
	  <literal>mx</literal> вообще не задана, то будет использоваться
	  стандартное ограничение &mdash; 1000 блоков.</para>

	<note>
	  <para>Ограничение применяется к <emphasis>файлам в задании</emphasis>,
	    а <emphasis>не</emphasis> к общему размеру задания.</para>
	</note>

	<para>Система <application>LPD</application> не откажется печатать
	  файл больше максимально допустимого для принтера размера. Вместо
	  этого, она поставит в очередь часть файла до заданного
	  предела, и она будет напечатана. Остальное не будет напечатано.
	  Правильность такого поведения не бесспорна.</para>

	<para>Давайте установим ограничения для принтеров из наших примеров,
	  <literal>rattan</literal> и <literal>bamboo</literal>. Поскольку
	  &postscript;-файлы этих художников обычно бывают весьма
	  большими, мы ограничим их размер пятью мегабайтами. Мы не
	  будем ограничивать использование обычного текстового строчного
	  принтера:</para>

	<programlisting>#
#  /etc/printcap для хоста rose
#

#
#  Без ограничения на размер задания:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
        :sh:mx#0:sd=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:

#
#  Размер файла - не более пяти мегабайт:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
        :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:</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 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; и &man.rcp.1;, так что, будьте
		внимательны.</para>

	      <para>Например, вот файл <filename>/etc/hosts.lpd</filename>
		для хоста <hostid>rose</hostid>:</para>

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

	      <para>Это означает, что хост <hostid>rose</hostid> будет
		принимать запросы с хостов <hostid>orchid</hostid>,
		<hostid>violet</hostid> и
		<hostid role="fqdn">madrigal.fishbaum.de</hostid>. Если любой
		другой хост попытается обратиться к системе
		<application>LPD</application> хоста <hostid>rose</hostid>,
		его задание будет отвергнуто.</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=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
        :lp=/dev/ttyd5:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\
        :if=/usr/local/libexec/psif:\
        :df=/usr/local/libexec/psdf:</programlisting>

	      <para>Каталог спулинга задается характеристикой
		<literal>sd</literal>. Укажем, что в файловой системе
		должно быть три мегабайта (что составляет 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> учетные записи,
		без начального каталога и с бесполезным начальным
		командным интерпретатором вроде <filename>/usr/bin/false</filename>.</para>
	    </listitem>
	  </varlistentry>
	</variablelist>
      </sect3>
    </sect2>

    <sect2 id="printing-advanced-acct">
      <title>Учет использования принтера</title>

      <indexterm>
	<primary>учет</primary>
	<secondary>использования принтера</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> &mdash; более распространенный
	    способ, возможно, потому, что он проще. Когда кто-то печатает
	    задание, фильтр регистрирует пользователя, хост и количество
	    страниц в учетном файле. Каждый месяц, семестр, год или раз в
	    любой желаемый период времени, вы собираете учетные файлы для
	    различных принтеров, суммируете напечатанные каждым пользователем
	    страницы и выставляете суммы за использование. Затем вы
	    очищаете все регистрационные файлы, начиная с чистого листа новый
	    отчетный период.</para>
	</listitem>

	<listitem>
	  <para><emphasis>Постоянный учет</emphasis> используется реже,
	    вероятно, потому, что сложнее в реализации. Этот метод требует от
	    фильтров выставлять пользователям суммы за распечатки сразу после
	    использования принтеров. Как и проверка дисковых квот, этот учет
	    выполняется немедленно. Вы можете не давать пользователям печатать,
	    если баланс на их счету стал отрицательным, а также предоставить
	    им способ проверить и изменить свои <quote>квоты печати</quote>.
	    Но этот метод требует поддержки базы данных для отслеживания
	    пользователей и квот.</para>
	</listitem>
      </itemizedlist>

      <para>Система спулинга <application>LPD</application> легко поддерживает
	оба метода: поскольку вы (в большинстве случаев) должны предоставить
	фильтры, вам придется предоставить и код для учета. Но есть и
	положительный момент: методы учета могут быть сколько угодно гибкими.
	Например, можно выбрать периодический или постоянный учет. Можно
	выбрать, какую именно информацию регистрировать: имена пользователей,
	имена хостов, типы заданий, количество напечатанных страниц,
	квадратные метры использованной бумаги, продолжительность печати
	заданий, и т.д. Это делается путем изменения фильтров так, чтобы
	они сохраняли соответствующую информацию.</para>

      <sect3>
	<title>Простая система учета использования принтера</title>

	<para>В составе FreeBSD поставляется две программы, которые можно сразу
	  использовать для организации простой системы периодического учета.
	  Речь идет о текстовом фильтре <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> могут
	  повредить записи друг друга, если записывают одновременно в один
	  и тот же файл. Простой способ выделить отдельный учетный файл для
	  каждого принтера &mdash; использовать характеристику
	  <literal>af=acct</literal> в файле <filename>/etc/printcap</filename>.
	  Тогда каждый учетный файл окажется в каталоге спулинга соответствующего
	  принтера и будет назван <filename>acct</filename>.</para>

	<para>Когда вы будете готовы выставить пользователям счет за
	  распечатки, запустите программу &man.pac.8;. Просто перейдите в
	  каталог спулинга принтера, учетную информацию которого вы хотите
	  обработать, и введите команду <literal>pac</literal>. Вы
	  получите итоговые суммы в долларах, как показано ниже:</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>Игнорировать имя хоста в учетных файлах. При указании этой
		опции, пользователь <username>smith</username> на хосте
		<hostid>alpha</hostid> считается тем же, что и пользователь
		<username>smith</username> на хосте <hostid>gamma</hostid>.
		Обычно эти пользователи считаются разными.</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term><option>-p<replaceable>стоимость</replaceable></option></term>

	    <listitem>
	      <para>Вычислять суммы из расчета <replaceable>стоимость</replaceable>
		долларов за страницу или за фут, вместо использования
		значения характеристики <literal>pc</literal> в файле
		<filename>/etc/printcap</filename>, или двух центов (как принято по
		умолчанию). Можно задавать <replaceable>стоимость</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> (по умолчанию &mdash; 200, или 2 цента
	  за страницу). Укажите в качестве значения этой характеристики, в
	  сотых долях цента, стоимость страницы или фута, исходя из которой
	  вы хотите брать деньги за распечатки. Это значение можно
	  переопределить при вызове команды &man.pac.8; с помощью опции
	  <option>-p</option>. Но при использовании опции <option>-p</option>
	  стоимость надо указывать в долларах, а не в сотых долях цента.
	  Например, команда

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

	  приводит к тому, что страница будет стоить один доллар пятьдесят
	  центов. Используя эту опцию, можно фактически начинать грести деньги
	  лопатой.</para>

	<para>Наконец, при выполнении команды <command>pac -s</command> итоговая
	  информация будет сохранена в итоговом учетном файле, имя которого
	  строится как имя учетного файла принтера с суффиксом
	  <literal>_sum</literal>. Затем учетный файл принтера очищается.
	  Когда команда &man.pac.8; выполняется повторно, она перечитывает
	  итоговый файл для получения начальных сумм, а затем добавляет
	  информацию из обычного учетного файла.</para>
      </sect3>

      <sect3>
	<title>Как можно подсчитать количество напечатанных страниц?</title>

	<para>Для выполнения хоть отдаленно точного учета надо уметь определять,
	  сколько бумаги использовано для печати задания. Это &mdash; основная
	  проблема учета использования принтеров.</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;-принтеры поддерживают такую возможность. Другие
	  модели &mdash; тоже (сетевые лазерные принтеры Imagen, например).
	  Измените фильтры для этих принтеров так, чтобы получать количество
	  использованных страниц после печати каждого задания, и пусть они
	  записывают учетную информацию <emphasis>только</emphasis> на основе
	  этого значения. Не надо ни считать строки, ни выполнять
	  чреватую ошибками обработку файла.</para>

	<para>Конечно, всегда можно поступить великодушно и не брать денег
	  за распечатки.</para>
      </sect3>
    </sect2>
  </sect1>

  <sect1 id="printing-using">
    <title>Использование принтеров</title>

    <indexterm>
      <primary>принтеры</primary>
      <secondary>использование</secondary>
   </indexterm>
    <para>В этом разделе описано, как использовать настроенные принтеры
      в ОС FreeBSD. Вот сводка команд пользовательского уровня:</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">Администрирование спулера
      <application>LPD</application></link>, используемая для управления
      принтерами и их очередями.</para>

    <para>Все три команды, &man.lpr.1;, &man.lprm.1; и &man.lpq.1;,
      поддерживают опцию <option>-P <replaceable>имя-принтера</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 id="printing-lpr">
      <title>Задания печати</title>

      <para>Для печати файлов, выполните команду:</para>

      <screen>&prompt.user; <userinput>lpr <replaceable>имя-файла</replaceable> <replaceable>...</replaceable></userinput></screen>
	
      <indexterm><primary>печать</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 <replaceable>имя-принтера</replaceable> <replaceable>имя-файла</replaceable> <replaceable>...</replaceable></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 id="printing-lpq">
      <title>Проверка заданий</title>

      <indexterm><primary>задания печати</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>active</literal> в столбце <quote>Rank</quote>),
	т.е. принтер должен сейчас печатать это задание. Второе задание
	состоит из данных, передаваемых в качестве стандартного входного
	потока команде &man.lpr.1;. Третье задание послано пользователем
	<username>mary</username>; оно намного больше по объему.
	Полное имя файла, который печатается, слишком длинное и не помещается,
	поэтому команда &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 id="printing-lprm">
      <title>Удаление заданий</title>

      <para>Если вы передумали печатать задание, можно удалить его из очереди
	заданий с помощью команды &man.lprm.1;. Часто можно использовать
	&man.lprm.1; для удаления активного задания, но часть задания или
	даже все задание все равно может быть напечатано.</para>

      <para>Для удаления задания со стандартного принтера сначала используйте
	команду &man.lpq.1; для поиска номера задания. Затем введите команду:</para>

      <screen>&prompt.user; <userinput>lprm <replaceable>номер-задания</replaceable></userinput></screen>
	
      <para>Для удаления задания с указанного принтера, задайте опцию
	<option>-P</option> 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>пользователь</replaceable></term>

      <listitem>
	<para>Удаляет все задания (для стандартного принтера), принадлежащие
	  указанному <replaceable>пользователю</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 id="printing-lpr-options">
      <title>Не только обычный текст: опции печати</title>

      <para>Команда &man.lpr.1; поддерживает несколько опций, управляющих
	форматированием текста, преобразованием графики и других форматов
	файлов, выдачей нескольких копий, обработкой задания и др. В этом
	разделе описаны эти опции.</para>

      <sect3 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>Печать графиков.</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term><option>-i<replaceable>число</replaceable></option></term>

	<listitem>
	  <para>Сдвинуть результат вправо на <replaceable>число</replaceable>
	    столбцов; если <replaceable>число</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 (device independent troff).</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>-p</term>
	
	<listitem>
	  <para>Форматировать обычный текст перед печатью утилитой &man.pr.1;.
	    Подробнее см. &man.pr.1;.</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term><option>-T <replaceable>заголовок</replaceable></option></term>
	
	<listitem>
	  <para>Использовать указанный <replaceable>заголовок</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>Печать растровых данных.</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 id="printing-lpr-options-job-handling">
    <title>Опции обработки заданий</title>

    <para>Следующие опции команды &man.lpr.1; требуют от системы
      <application>LPD</application> специальной обработки задания:</para>

    <variablelist>
      <varlistentry>
	<term>-# <replaceable>копий</replaceable></term>

	<listitem>
	  <para>Выдавать указанное количество <replaceable>копий</replaceable>
	    каждого файла в задании вместо одной. Администратор может отключить
	    эту опцию для уменьшения износа принтера и поощрения использования
	    ксерокса. См. раздел
	    <link linkend="printing-advanced-restricting-copies">Ограничение
	    количества копий</link>.</para>

	  <para>В следующем примере на стандартный принтер печатается три
	    копии файла <filename>parser.c</filename>, а затем &mdash; три копии
	    <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> будет посылать
	    почту на ваше имя после завершения обработки вашего задания. В
	    сообщении будет сказано, выполнено ли задание успешно или по ходу
	    была ошибка, и (часто) &mdash; в чем она состояла.</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 id="printing-lpr-options-misc">
	<title>Опции начальных страниц</title>

	<para>Эти опции команды &man.lpr.1; изменяют текст, который обычно
	  выдается на начальной странице задания. Если выдача начальных страниц
	  для целевого принтера отключена, эти опции не действуют. Информацию по
	  настройке начальных страниц см. в разделе
	  <link linkend="printing-advanced-header-pages">Начальные страницы</link>.</para>

	<variablelist>
	  <varlistentry>
	    <term>-C <replaceable>текст</replaceable></term>

	    <listitem>
	      <para>Заменить имя хоста на начальной странице
		<replaceable>текстом</replaceable>. Обычно на ней выдается имя хоста,
		с которого было послано задание.</para>
	    </listitem>
	  </varlistentry>

	  <varlistentry>
	    <term>-J <replaceable>текст</replaceable></term>

	    <listitem>
	      <para>Заменить имя задания на начальной странице
		<replaceable>текстом</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 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>, ни один пользователь
	(кроме <username>root</username>) не может посылать задания на
	принтер. Во <emphasis>включенную</emphasis> очередь можно посылать
	задания. Принтер для отключенной очереди может быть
	<emphasis>запущен</emphasis>; при этом он будет продолжать печатать
	находящиеся в очереди задания, пока очередь не станет пустой.</para>

      <para>В общем случае, для использования команды &man.lpc.8; необходимо
	иметь привилегии <username>root</username>. Обычные пользователи
	могут использовать команду &man.lpc.8; только для получения состояния
	принтера и перезапуска зависшего принтера.</para>

      <para>Далее представлена сводка команд &man.lpc.8;. Большинство команд
	принимает аргумент <replaceable>имя-принтера</replaceable>, задающий,
	с каким принтером работать. Можно использовать значение <literal>all</literal>
	вместо <replaceable>имени-принтера</replaceable>, означающее все
	принтеры, перечисленные в файле <filename>/etc/printcap</filename>.</para>

      <variablelist>
	<varlistentry>
	  <term><command>abort
	      <replaceable>имя-принтера</replaceable></command></term>

	  <listitem>
	    <para>Снять текущее задание и остановить принтер. Пользователи могут
	      продолжать посылать задания, если очередь включена.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>clean
	      <replaceable>имя-принтера</replaceable></command></term>

	  <listitem>
	    <para>Удалить старые файлы из каталога спулинга принтера.
	      Иногда файлы, составляющие задание, не удаляются как положено
	      системой <application>LPD</application>, особенно если
	      в ходе печати были ошибки и выполнялось много административных
	      действий. Эта команда находит файлы, не принадлежащие каталогу
	      спулинга, и удаляет их.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>disable
	      <replaceable>имя-принтера</replaceable></command></term>

	  <listitem>
	    <para>Отключить постановку новых заданий в очередь. Если принтер
	      работает, он продолжит печатать задания, остающиеся в очереди.
	      Суперпользователь (<username>root</username>) всегда может посылать
	      задания, даже в отключенную очередь.</para>

	    <para>Эта команда полезна при тестировании вновь установленного
	      принтера или фильтра: отключаем очередь и посылаем задания как
	      <username>root</username>. Другие пользователи не смогут посылать
	      задания, пока вы не закончите тестирование и не включите очередь
	      повторно командой <command>enable</command>.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>down <replaceable>имя-принтера</replaceable>
	      <replaceable>сообщение</replaceable></command></term>

	  <listitem>
	    <para>Отключить принтер. Аналогична последовательности команд
	      <command>disable</command> и <command>stop</command>.
	      Указанное <replaceable>сообщение</replaceable> выдается как
	      состояние принтера при проверке пользователем очереди принтера
	      с помощью &man.lpq.1; или запросе его состояния командой
	      <command>lpc status</command>.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>enable
	      <replaceable>имя-принтера</replaceable></command></term>

	  <listitem>
	    <para>Включить очередь для принтера. Пользователи могут посылать
	      задания, но принтер не будет их печатать, пока не будет запущен.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>help
	      <replaceable>имя-команды</replaceable></command></term>

	  <listitem>
	    <para>Выдать справочную информацию по команде
	      <replaceable>имя-команды</replaceable>. Если
	      <replaceable>имя-команды</replaceable> не указано,
	      выдает сводку по имеющимся командам.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>restart
	      <replaceable>имя-принтера</replaceable></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
	      <replaceable>имя-принтера</replaceable></command></term>

	  <listitem>
	    <para>Запустить принтер. Принтер будет печатать задания, находящиеся в
	      его очереди.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>stop
	      <replaceable>имя-принтера</replaceable></command></term>

	  <listitem>
	    <para>Остановить принтер. Принтер закончит печать текущего задания
	      и больше ничего из очереди печатать не будет. Хотя принтер и
	      остановлен, пользователи могут посылать задания во включенную
	      очередь.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>topq <replaceable>имя-принтера</replaceable>
	      <replaceable>задание-или-имя-пользователя</replaceable></command></term>

	  <listitem>
	    <para>Переупорядочить очередь для указанного принтера, помещая
	      указанные по номеру <replaceable>задания</replaceable> или
	      задания указанного по имени <replaceable>пользователя</replaceable>
	      в начало очереди. Для этой команды нельзя использовать
	      <literal>all</literal> в качестве <replaceable>имени-принтера</replaceable>.</para>
	  </listitem>
	</varlistentry>

	<varlistentry>
	  <term><command>up
	      <replaceable>имя-принтера</replaceable></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 id="printing-lpd-alternatives">
    <title>Альтернативы стандартному спулеру</title>

    <para>Если вы прочитали все это руководство, к этому моменту вы
      знаете практически все, что надо знать о системе спулинга
      <application>LPD</application>, входящей в состав ОС FreeBSD.
      Вы, возможно, уже осознали многие из ее недостатков, что, естественно,
      приводит к вопросу: <quote>Какие еще системы спулинга существуют (и
      работают с ОС FreeBSD)</quote>?</para>

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

	 <indexterm><primary>LPRng</primary></indexterm>
	 <listitem>
	  <para>Система <application>LPRng</application>, имя которой означает
	    <quote>LPR: the Next Generation</quote> (LPR: следующее поколение) &mdash;
	    это полностью переписанная система PLP. Патрик Пауэл (Patrick Powell)
	    и Джастин Мейсон (Justin Mason) (основной специалист, занимающийся
	    поддержкой PLP) объединили усилия для создания системы
	    <application>LPRng</application>. Основной сайт по системе
	    <application>LPRng</application> &mdash;
	    <ulink url="http://www.lprng.org/"></ulink>.</para>
	</listitem>
      </varlistentry>
      <varlistentry>
	<term>CUPS</term>

	<indexterm><primary>CUPS</primary></indexterm>
	<listitem>
	  <para>Система <application>CUPS</application> (сокращение от Common
	    UNIX Printing System) предоставляет переносимый механизм печати для
	    операционных систем, основанных на &unix;. Она была разработана
	    компанией Easy Software Products в качестве стандартного механизма
	    печати для всех производителей и пользователей &unix;.</para>

	  <para>Система <application>CUPS</application> использует протокол
	    Internet Printing Protocol (<acronym>IPP</acronym>) для управления
	    заданиями и очередями. Протоколы Line Printer Daemon (<acronym>LPD</acronym>),
	    Server Message Block (<acronym>SMB</acronym>) и AppSocket (известный
	    также как JetDirect) также поддерживаются, но с меньшими возможностями.
	    Система CUPS добавляет поиск сетевых принтеров и опции печати на
	    основе PostScript Printer Description (<acronym>PPD</acronym>), для
	    поддержки практической печати в &unix;.</para>

	  <para>Основной сайт по системе <application>CUPS</application> &mdash;
	    <ulink url="http://www.cups.org/"></ulink>.</para>
	</listitem>
      </varlistentry>
    </variablelist>
  </sect1>

  <sect1 id="printing-troubleshooting">
    <title>Выявление проблем</title>

    <para>После выполнения простого тестирования с помощью команды
      &man.lptest.1; вы можете получить один из следующих результатов вместо
      корректной распечатки:</para>

    <variablelist>
      <varlistentry>
	<term>Все работает, после определенной задержки; или не выдается
	  распечатанная страница.</term>

	<listitem>
	  <para>Принтер напечатал все, что нужно, но он на некоторое время
	    задумывался и ничего не делал. Фактически, могло потребоваться
	    нажать кнопку PRINT REMAINING или FORM FEED на принтере, чтобы
	    результаты были выданы.</para>

	  <para>Если это произошло, вероятно, принтер ждал, нет ли в задании
	    еще данных, прежде чем что бы то ни было печатать. Для решения
	    этой проблемы можно посылать в текстовом фильтре на принтер символ
	    FORM FEED (или любую необходимую последовательность символов).
	    Этого обычно достаточно, чтобы принтер немедленно распечатал
	    любой остающийся в его внутреннем буфере текст. Также полезно
	    убедиться, что каждое задание печати заканчивается полной страницей,
	    чтобы следующее задание не начиналось где-то с середины последней
	    страницы предыдущего задания.</para>

	  <para>Следующий измененный скрипт командного интерпретатора
	    <filename>/usr/local/libexec/if-simple</filename> выдает символ
	    прогона страницы после посылки задания на принтер:</para>

	  <programlisting>#!/bin/sh
#
# if-simple - Простой текстовый входной фильтр для lpd
# Установлен в /usr/local/libexec/if-simple
#
# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
# Выдает символ прогона страницы (\f) после печати задания.

/bin/cat &amp;&amp; printf "\f" &amp;&amp; exit 0
exit 2</programlisting>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>Принтер печатает <quote>лесенкой</quote>.</term>

	<listitem>
	  <para>Вы получаете на бумаге следующее:</para>

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

	  <indexterm><primary>MS-DOS</primary></indexterm>
	   <indexterm><primary>OS/2</primary></indexterm>
	   <indexterm><primary>ASCII</primary></indexterm>
	  <para>Вы стали очередной жертвой <emphasis>эффекта лесенки</emphasis>,
	    вызванного различными интерпретациями того, какие символы должны
	    обозначать новую строку. Операционные системы &unix;-стиля используют
	    один символ: ASCII-код 10, перевод строки (line feed &mdash; LF). &ms-dos;,
	    &os2; и другие используют пару символов, ASCII-код 10
	    <emphasis>и</emphasis> ASCII-код 13 (возврат каретки, carriage return
	    или CR). Многие принтеры используют соглашение &ms-dos; для
	    представления новых строк.</para>

	  <para>При печати из FreeBSD в тексте используется только символ перевода
	    строки. Принтер, встретив символ перевода строки, переходит на
	    следующую строку, но оставляет ту же горизонтальную позицию на
	    строке для следующего печатаемого символа. Вот зачем нужен символ
	    возврата каретки: чтобы перенести следующий печатаемый символ
	    на левый край бумаги.</para>

	  <para>Вот что ОС FreeBSD хочет от принтера:</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>Если вы загружаете другие операционные системы, кроме
		  FreeBSD, может иметь смысл <emphasis>переконфигурировать</emphasis>
		  принтер для использования такой интерпретации символов CR и LF,
		  которая принята в этих операционных системах. Затем можно
		  использовать одно из представленных далее решений.</para>
	      </note>
	    </listitem>

	    <listitem>
	      <para>Заставить драйвер последовательного порта FreeBSD автоматически
		преобразовывать LF в CR+LF. Конечно, это подойдет
		<emphasis>только</emphasis> для принтеров, подключенных к
		последовательным портам. Для включения этой возможности используйте
		характеристику <literal>ms#</literal> и установите режим
		<literal>onlcr</literal> для принтера в файле
		<filename>/etc/printcap</filename>.</para>
	    </listitem>

	    <listitem>
	      <para>Послать <emphasis>управляющий код</emphasis> на принтер,
		заставляющий его временно обрабатывать символы LF по-другому.
		Управляющие коды, которые может поддерживать ваш принтер, поищите
		в руководстве своего принтера. Когда найдете соответствующий
		управляющий код, измените текстовый фильтр для посылки сначала
		этого кода, а затем &mdash; задания печати.</para>

	      <indexterm><primary>PCL</primary></indexterm>
	      <para>Вот пример текстового фильтра для принтеров, понимающих
		управляющие последовательности языка Hewlett-Packard PCL. Этот
		фильтр заставляет принтер обрабатывать символы LF как LF и CR;
		затем он посылает задание; наконец, он посылает символ
		прогона страницы для выдачи последней страницы задания. Он должен
		работать практически со всеми принтерами Hewlett Packard.</para>

	      <programlisting>#!/bin/sh
#
# hpif - Простой текстовый входной фильтр для lpd для принтеров на базе HP-PCL
# Установлен в /usr/local/libexec/hpif
#
# Просто копирует stdin в stdout. Игнорирует все аргументы фильтра.
# Требует от принтера обрабатывать LF как CR+LF. Выдает страницу по окончании.

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> с хоста
		<hostid>orchid</hostid>. К нему через первый параллельный порт
		подключен один принтер, Hewlett Packard LaserJet 3Si, по имени
		<literal>teak</literal>. Для него в качестве текстового фильтра
		используется представленный выше скрипт:</para>

	      <programlisting>#
#  /etc/printcap для хоста orchid
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
        :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
        :if=/usr/local/libexec/hpif:</programlisting>
	    </listitem>
	  </itemizedlist>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>Строки напечатаны одна поверх другой.</term>

	<listitem>
	  <para>Принтер так и не перешел на следующую строку. Все строки текста
	    были напечатаны одна поверх другой, на одной строке.</para>

	  <para>Эта проблема <quote>обратна</quote> эффекту лесенки, описанному
	    выше, и встречается намного реже. Каким-то образом, символы LF,
	    которые ОС FreeBSD использует для завершения строк, обрабатывались
	    как символы 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,
		заставить FreeBSD использовать его, указав режим
		<literal>ixon</literal> в характеристике <literal>ms#</literal>.</para>
	    </listitem>

	    <listitem>
	      <para>Если принтер поддерживает управление несущим потоком
		(carrier flow control), укажите режим <literal>crtscts</literal>
		в характеристике <literal>ms#</literal>. Убедитесь, что кабель,
		соединяющий принтер с компьютером, правильно распаян для управления
		несущим потоком.</para>
	    </listitem>
	  </itemizedlist>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>Напечатан мусор.</term>

	<listitem>
	  <para>Принтер напечатал нечто похожее на случайный мусор, а не
	    требуемый текст.</para>

	  <para>Это, обычно, &mdash; еще один симптом неправильных параметров
	    взаимодействия с последовательным принтером. Перепроверьте
	    скорость взаимодействия в характеристике <literal>br</literal>
	    и установку четности в характеристике <literal>ms#</literal>;
	    проверьте, что принтер использует те же установки, которые
	    заданы в файле <filename>/etc/printcap</filename>.</para>
	</listitem>
      </varlistentry>

      <varlistentry>
	<term>Ничего не произошло.</term>

	<listitem>
	  <para>Если ничего не произошло, проблема, вероятно, связана с FreeBSD, а
	    не с оборудованием. Добавьте характеристику журнального файла
	    (<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=/var/spool/lpd/rattan:\
        :lp=/dev/lpt0:\
        :if=/usr/local/libexec/if-simple:\
        :lf=/var/log/rattan.log</programlisting>

	  <para>Затем попытайтесь напечатать снова. Поищите в журнальном файле
	    (в нашем примере &mdash; <filename>/var/log/rattan.log</filename>)
	    возможные сообщения об ошибках. На основе полученных сообщений
	    попытайтесь решить проблему.</para>

	  <para>Если вы не зададите характеристику <literal>lf</literal>,
	    система <application>LPD</application> использует по умолчанию
	    <filename>/dev/console</filename>.</para>
	</listitem>
      </varlistentry>
    </variablelist>
  </sect1>
</chapter>

<!--
     Local Variables:
     mode: sgml
     sgml-declaration: "../chapter.decl"
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../book.sgml" "part" "chapter")
     End:
-->
