Опубликован: 07.02.2007 | Доступ: свободный | Студентов: 3721 / 1148 | Оценка: 4.56 / 3.95 | Длительность: 23:09:00
Специальности: Художник
Дополнительный материал 2:

Приложение Б. PostScript и TeX

PostScript-рисунки

Если вы используете программу dvips, появляется возможность соединять набранный в программе TeX текст с PostScript-рисунками. (Именно таким способом было подготовлено это приложение.) Вот как это делается.

Прежде всего, надо подключить стилевой пакет graphicx с опцией dvips. Последняя буква в названии пакета именно x ; существует вариант этого пакета, называющийся graphics, но он немного отличается от описываемого нами. Для подключения пакета graphicx с опцией dvips следует написать в преамбуле

\usepackage[dvips]{graphicx}

Затем надо подготовить собственно рисунок в виде PostScript-файла. Точнее говоря, требуется специальный тип PostScript-файлов, который называется Encapsulated PostScript (традиционное расширение: .eps). Такие файлы предназначены для включения в другие файлы, и потому подчиняются дополнительным ограничениям (например, там не должно быть нескольких страниц).

Как проще всего изготовить Encapsulated PostScript-файл, зависит от типа рисунка и ваших навыков. Например, автограф Колмогорова был просканирован (в системе Linux) с помощью программы xsane, затем полученный pgm-файл (полутоновая матрица) был почищен и обрезан по краям в программе gimp, затем преобразован в черно-белый (без полутонов) программой pgmtopbm, затем преобразован в PostScript программой pnmtops, и в результате получился файл exampl2.ps 2Если честно, то после всего этого в последних строках файла exampl2.ps все буквы были заменены на f с помощью текстового редактора, чтобы убрать грязь в низу рисунка. В тексте мы написали

\begin{center}
\includegraphics{exampl2.ps}
\end{center}

Здесь \includegraphicsкоманда (определенная в пакете graphicx), а ее аргументимя файла с рисунком. Команда \includegraphics имеет множество необязательных параметров. Например, картинку с текстом "Это строка (string)!" мы включили с увеличением в два раза, сказав

\begin{center}
\includegraphics[scale=2]{exampl4.ps}
\end{center}

Можно также повернуть рисунок (скажем, на 60^\circ ), написав

\begin{center}
\includegraphics[angle=60]{exampl4.ps}
\end{center}

С точки зрения TeX'а фрагмент \includegraphics[...]{...} ведет себя как блок. Его размеры берутся из самого включаемого файла (из строки BoundingBox, где единицей измерения является 1/72 дюйма, а четыре числа означают левую, нижнюю, правую и верхнюю координаты; шириной блока считается разность между правой и левой, а высотой — между верхней и нижней координатами). В принципе можно вручную такую строку добавить (если почему-либо изготовленный вами PostScript-файл ее не содержит) или исправить (если указанные там числа вас не устраивают).

Но того же самого эффекта можно добиться и средствами \TeX'а, используя команды \vbox и \hbox. Вот, например, как была помещена рисованная буква "В" в начало одного из разделов:

\newsavebox{\bukva}
\sbox{\bukva}{\includegraphics{litera.ps}}
\begin{wrapfigure}{l}{\wd\bukva}
\vbox to 13mm{\vss\usebox{\bukva}\vspace*{-7mm}}
\end{wrapfigure}
предыдущем разделе мы уже упоминали
программу dvips...

Горизонтальные размеры буквы мы не меняли, а вертикальный размер и положение регулировали (13mm и -7mm были подобраны; команда \vss означает бесконечно сжимаемый и растяжимый клей, используемый в вертикальном режиме). Сам файл был получен сканированием иллюстрации из книги А.Г.Шицгала "Русский типографский шрифт"; эта иллюстрация, в свою очередь, представляет собой воспроизведение фрагмента из " Остромирова Евангелия" (рукописной книги XI века). Подрисуночная подпись (которую можно было бы сделать обычным способом, с помощью \caption ), естественно, в этом случае была бы неуместна.

Если у документа (или у пакета {graphicx} ) указана опция draft (иными словами, слово draft присутствует среди необязательных аргументов), то вместо PostScript-рисунков, включенных с помощью \includegraphics, будет печататься прямоугольник того же размера с названием PostScript-файла. (Это может сэкономить время и краситель в принтере.)

Сказанного достаточно, чтобы включать рисунки в статьи и книги. Но все же полезно понимать более конкретно, что происходит в этом месте в dvi-файле. Он не включает в себя описание рисунка. Зато он включает специальное указание (конструкция special), которое программа dvips интерпретирует как необходимость включить в это место текста фрагмент из PostScript-файла, указанного рядом со special. Тем самым программа dvips нуждается не только в dvi-файле, но и в PostScript-файлах рисунков. (Кстати, они нужны и LaTeX'у, хотя из них он читает лишь строку BoundingBox, чтобы определить размер блока.) Зато готовый PostScript-файл (выдаваемый программой dvips) уже самодостаточен; все необходимые рисунки включены в него и больше никаких файлов не надо.

Подчеркнем еще раз обстоятельство, которое внимательный читатель уже понял: использование PostScript-рисунков выходит за рамки официального стандарта TeX'а, поэтому могут существовать (и существуют) dvi-драйверы, которые попросту игнорируют соответствующие конструкции special. При их использовании рисунков не будет видно. К счастью, программа dvips стала одним из самых популярных dvi-драйверов, и в расчете на нее можно смело использовать пакет graphicx.

В заключение вернемся к исходному вопросу: как же включить рисунок в текст? Мы знаем, как включить PostScript-файл, но как получить этот файл? Если рисунок сканируется, то такой файл можно получить с помощью программ обработки изображений. Мы уже кратко упомянули о них, говоря об автографе Колмогорова; все упомянутые программы есть в системах типа UNIX, но и в Microsoft Windows для этого есть средства, в частности, входящие в комплект MiKTeX свободно распространяемые программы, см. приложение Ж.

Важно иметь в виду, что рисунок в формате .eps имеет некоторый размер в абсолютных единицах длины (в его заголовке указаны координаты Bounding Box, при этом единица принята равной 1/72 дюйма). С другой стороны, рисунки в растровых форматах имеют обычно размеры, измеряемые в точках. Поэтому при их преобразовании в .eps есть произвол: размер точки может быть взят любым. При печати .eps-файла (в составе текста) на принтере происходит обратное преобразование, поскольку принтер в реальности печатает черные и белые точки, и итоговое преобразование сводится к масштабированию растрового рисунка (с неизбежной при этом интерполяцией, если коэффициент масштабирования не равен 1 ). Заметим, что коэффициент масштабирования пропорционален значению параметра scale в команде \includegraphics.

Кроме того, если исходный рисунок был полутоновой (о цветных мы не говорим, там все еще сложнее), то в какой-то момент он должен быть тем или иным способом преобразован в черные и белые точки (большинство принтеров умеет печатать только их). Это может делаться и в принтере, и до него (в интерпретаторе Ghostscript); кроме того, можно не доверять этим механизмам и пытаться с самого начала преобразовать полутоновой рисунок в двуцветный, например, с помощью программы pgmtopbm. Какой из этих многочисленных вариантов даст при печати лучшие результаты, зависит от конкретной ситуации. (Еще сложнее выбрать наилучший способ, если готовится оригинал-макет для типографии.)

Все сказанное относилось к сканированным оригиналам рисунков. Но при изготовлении чертежей и технических рисунков мы не советуем чертить их на бумаге и потом сканировать. Есть гораздо более удобные средства. Одно из них (кстати, входящее в большинство TeX-комплектов) — программа metapost (или mpost, иногда mp). Ее автор — John Hobby — переделал программу METAFONT так, чтобы вместо шрифтов она порождала PostScript-файлы с рисунками. Эта программа заслуживает отдельной небольшой книжки (которой на русском языке пока нет; есть авторское английское описание, которое обычно входит в комплект TeX'а в виде файла mpman.ps). Мы лишь приведем два примера ее использования.

Подготовим файл exampl5.mp такого содержания:

beginfig(1)
path a,b,c;
a = halfcircle rotated -90 scaled 4cm;
b = fullcircle scaled 4cm  shifted (2.6cm,0);
c = buildcycle(a,b);
fill c withcolor 0.9 white;
draw a; draw b;
picture l;
l=thelabel (btex $a\cap b$ etex, (1.3cm,0));
unfill bbox l;
draw l;
endfig;
bye

Затем выполним команду

mpost exampl5.mp

Получится файл exampl5.1. Его можно включить в текст с помощью команды \includegraphics как PostScript-файл (строго говоря, он не является полноценным PostScript-файлом, но dvips умеет его включать). Соответствующий рисунок изображен справа от исходного текста metapost-программы.

А вот еще один пример использования системы metapost (заимствован из авторского руководства по этой системе):

beginfig(1);

3.2scf = 2.4in;
path fun;
# = .1;  % Keep the function single-valued
fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
  scaled scf yscaled(1/#);

vardef vertline primary x = (x,-infinity)..(x,infinity) enddef;
primarydef f atx x = (f intersectionpoint vertline x) enddef;
primarydef f whenx x = xpart(f intersectiontimes vertline x) enddef;

z1a = (2.5scf,0);
z1 = fun atx x1a;
y2a=0; z1-z2a=whatever*direction fun whenx x1 of fun;
z2 = fun atx x2a;
y3a=0; z2-z3a=whatever*direction fun whenx x2 of fun;

draw fun withpen pencircle scaled 1pt;
drawarrow (0,0)..(3.2scf,0);

label.bot(btex $x_1$ etex, z1a);
draw z1a..z1 dashed evenly;
makelabel(nullpicture, z1);
draw z1..z2a withpen pencircle scaled .3;
label.bot(btex $x_2$ etex, z2a);
draw z2a..z2 dashed evenly;
makelabel(nullpicture, z2);
draw z2..z3a withpen pencircle scaled .3;
label.bot(btex $x_3$ etex, z3a);
endfig; bye

Этот рисунок иллюстрирует метод Ньютона поиска корня уравнения f(x)=0 ; заметим, что направления касательных и точки пересечения вычисляются автоматически.


Василий Майоров
Василий Майоров
Даврон Юсупалиев
Даврон Юсупалиев
Андрей Лучицкий
Андрей Лучицкий
Россия
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002