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) В тексте мы написали
\begin{center} \includegraphics{exampl2.ps} \end{center}Здесь \includegraphics — команда (определенная в пакете graphicx), а ее аргумент — имя файла с рисунком. Команда \includegraphics имеет множество необязательных параметров. Например, картинку с текстом "Это строка (string)!" мы включили с увеличением в два раза, сказав
\begin{center} \includegraphics[scale=2]{exampl4.ps} \end{center}Можно также повернуть рисунок (скажем, на
), написав \begin{center} \includegraphics[angle=60]{exampl4.ps} \end{center}С точки зрения TeX'а фрагмент \includegraphics[...]{...} ведет себя как блок. Его размеры берутся из самого включаемого файла (из строки BoundingBox, где единицей измерения является
дюйма, а четыре числа означают левую, нижнюю, правую и верхнюю координаты; шириной блока считается разность между правой и левой, а высотой — между верхней и нижней координатами).В принципе можно вручную такую строку добавить (если почему-либо изготовленный вами 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, при этом единица принята равной дюйма). С другой стороны, рисунки в растровых форматах имеют обычно размеры, измеряемые в точках. Поэтому при их преобразовании в .eps есть произвол: размер точки может быть взят любым. При печати .eps-файла (в составе текста) на принтере происходит обратное преобразование, поскольку принтер в реальности печатает черные и белые точки, и итоговое преобразование сводится к масштабированию растрового рисунка (с неизбежной при этом интерполяцией, если коэффициент масштабирования не равен ). Заметим, что коэффициент масштабирования пропорционален значению параметра 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 Этот рисунок иллюстрирует метод Ньютона поиска корня уравнения ; заметим, что направления касательных и точки пересечения вычисляются автоматически.