Работа в системе LaTeX

Псевдорисунки

Разбить на страницы
Показывать лекцию целиком

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

Средства LaTeX , описываемые в этой лекции, при профессиональной подготовке оригинал-макетов применяются редко: гораздо удобнее пользоваться PostScript-графикой. См. приложение Б.

Создание псевдорисунка и размещение на нем объектов

Псевдорисунки создаются с помощью окружения {picture}. Изучение этого окружения удобно начать с примера.

$$\begin{picture}(110,50) \put(55,15){Стрелка} \put(55,15){\vector(-2,1){40}} \put(0,0){\line(1,0){20}} \put(0,0){\line(0,1){20}} \end{picture}$$
\begin{picture}(110,50)
\put(55,15){Стрелка}
\put(55,15){\vector(-2,1){40}}
\put(0,0){\line(1,0){20}}
\put(0,0){\line(0,1){20}}
\end{picture}

Разберем исходный текст, создавший этот рисунок: стрелку с надписью и уголок. На каждый псевдорисунок LaTeX должен отвести в тексте определенное место (после чего сам рисунок вполне может и выйти за пределы отведенного места: все зависит от того, что и где вы будете " рисовать"). Эти размеры задаются в круглых скобках через запятую немедленно после \begin{picture}, сначала ширина, затем высота (команды, связанные с псевдорисунками, - единственные в LaTeX'е, у которых в определенных случаях обязательный аргумент ставится не в фигурных скобках). Между скобками, запятой и числами, задающими размеры псевдорисунка, не должно быть пробелов (помните, что конец строки также воспринимается TeX'ом как пробел; если переноса на другую строку не избежать, воспользуйтесь знаком % для устранения получающегося пробела). По умолчанию ширина и высота псевдорисунка, и вообще все относящиеся к псевдорисункам размеры, задаются в пунктах (так и сделано в нашем примере). Можно указать любую единицу измерения размеров, относящихся к псевдорисункам: для этого надо изменить значение параметра \unitlength и далее по поводу параметров, являющихся длинами): если мы хотим, чтобы длины измерялись в миллиметрах, надо написать в преамбуле

\unitlength=1mm

(но не просто mm!). Размеры могут быть не только целыми, но и дробными числами, в которых нужно использовать десятичную точку (но не запятую).

Итак, место на псевдорисунок выделено. Чтобы поместить что-то на этот псевдорисунок, используется команда \put (внутри окружения {picture} писать текст "просто так" не следует). После \put в круглых скобках через запятую следуют координаты того объекта, который мы размещаем на псевдорисунке (сначала абсцисса, затем ордината; началом координат по умолчанию считается левый нижний угол псевдорисунка), а затем, без пробела, в фигурных скобках, — тот объект, который надо нанести. Для первой из наших команд \put этот объект был просто текстом, и соответственно в фигурных скобках только этот текст и был; для остальных трех команд, размещавших на рисунке стрелку и два отрезка, в фигурных скобках помещается нечто более сложное: описание этой стрелки и отрезков. В следующем разделе мы разберем, как такие описания устроены. Кстати, уголок в приведенном выше примере — не что иное, как левый нижний угол псевдорисунка (точка с координатами (0,0)}).

Когда мы говорили о координатах объекта, имелись в виду координаты так называемой "точки отсчета" на этом объекте. Если объект — текст, то точка отсчета — его левый нижний угол. Иногда при размещении текста удобней задать координаты его правого, а не левого нижнего угла. Чтобы так сделать, можно воспользоваться командой \llap с одним аргументом — текстом, чья точка отсчета будет в правом нижнем углу. В следующем примере точка отсчета "полужирной" кошки будет в левом нижнем углу, а "рубленой" — в правом нижнем.

$$\begin{picture}(110,40) \put(82,20){\textbf{Кошка}} \put(80,20){\llap{\textsf{Кошка}}} \end{picture}$$
\begin{verbatim}
\begin{picture}(110,40)
\put(82,20){\textbf{Кошка}}
\put(80,20){\llap{\textsf{Кошка}}}
\end{picture}

Точка отсчета стрелки — ее начало. Когда пойдет речь о других объектах, размещаемых на псевдорисунке, мы будем указывать, где расположены их точки отсчета.

Еще несколько общих правил, относящихся к окружению {picture}. Во-первых, внутри этого окружения не должно быть пустых строк. Во-вторых, необходимо сказать о том, как окружение {picture} взаимодействует с окружающим текстом. Весь псевдорисунок, порождаемый этим окружением, рассматривается TeX'ом как одна большая буква, ширина и высота которой заданы в скобках через запятую после \begin{picture}, так что если окружение {picture} встретилось в середине абзаца, эта "буква" будет помещена в строку, причем соседние строки раздвинутся, чтобы она поместилась. Если это не то, чего вы хотите, — начинайте окружение {picture} между абзацами (после пустой строки или команды \par). Можно также поместить окружение {picture} внутри окружения наподобие {flushright} или {center} — при этом LaTeX автоматически установит разумные интервалы между псевдорисунком и окружающим текстом. Совершенно безбоязненно можно помещать окружение {picture} внутри "плавающего" окружения {figure} или {table}.

Если вы оформляете псевдорисунок как рисунок в оборку с помощью окружения {wrapfigure} (при подключенном пакете {wrapfig} ) то ширину рисунка, которую, как вы помните, необходимо задать во втором обязательном аргументе окружения {wrapfigure}, можно задать как кратное параметра \unitlength. Например, если псевдорисунок начинается с

\begin{picture}(50,43)

то окружение {wrapfigure} надо начать как-нибудь так:

\begin{wrapfigure}{o}{50\unitlength}

Кроме текста, на псевдорисунках можно размещать отрезки, стрелки, окружности, круги и овалы (прямоугольники с закругленными углами). Далее мы опишем, как задавать эти объекты.

Отрезки и стрелки

Отрезки задаются с помощью команды \line. LaTeX'у надо сообщить наклон и размер отрезка. Вот пример команды \put, выводящей отрезок:

$$\begin{picture}(100,50) \put(60,50){\line(1,-2){20}} \end{picture}$$
\begin{picture}(100,50)
\put(60,50){\line(1,-2){20}}
\end{picture}

Как мы уже понимаем, здесь на рисунок размера $$100\times50$$ пунктов наносится отрезок с началом в точке $$(60,50)$$. Наклон отрезка задается парой целых чисел, расположенных в круглых скобках через запятую непосредственно после \line. Отношение этих чисел должно быть равно "угловому коэффициенту" отрезка (тангенсу угла наклона к горизонтали); в нашем случае эти числа суть "(1,-2)", это означает, что отрезок отклоняется "на одну единицу вправо и на две единицы вниз". Если эти числа (1,0), то отрезок горизонтален, если (0,1), то отрезок вертикален.

Размер отрезка задается в фигурных скобках после круглых скобок, в которых задан наклон. Этот размер, вообще говоря, — не его длина, но длина его проекции на горизонтальную ось (кроме случаев, когда отрезок вертикален — тогда задается его длина по вертикали).

Длину отрезка можно (если она не слишком мала) задавать произвольно, а вот наклон — нет. Каждое из целых чисел, задающих наклон, не должно превосходить $$6$$ по абсолютной величине, и, кроме того, эти два числа не должны иметь общих делителей, кроме $$1$$ (это последнее условие репертуар возможных наклонов не ограничивает).

Стрелки задаются с помощью команды \vector, которая нам уже встречалась в примере. Синтаксис этой команды совершенно такой же, как у команды \line: в круглых скобках пишется пара чисел, задающая наклон стрелки, а затем в фигурных скобках параметр, задающий ее размер (длина проекции на горизонтальную ось, если стрелка не вертикальна, и длина проекции на вертикальную ось, если стрелка вертикальна). Отличие от команды \line в том, что репертуар возможных наклонов стрелок еще более ограничен, чем у отрезков: целые числа, задающие наклон, не должны превосходить $$4$$ по абсолютной величине (и по-прежнему не должны иметь общих делителей). Точкой отсчета стрелки является ее начало.

Окружности, круги и овалы

Окружность задается командой \circle, а круг (сплошной черный кружок) — ее вариантом "со звездочкой" \circle*. У этих команд единственный аргумент — диаметр круга или окружности. Как обычно, он задается в единицах, равных значению параметра \unitlength (по умолчанию - в пунктах). Точкой отсчета окружности или круга является центр. Вот пример картинки с окружностями и кругами:

$$\begin{picture}(100,80) \put(30,30){\circle{30}} \put(70,30){\circle{30}} \put(30,50){\circle{30}} \put(70,50){\circle{30}} \put(50,40){\circle*{20}} \end{picture}$$
\begin{picture}(100,80)
\put(30,30){\circle{30}}
\put(70,30){\circle{30}}
\put(30,50){\circle{30}}
\put(70,50){\circle{30}}
\put(50,40){\circle*{20}}
\end{picture}

Количество реально возможных диаметров кругов ограничено. Если окружности или круга с диаметром, указанным в качестве аргумента команды \circle или \circle, в LaTeX'овских шрифтах нет, то будет напечатана окружность (круг), диаметр которой наиболее близок к указанному.

Наряду с окружностями и кругами, на псевдорисунок можно нанести также " овал" - прямоугольник с закругленными углами. Он задается командой \oval, аргументы которой - ширина и высота овала. Эти аргументы задаются в круглых скобках через запятую. Точка отсчета овала - его центр. Пример:

$$\begin{picture}(100,80) \put(50,40){\oval(100,80)} \end{picture}$$
\begin{picture}(100,80)
\put(50,40){\oval(100,80)}
\end{picture}

Кроме того, возможны и "неполные" овалы, представляющие собой половины или четверти от полных. Чтобы задать такой неполный овал, надо задать команде \oval с необязательным аргументом} необязательный аргумент (в квадратных скобках, после обязательного). Для задания половины овала этот аргумент должен быть одной из следующих букв:

t верхняя половина;
b нижняя половина;
r правая половина;
l левая половина.

Для задания четверти овала необязательный аргумент команды \oval должен быть сочетанием двух из этих букв (например, tr} для верхней правой четверти). Точка отсчета усеченного овала расположена там же, где точка отсчета соответствующего ему полного овала. Вот пример картинки с усеченными овалами:

$$\begin{picture}(100,80) \put(50,40){\oval(80,60)[t]} \put(50,40){\oval(80,60)[br]} \end{picture}$$
\begin{picture}(100,80)
\put(50,40){\oval(80,60)[t]}
\put(50,40){\oval(80,60)[br]}
\end{picture}

Кривые

При пользовании окружением {picture} вы имеете возможность нанести на псевдорисунок кривую более или менее произвольной формы (эти кривые — так называемые квадратичные сплайны Безье). Это делается с помощью команды \qbezier. Вот пример ее работы:

$$\begin{picture}(80,80) \qbezier(22,2)(120,20)(20,77) \put(22,2){\circle*{5}} \put(120,20){\circle*{5}} \put(20,77){\circle*{5}} \end{picture}$$
\begin{picture}(80,80)
\qbezier(22,2)(120,20)(20,77)
\put(22,2){\circle*{5}}
\put(120,20){\circle*{5}}
\put(20,77){\circle*{5}}
\end{picture}

После \qbezier надо указать (без пробелов) координаты трех точек: начальной, "опорной" и конечной. Из начальной точки кривая выходит, устремляется к опорной, но, как правило, до нее не доходит, поскольку сворачивает к конечной точке, в которой и заканчивает свой путь. В нашем примере мы для ориентировки нанесли на псевдорисунок черные кружки в этих трех точках.

Никакой мистики в том, что TeX рисует кривые, нет: эти кривые просто составляются из сотен черных квадратиков. Можно попросить LaTeX не так густо ставить квадратики, из которых состоит кривая. Для этих целей у команды \qbezier предусмотрен необязательный аргумент — количество этих квадратиков. Он ставится перед всеми обязательными в квадратных скобках:

$$\begin{picture}(80,80) \qbezier(22,2)(120,20)(20,77) \qbezier[60](58,2)(-40,20)(60,77) \end{picture}$$
\begin{picture}(80,80)
\qbezier(22,2)(120,20)(20,77)
\qbezier[60](58,2)(-40,20)(60,77)
\end{picture}

Кстати, обратите внимание, что опорная точка второй из наших кривых находится где-то за пределами текста. Это не страшно, поскольку ее координаты используются LaTeX'ом только для расчетов.

Какой бы необязательный аргумент команды \qbezier мы ни задавали, количество квадратиков, из которых составляется кривая, не превысит числа $$500$$. Если вы решили увеличить этот максимум, допустим, до тысячи, надо написать так:

\renewcommand{\qbeziermax}{1000}

Если так вы напишете в преамбуле, то предел $$1000$$ будет относиться ко всем кривым в вашем тексте, а если внутри группы (например, внутри окружения), то изменение этого параметра забудется по выходе из группы. В лекции 7 будет объяснено, что означает \renewcommand в общем случае.

Дополнительные возможности

Иногда бывает нужно нанести на псевдорисунок несколько регулярно расположенных объектов. В этом случае, вместо того чтобы много раз писать \put, удобно воспользоваться командой \multiput. Она располагает на псевдорисунке несколько одинаковых объектов на равных расстояниях. Синтаксис этой команды таков:

$$\setminus multiput(x,y)(\Delta x \Delta y){\ n}{\ объект}$$

Здесь $$x$$ и $$y$$ - координаты первого из размещаемых объектов (как и в обычной команде \put ), $$\Delta x$$ и $$\Delta y$$ — расстояния, на которые каждый следующий объект будет сдвинут относительно предыдущего по горизонтали и вертикали, $$n$$ — количество объектов, которые надо разместить, и, наконец, объект — это, как и у команды \put, описание того, что мы размещаем на рисунке. Пример:

$$\begin{picture}(100,80) \multiput(10,70)(8,-6){8}% {\circle*{3}} \end{picture}$$
\begin{picture}(100,80)
\multiput(10,70)(8,-6){8}%
{\circle*{3}}
\end{picture}

Обратите внимание на использование знака процента для удаления нежелательного пробела, создаваемого концом строки. Вот еще один пример; здесь с помощью команды \multiput рисуется решеточка:

$$\begin{picture}(100,50) \multiput(0,0)(10,0){10}% {\line(1,5){10}} \multiput(0,0)(2,10){6}% {\line(1,0){90}} \end{picture}$$
\begin{picture}(100,50)
\multiput(0,0)(10,0){10}%
{\line(1,5){10}}
\multiput(0,0)(2,10){6}%
{\line(1,0){90}}
\end{picture}

Использование команды \multiput так, как это было сделано в предыдущем примере, ведет к неоправданным затратам машинного времени. Например, каждый из наклонных отрезков собирается из маленьких символов, причем TeX'у приходится повторять эту скучную операцию 10 раз. Разумнее было бы собрать этот отрезок лишь единожды, а дальше его просто копировать. Это можно сделать с помощью "блоковых переменных". Мы расскажем об этом в лекции 8 .

Иногда, когда псевдорисунок достаточно сложен, удобно применить следующий прием: задать в качестве аргумента одной из команд \put целое окружение {picture} (точкой отсчета будет служить левый нижний угол). При этом вы сможете отсчитывать координаты объектов на " подрисунке" относительно самого подрисунка, а не внешнего рисунка, что часто бывает проще; кроме того, если понадобится сдвинуть этот "подрисунок" как единое целое, то для этого будет достаточно изменить аргументы в одной-единственной команде \put. Вот пример рисунка с подрисунком (будем считать, что это классная доска, на которой нарисованы оси координат):

$$\begin{picture}(120,80) % Края доски: \put(0,0){\line(1,0){120}} \put(0,80){\line(1,0){120}} \put(0,0){\line(0,1){80}} \put(120,0){\line(0,1){80}} % Оси координат: \put(40,25){\begin{picture}(40,40)% \put(20,0){\vector(0,1){40}} \put(0,20){\vector(1,0){40}} \put(40,22){x} \put(22,40){y} \end{picture}} \end{picture}$$

Этому рисунку соответствовал такой исходный текст:

\begin{picture}(120,80)
% Края доски:
\put(0,0){\line(1,0){120}} \put(0,80){\line(1,0){120}}
\put(0,0){\line(0,1){80}} \put(120,0){\line(0,1){80}}
% Оси координат:
\put(40,25){\begin{picture}(40,40)%
              \put(20,0){\vector(0,1){40}}
              \put(0,20){\vector(1,0){40}}
              \put(40,22){x} \put(22,40){y}
            \end{picture}}
\end{picture}

Кстати говоря, размеры внутренней картинки можно было бы задать совершенно произвольно, например, (200,200)} или даже (0,0)} — команда \put бездумно размещает объекты таким образом, чтобы их точки отсчета имели указанные координаты, и при этом не интересуется, сколько места они реально занимают и не наложатся ли на текст или другие объекты.

Нередко требуется сдвигать не какую-то часть псевдорисунка, а весь псевдорисунок как целое (например, если вы ищете оптимальное расположение иллюстрации по отношению к тексту). Для этого удобно использовать еще одну возможность окружения {picture}: можно задать его таким образом, чтобы начало координат было не в левом нижнем углу, а в любой другой точке. Для этого после \begin{picture} надо задать не одну, а две пары чисел в круглых скобках. В этом случае первая пара чисел будет, как и прежде, обозначать ширину и высоту места, выделяемого LaTeX'ом на псевдорисунок, а вторая пара будет указывать, каковы координаты левого нижнего угла этого псевдорисунка (по умолчанию, т. е. если второй пары чисел в круглых скобках нет, они были бы просто (0,0)}). Главное только — не напутать со знаками: если вы сказали

\begin{picture}(a,b)(x,y)

то это значит, что левый нижний угол псевдорисунка имеет координаты $$(x,y)$$, стало быть, по сравнению со случаем, когда $$x=y=0$$, весь псевдорисунок сдвинется на $$-x$$ по горизонтали и на $$-y$$ по вертикали! Если вы ничего не поняли, посмотрите на следующий пример, в котором второй псевдорисунок сдвигается на $$20$$ единиц вправо и на $$10$$ единиц вверх по отношению к первому:

$$\begin{picture}(150,80) \put(0,0){\line(1,0){140}} \put(0,70){\line(1,0){140}} \put(0,0){\line(0,1){70}} \put(140,0){\line(0,1){70}} \put(25,30){\Huge Сдвиг} \end{picture}\\[25pt] \begin{picture}(150,80)(-20,-10) \put(0,0){\line(1,0){140}} \put(0,70){\line(1,0){140}} \put(0,0){\line(0,1){70}} \put(140,0){\line(0,1){70}} \put(25,30){\Huge Сдвиг} \end{picture}$$
\begin{picture}(150,80)
\put(0,0){\line(1,0){140}}
\put(0,70){\line(1,0){140}}
\put(0,0){\line(0,1){70}}
\put(140,0){\line(0,1){70}}
\put(25,30){\Huge Сдвиг}
\end{picture}\\[25pt]
\begin{picture}(150,80)(-20,-10)
\put(0,0){\line(1,0){140}}
\put(0,70){\line(1,0){140}}
\put(0,0){\line(0,1){70}}
\put(140,0){\line(0,1){70}}
\put(25,30){\Huge Сдвиг}
\end{picture}

Параметры оформления псевдорисунка

Про один из таких параметров мы уже говорили - это единица измерения длин на псевдорисунке, обозначаемая \unitlength.

В какой-то мере можно регулировать и толщину линий на наших псевдорисунках. Для этого предусмотрены команды \thinlines (тонкие линии) и \thicklines (толстые линии). По умолчанию стоит режим, в котором линии будут тонкими. Команды \thicklines и \thinlines можно давать не только в преамбуле, но и в самом тексте (в том числе и внутри окружения picture}, так что можно регулировать, какие линии будут толстыми, а какие тонкими). Если одна из этих команд дана внутри группы, то по окончании группы ее действие прекращается (не забывайте, что любое окружение само по себе образует группу).

Кроме того, можно задать произвольным образом толщину вертикальных и горизонтальных (но не наклонных!) линий. Для этих целей служит команда \linethickness. У этой команды один обязательный аргумент — толщина линий, выраженная в TeX'овских единицах длины. Если мы скажем

\linethickness{2.5mm}

то все вертикальные и горизонтальные отрезки на псевдорисунке будут иметь толщину 2.5мм, и такой же будет сторона квадратиков, из которых составляются кривые.

Страницы:

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

Средства LaTeX , описываемые в этой лекции, при профессиональной подготовке оригинал-макетов применяются редко: гораздо удобнее пользоваться PostScript-графикой. См. приложение Б.

Создание псевдорисунка и размещение на нем объектов

Псевдорисунки создаются с помощью окружения {picture}. Изучение этого окружения удобно начать с примера.

$$\begin{picture}(110,50) \put(55,15){Стрелка} \put(55,15){\vector(-2,1){40}} \put(0,0){\line(1,0){20}} \put(0,0){\line(0,1){20}} \end{picture}$$
\begin{picture}(110,50)
\put(55,15){Стрелка}
\put(55,15){\vector(-2,1){40}}
\put(0,0){\line(1,0){20}}
\put(0,0){\line(0,1){20}}
\end{picture}

Разберем исходный текст, создавший этот рисунок: стрелку с надписью и уголок. На каждый псевдорисунок LaTeX должен отвести в тексте определенное место (после чего сам рисунок вполне может и выйти за пределы отведенного места: все зависит от того, что и где вы будете " рисовать"). Эти размеры задаются в круглых скобках через запятую немедленно после \begin{picture}, сначала ширина, затем высота (команды, связанные с псевдорисунками, - единственные в LaTeX'е, у которых в определенных случаях обязательный аргумент ставится не в фигурных скобках). Между скобками, запятой и числами, задающими размеры псевдорисунка, не должно быть пробелов (помните, что конец строки также воспринимается TeX'ом как пробел; если переноса на другую строку не избежать, воспользуйтесь знаком % для устранения получающегося пробела). По умолчанию ширина и высота псевдорисунка, и вообще все относящиеся к псевдорисункам размеры, задаются в пунктах (так и сделано в нашем примере). Можно указать любую единицу измерения размеров, относящихся к псевдорисункам: для этого надо изменить значение параметра \unitlength и далее по поводу параметров, являющихся длинами): если мы хотим, чтобы длины измерялись в миллиметрах, надо написать в преамбуле

\unitlength=1mm

(но не просто mm!). Размеры могут быть не только целыми, но и дробными числами, в которых нужно использовать десятичную точку (но не запятую).

Итак, место на псевдорисунок выделено. Чтобы поместить что-то на этот псевдорисунок, используется команда \put (внутри окружения {picture} писать текст "просто так" не следует). После \put в круглых скобках через запятую следуют координаты того объекта, который мы размещаем на псевдорисунке (сначала абсцисса, затем ордината; началом координат по умолчанию считается левый нижний угол псевдорисунка), а затем, без пробела, в фигурных скобках, — тот объект, который надо нанести. Для первой из наших команд \put этот объект был просто текстом, и соответственно в фигурных скобках только этот текст и был; для остальных трех команд, размещавших на рисунке стрелку и два отрезка, в фигурных скобках помещается нечто более сложное: описание этой стрелки и отрезков. В следующем разделе мы разберем, как такие описания устроены. Кстати, уголок в приведенном выше примере — не что иное, как левый нижний угол псевдорисунка (точка с координатами (0,0)}).

Когда мы говорили о координатах объекта, имелись в виду координаты так называемой "точки отсчета" на этом объекте. Если объект — текст, то точка отсчета — его левый нижний угол. Иногда при размещении текста удобней задать координаты его правого, а не левого нижнего угла. Чтобы так сделать, можно воспользоваться командой \llap с одним аргументом — текстом, чья точка отсчета будет в правом нижнем углу. В следующем примере точка отсчета "полужирной" кошки будет в левом нижнем углу, а "рубленой" — в правом нижнем.

$$\begin{picture}(110,40) \put(82,20){\textbf{Кошка}} \put(80,20){\llap{\textsf{Кошка}}} \end{picture}$$
\begin{verbatim}
\begin{picture}(110,40)
\put(82,20){\textbf{Кошка}}
\put(80,20){\llap{\textsf{Кошка}}}
\end{picture}

Точка отсчета стрелки — ее начало. Когда пойдет речь о других объектах, размещаемых на псевдорисунке, мы будем указывать, где расположены их точки отсчета.

Еще несколько общих правил, относящихся к окружению {picture}. Во-первых, внутри этого окружения не должно быть пустых строк. Во-вторых, необходимо сказать о том, как окружение {picture} взаимодействует с окружающим текстом. Весь псевдорисунок, порождаемый этим окружением, рассматривается TeX'ом как одна большая буква, ширина и высота которой заданы в скобках через запятую после \begin{picture}, так что если окружение {picture} встретилось в середине абзаца, эта "буква" будет помещена в строку, причем соседние строки раздвинутся, чтобы она поместилась. Если это не то, чего вы хотите, — начинайте окружение {picture} между абзацами (после пустой строки или команды \par). Можно также поместить окружение {picture} внутри окружения наподобие {flushright} или {center} — при этом LaTeX автоматически установит разумные интервалы между псевдорисунком и окружающим текстом. Совершенно безбоязненно можно помещать окружение {picture} внутри "плавающего" окружения {figure} или {table}.

Если вы оформляете псевдорисунок как рисунок в оборку с помощью окружения {wrapfigure} (при подключенном пакете {wrapfig} ) то ширину рисунка, которую, как вы помните, необходимо задать во втором обязательном аргументе окружения {wrapfigure}, можно задать как кратное параметра \unitlength. Например, если псевдорисунок начинается с

\begin{picture}(50,43)

то окружение {wrapfigure} надо начать как-нибудь так:

\begin{wrapfigure}{o}{50\unitlength}

Кроме текста, на псевдорисунках можно размещать отрезки, стрелки, окружности, круги и овалы (прямоугольники с закругленными углами). Далее мы опишем, как задавать эти объекты.

Отрезки и стрелки

Отрезки задаются с помощью команды \line. LaTeX'у надо сообщить наклон и размер отрезка. Вот пример команды \put, выводящей отрезок:

$$\begin{picture}(100,50) \put(60,50){\line(1,-2){20}} \end{picture}$$
\begin{picture}(100,50)
\put(60,50){\line(1,-2){20}}
\end{picture}

Как мы уже понимаем, здесь на рисунок размера $$100\times50$$ пунктов наносится отрезок с началом в точке $$(60,50)$$. Наклон отрезка задается парой целых чисел, расположенных в круглых скобках через запятую непосредственно после \line. Отношение этих чисел должно быть равно "угловому коэффициенту" отрезка (тангенсу угла наклона к горизонтали); в нашем случае эти числа суть "(1,-2)", это означает, что отрезок отклоняется "на одну единицу вправо и на две единицы вниз". Если эти числа (1,0), то отрезок горизонтален, если (0,1), то отрезок вертикален.

Размер отрезка задается в фигурных скобках после круглых скобок, в которых задан наклон. Этот размер, вообще говоря, — не его длина, но длина его проекции на горизонтальную ось (кроме случаев, когда отрезок вертикален — тогда задается его длина по вертикали).

Длину отрезка можно (если она не слишком мала) задавать произвольно, а вот наклон — нет. Каждое из целых чисел, задающих наклон, не должно превосходить $$6$$ по абсолютной величине, и, кроме того, эти два числа не должны иметь общих делителей, кроме $$1$$ (это последнее условие репертуар возможных наклонов не ограничивает).

Стрелки задаются с помощью команды \vector, которая нам уже встречалась в примере. Синтаксис этой команды совершенно такой же, как у команды \line: в круглых скобках пишется пара чисел, задающая наклон стрелки, а затем в фигурных скобках параметр, задающий ее размер (длина проекции на горизонтальную ось, если стрелка не вертикальна, и длина проекции на вертикальную ось, если стрелка вертикальна). Отличие от команды \line в том, что репертуар возможных наклонов стрелок еще более ограничен, чем у отрезков: целые числа, задающие наклон, не должны превосходить $$4$$ по абсолютной величине (и по-прежнему не должны иметь общих делителей). Точкой отсчета стрелки является ее начало.

Окружности, круги и овалы

Окружность задается командой \circle, а круг (сплошной черный кружок) — ее вариантом "со звездочкой" \circle*. У этих команд единственный аргумент — диаметр круга или окружности. Как обычно, он задается в единицах, равных значению параметра \unitlength (по умолчанию - в пунктах). Точкой отсчета окружности или круга является центр. Вот пример картинки с окружностями и кругами:

$$\begin{picture}(100,80) \put(30,30){\circle{30}} \put(70,30){\circle{30}} \put(30,50){\circle{30}} \put(70,50){\circle{30}} \put(50,40){\circle*{20}} \end{picture}$$
\begin{picture}(100,80)
\put(30,30){\circle{30}}
\put(70,30){\circle{30}}
\put(30,50){\circle{30}}
\put(70,50){\circle{30}}
\put(50,40){\circle*{20}}
\end{picture}

Количество реально возможных диаметров кругов ограничено. Если окружности или круга с диаметром, указанным в качестве аргумента команды \circle или \circle, в LaTeX'овских шрифтах нет, то будет напечатана окружность (круг), диаметр которой наиболее близок к указанному.

Наряду с окружностями и кругами, на псевдорисунок можно нанести также " овал" - прямоугольник с закругленными углами. Он задается командой \oval, аргументы которой - ширина и высота овала. Эти аргументы задаются в круглых скобках через запятую. Точка отсчета овала - его центр. Пример:

$$\begin{picture}(100,80) \put(50,40){\oval(100,80)} \end{picture}$$
\begin{picture}(100,80)
\put(50,40){\oval(100,80)}
\end{picture}

Кроме того, возможны и "неполные" овалы, представляющие собой половины или четверти от полных. Чтобы задать такой неполный овал, надо задать команде \oval с необязательным аргументом} необязательный аргумент (в квадратных скобках, после обязательного). Для задания половины овала этот аргумент должен быть одной из следующих букв:

t верхняя половина;
b нижняя половина;
r правая половина;
l левая половина.

Для задания четверти овала необязательный аргумент команды \oval должен быть сочетанием двух из этих букв (например, tr} для верхней правой четверти). Точка отсчета усеченного овала расположена там же, где точка отсчета соответствующего ему полного овала. Вот пример картинки с усеченными овалами:

$$\begin{picture}(100,80) \put(50,40){\oval(80,60)[t]} \put(50,40){\oval(80,60)[br]} \end{picture}$$
\begin{picture}(100,80)
\put(50,40){\oval(80,60)[t]}
\put(50,40){\oval(80,60)[br]}
\end{picture}

Кривые

При пользовании окружением {picture} вы имеете возможность нанести на псевдорисунок кривую более или менее произвольной формы (эти кривые — так называемые квадратичные сплайны Безье). Это делается с помощью команды \qbezier. Вот пример ее работы:

$$\begin{picture}(80,80) \qbezier(22,2)(120,20)(20,77) \put(22,2){\circle*{5}} \put(120,20){\circle*{5}} \put(20,77){\circle*{5}} \end{picture}$$
\begin{picture}(80,80)
\qbezier(22,2)(120,20)(20,77)
\put(22,2){\circle*{5}}
\put(120,20){\circle*{5}}
\put(20,77){\circle*{5}}
\end{picture}

После \qbezier надо указать (без пробелов) координаты трех точек: начальной, "опорной" и конечной. Из начальной точки кривая выходит, устремляется к опорной, но, как правило, до нее не доходит, поскольку сворачивает к конечной точке, в которой и заканчивает свой путь. В нашем примере мы для ориентировки нанесли на псевдорисунок черные кружки в этих трех точках.

Никакой мистики в том, что TeX рисует кривые, нет: эти кривые просто составляются из сотен черных квадратиков. Можно попросить LaTeX не так густо ставить квадратики, из которых состоит кривая. Для этих целей у команды \qbezier предусмотрен необязательный аргумент — количество этих квадратиков. Он ставится перед всеми обязательными в квадратных скобках:

$$\begin{picture}(80,80) \qbezier(22,2)(120,20)(20,77) \qbezier[60](58,2)(-40,20)(60,77) \end{picture}$$
\begin{picture}(80,80)
\qbezier(22,2)(120,20)(20,77)
\qbezier[60](58,2)(-40,20)(60,77)
\end{picture}

Кстати, обратите внимание, что опорная точка второй из наших кривых находится где-то за пределами текста. Это не страшно, поскольку ее координаты используются LaTeX'ом только для расчетов.

Какой бы необязательный аргумент команды \qbezier мы ни задавали, количество квадратиков, из которых составляется кривая, не превысит числа $$500$$. Если вы решили увеличить этот максимум, допустим, до тысячи, надо написать так:

\renewcommand{\qbeziermax}{1000}

Если так вы напишете в преамбуле, то предел $$1000$$ будет относиться ко всем кривым в вашем тексте, а если внутри группы (например, внутри окружения), то изменение этого параметра забудется по выходе из группы. В лекции 7 будет объяснено, что означает \renewcommand в общем случае.

Дополнительные возможности

Иногда бывает нужно нанести на псевдорисунок несколько регулярно расположенных объектов. В этом случае, вместо того чтобы много раз писать \put, удобно воспользоваться командой \multiput. Она располагает на псевдорисунке несколько одинаковых объектов на равных расстояниях. Синтаксис этой команды таков:

$$\setminus multiput(x,y)(\Delta x \Delta y){\ n}{\ объект}$$

Здесь $$x$$ и $$y$$ - координаты первого из размещаемых объектов (как и в обычной команде \put ), $$\Delta x$$ и $$\Delta y$$ — расстояния, на которые каждый следующий объект будет сдвинут относительно предыдущего по горизонтали и вертикали, $$n$$ — количество объектов, которые надо разместить, и, наконец, объект — это, как и у команды \put, описание того, что мы размещаем на рисунке. Пример:

$$\begin{picture}(100,80) \multiput(10,70)(8,-6){8}% {\circle*{3}} \end{picture}$$
\begin{picture}(100,80)
\multiput(10,70)(8,-6){8}%
{\circle*{3}}
\end{picture}

Обратите внимание на использование знака процента для удаления нежелательного пробела, создаваемого концом строки. Вот еще один пример; здесь с помощью команды \multiput рисуется решеточка:

$$\begin{picture}(100,50) \multiput(0,0)(10,0){10}% {\line(1,5){10}} \multiput(0,0)(2,10){6}% {\line(1,0){90}} \end{picture}$$
\begin{picture}(100,50)
\multiput(0,0)(10,0){10}%
{\line(1,5){10}}
\multiput(0,0)(2,10){6}%
{\line(1,0){90}}
\end{picture}

Использование команды \multiput так, как это было сделано в предыдущем примере, ведет к неоправданным затратам машинного времени. Например, каждый из наклонных отрезков собирается из маленьких символов, причем TeX'у приходится повторять эту скучную операцию 10 раз. Разумнее было бы собрать этот отрезок лишь единожды, а дальше его просто копировать. Это можно сделать с помощью "блоковых переменных". Мы расскажем об этом в лекции 8 .

Иногда, когда псевдорисунок достаточно сложен, удобно применить следующий прием: задать в качестве аргумента одной из команд \put целое окружение {picture} (точкой отсчета будет служить левый нижний угол). При этом вы сможете отсчитывать координаты объектов на " подрисунке" относительно самого подрисунка, а не внешнего рисунка, что часто бывает проще; кроме того, если понадобится сдвинуть этот "подрисунок" как единое целое, то для этого будет достаточно изменить аргументы в одной-единственной команде \put. Вот пример рисунка с подрисунком (будем считать, что это классная доска, на которой нарисованы оси координат):

$$\begin{picture}(120,80) % Края доски: \put(0,0){\line(1,0){120}} \put(0,80){\line(1,0){120}} \put(0,0){\line(0,1){80}} \put(120,0){\line(0,1){80}} % Оси координат: \put(40,25){\begin{picture}(40,40)% \put(20,0){\vector(0,1){40}} \put(0,20){\vector(1,0){40}} \put(40,22){x} \put(22,40){y} \end{picture}} \end{picture}$$

Этому рисунку соответствовал такой исходный текст:

\begin{picture}(120,80)
% Края доски:
\put(0,0){\line(1,0){120}} \put(0,80){\line(1,0){120}}
\put(0,0){\line(0,1){80}} \put(120,0){\line(0,1){80}}
% Оси координат:
\put(40,25){\begin{picture}(40,40)%
              \put(20,0){\vector(0,1){40}}
              \put(0,20){\vector(1,0){40}}
              \put(40,22){x} \put(22,40){y}
            \end{picture}}
\end{picture}

Кстати говоря, размеры внутренней картинки можно было бы задать совершенно произвольно, например, (200,200)} или даже (0,0)} — команда \put бездумно размещает объекты таким образом, чтобы их точки отсчета имели указанные координаты, и при этом не интересуется, сколько места они реально занимают и не наложатся ли на текст или другие объекты.

Нередко требуется сдвигать не какую-то часть псевдорисунка, а весь псевдорисунок как целое (например, если вы ищете оптимальное расположение иллюстрации по отношению к тексту). Для этого удобно использовать еще одну возможность окружения {picture}: можно задать его таким образом, чтобы начало координат было не в левом нижнем углу, а в любой другой точке. Для этого после \begin{picture} надо задать не одну, а две пары чисел в круглых скобках. В этом случае первая пара чисел будет, как и прежде, обозначать ширину и высоту места, выделяемого LaTeX'ом на псевдорисунок, а вторая пара будет указывать, каковы координаты левого нижнего угла этого псевдорисунка (по умолчанию, т. е. если второй пары чисел в круглых скобках нет, они были бы просто (0,0)}). Главное только — не напутать со знаками: если вы сказали

\begin{picture}(a,b)(x,y)

то это значит, что левый нижний угол псевдорисунка имеет координаты $$(x,y)$$, стало быть, по сравнению со случаем, когда $$x=y=0$$, весь псевдорисунок сдвинется на $$-x$$ по горизонтали и на $$-y$$ по вертикали! Если вы ничего не поняли, посмотрите на следующий пример, в котором второй псевдорисунок сдвигается на $$20$$ единиц вправо и на $$10$$ единиц вверх по отношению к первому:

$$\begin{picture}(150,80) \put(0,0){\line(1,0){140}} \put(0,70){\line(1,0){140}} \put(0,0){\line(0,1){70}} \put(140,0){\line(0,1){70}} \put(25,30){\Huge Сдвиг} \end{picture}\\[25pt] \begin{picture}(150,80)(-20,-10) \put(0,0){\line(1,0){140}} \put(0,70){\line(1,0){140}} \put(0,0){\line(0,1){70}} \put(140,0){\line(0,1){70}} \put(25,30){\Huge Сдвиг} \end{picture}$$
\begin{picture}(150,80)
\put(0,0){\line(1,0){140}}
\put(0,70){\line(1,0){140}}
\put(0,0){\line(0,1){70}}
\put(140,0){\line(0,1){70}}
\put(25,30){\Huge Сдвиг}
\end{picture}\\[25pt]
\begin{picture}(150,80)(-20,-10)
\put(0,0){\line(1,0){140}}
\put(0,70){\line(1,0){140}}
\put(0,0){\line(0,1){70}}
\put(140,0){\line(0,1){70}}
\put(25,30){\Huge Сдвиг}
\end{picture}

Параметры оформления псевдорисунка

Про один из таких параметров мы уже говорили - это единица измерения длин на псевдорисунке, обозначаемая \unitlength.

В какой-то мере можно регулировать и толщину линий на наших псевдорисунках. Для этого предусмотрены команды \thinlines (тонкие линии) и \thicklines (толстые линии). По умолчанию стоит режим, в котором линии будут тонкими. Команды \thicklines и \thinlines можно давать не только в преамбуле, но и в самом тексте (в том числе и внутри окружения picture}, так что можно регулировать, какие линии будут толстыми, а какие тонкими). Если одна из этих команд дана внутри группы, то по окончании группы ее действие прекращается (не забывайте, что любое окружение само по себе образует группу).

Кроме того, можно задать произвольным образом толщину вертикальных и горизонтальных (но не наклонных!) линий. Для этих целей служит команда \linethickness. У этой команды один обязательный аргумент — толщина линий, выраженная в TeX'овских единицах длины. Если мы скажем

\linethickness{2.5mm}

то все вертикальные и горизонтальные отрезки на псевдорисунке будут иметь толщину 2.5мм, и такой же будет сторона квадратиков, из которых составляются кривые.

Вернуться к учебному плану