Котельников И., Чеботаев П. LaTeX2e по-русски (1185906), страница 46
Текст из файла (страница 46)
При этом важно, что переопределение \unitlength внутри рисунка (то есть внутри тела процедуры picture) запрещено, таккак может привести к непредсказуемым последствиям. Об одном исключении из этого запретамы расскажем в конце раздела 9.5.1. Процедура picture создаёт бокс указываемого размера сначалом координат в левом нижнем углу, как показано на рис.
9.3. Полный вариант процедурыpicture имеет две пары аргументов:\begin{picture}(width,height)(x0 ,y0 )pict-cmds\end{picture}Первая пара аргументов (width,height) обязательна, тогда как вторая пара (x0 ,y0 ) можетотсутствовать. В отличие от обычных процедур, и обязательный, и необязательный аргументы записываются в круглых скобках, чтобы подчеркнуть, что они являются длинами, которыеизмеряются в единицах \unitlength. Процедура picture строит графический бокс. Ширина ивысота графического бокса определяется парой неотрицательных чисел (width,height) в первой (обязательной) паре аргументов процедуры.
Первый аргумент даёт указание LATEX’у зарезервировать свободное пространство указанного размера для размещения графического бокса.Однако LATEX не проверяет, выходят или нет графические объекты за пределы бокса. Поэтомуможно рисовать за границами бокса и даже за границами страницы.Если вторая (необязательная) пара аргументов (x0 ,y0 ) отсутствует, то начало координатпомещается в левый нижний угол графического бокса и ему присваиваются координаты (0, 0).222Глава 9. Боксы и что там внутриy(-0.5,1.75) 6s(2.0,1.5)1.51(1.5,0.75)s0.75Точка привязки-0.5s\unitlength -1.52xРис. 9.3.
Система координат в графическом боксе, введённая командой \begin{picture}(2.0,1.5). Коротким пунктиром показаны границы графического боксаВ противном случае координаты левого нижнего угла приравниваются значениям (x0 ,y0 ). Например, команда\begin{picture}(50,70)(30,-20)производит бокс шириной 50 и высотой 70 единиц \unitlength, левый нижний угол которого имеет координаты (30, −20). Тогда координаты правого верхнего угла будут равны (80, 50).На начальной стадии подготовки рисунка начало координат обычно помещают в левый нижний угол, опуская необязательную пару аргументов. Позднее, если необходимо сдвинуть весьрисунок целиком, это можно сделать, введя соответствующие значения x0 и y0 .
Графическиепрограммы редактирования рисунков для LATEX’а действуют более прямолинейно: они проводятсдвиг рисунка путём перерасчёта координат всех графических объектов.Команда \begin{picture} переводит LATEX в специальную графическую моду, в которойпомимо деклараций могут использоваться следующие команды:\put\multiput\qbezier\graphpaperДругие команды разрешены только в аргументах команд позиционирования \put и \multiput.Aтолщины линий для рисунков: тонкие, как на этом оваLTEX обеспечивает две стандартныеле , или толстые, как на этом . Переключение между толстыми и тонкими линиями осуществляют декларации\thinlines\thicklinesПо умолчанию принята \thinlines (тонкие линии).
Декларация\linethickness{len}устанавливает, что толщина горизонтальных и вертикальных линий равна величине len, выраженной в любых единицах измерения длины. Например, декларация \thinlines эквивалентна\linethickness{0.4pt}. Однако \linethickness не изменяет толщину наклонных линий, а2239.5. Процедура pictureтакже окружностей и закруглений в углах овалов. Все три перечисленные декларации являются устойчивыми, они могут появляться в любом месте входного файла.
Область их действияподчиняется обычным правилам, и они могут быть использованы в любое время.Ниже во всех примерах данной главы, иллюстрирующих действие команд рисования, предполагается, что все команды выполняются в графической моде, но команды \begin{picture}и \end{picture} могут быть опущены для упрощения записи. Мы используем различные значения \unitlength, не указывая их явно.
Результат действия иллюстрируемых команд изображается толстыми линиями при задействованной декларации \thicklines, тогда как вспомогательные элементы рисунков, такие как стрелки, направленные в точки привязки, нарисованытонкими линиями при задействованной декларации \thinlines.Если процедура picture производит большой бокс, его нужно размещать как плавающийобъект (глава 11). Все рисующие команды хрупкие, поэтому при необходимости их следует защищать командой \protect (раздел 2.7).9.5.1.Команды позиционирования\put(x,y){pict-obj}\multiput(x,y)(dx,dy){n}{pict-obj}Команда \put помещает графический объект pict-obj так, чтобы его точка привязки (reference point) находилась в точке с координатами (x,y).
Графическим объектом может быть любой текст. LATEX форматирует этот текст в строковой моде, причём точкой привязки являетсялевый нижний угол строкового бокса или другая точка, если графический объект создаёт одна из команд рисования, описанная в следующих разделах данной главы. Команда \multiputсоздаёт n копий графического объекта pict-obj, размещая их так, чтобы точка привязки j-ойкопии попадала в точку с координатами (x + [j − 1]dx, y + [j − 1]dy).
Первая копия привязывается к точке (x,y), вторая — к точке (x + dx, y + dy), последняя — к точке (x + [n − 1]dx,y + [n − 1]dy).\newcounter{N}\setcounter{N}{0}\setlength{\unitlength}{1mm}\begin{picture}(45,25)\multiput(3,3)(4,\value{N}){7}{\addtocounter{N}{1}%\circle{\value{N}}}\end{picture}b ehjmКак показывает этот пример, форматирование объектов осуществляется каждый раз заново,поэтому они могут различаться. Более того, выбрав переменное значение dy, мы расположилиэти копии на разном расстоянии друг от друга.Поместив одну команду \multiput в аргумент другой такой же команды, можно создаватьдвумерные рисунки из повторяющихся элементов. Так как каждую копию рисунка \multiputформатирует заново, «внутреннюю» команду можно запомнить в поименованном боксе, чтобыускорить работу компилятора.Ещё одно замечание относится к командной длине \unitlength.
Мы уже отмечали, чтоеё нельзя переопределять внутри процедуры picture. Однако рисунок может содержать вложенные рисунки. Выделение в рисунке рисунка поменьше вообще является ценной идеей. Вложенный рисунок создаёт дополнительная процедура picture, вставленная в аргумент команды\put:224Глава 9. Боксы и что там внутри\put(17.67,14.13){\begin{picture}(10,12) ... \end{picture}}Таким способом легко переставлять кусочки рисунка относительно друг друга. Размер такихкусочков также может быть изменён, если переопределить значение \unitlength непосредственно в аргументе команды \put:\put(1,3){\setlength{\unitlength}{1in}%\begin{picture}(1,2)...\end{picture}}9.5.2.Кривые БезьеLATEX позволяет конструировать достаточно сложные математические кривые, используя технику аппроксимации сплайнами Безье.
Эта техника была заимствована из языка описания страниц PostScript, где также используется аппроксимация сплайнами Безье как базис для рисования кривых линий. Для построения квадратичной кривой Безье требуется задать на плоскостикоординаты трёх точек: двух концевых и одной контрольной. Квадратичная кривая Безье является квадратичной параболой, проходящей через заданные концевые точки так, что прямые,соединяющие концевые точки с контрольной, касаются параболы в концевых точках. В следующем примере концевые точки обозначены буквами A и C, а контрольная точка — буквой B.\qbezier(0,0)(10,30)(50,30)B(10,30)brC(50,30)rA(0,0)Полный синтаксис команды\qbezier[num](xA ,yA )(xB ,yB )(xC ,yC )помимо координат точек A, B, C содержит ещё один необязательный аргумент num, которыйзадаёт число точек на кривой. Если опция num опущена, рисуется гладкая линия с максимальным количеством точек, которое определяется значением\qbeziermaxЭто значение можно изменить при помощи \renewcommand.
Например,\renewcommand{\qbeziermax}{250}Второй пример показывает, к чему приводит добавление опции num:\qbezier[20](0,0)(10,30)(50,30)B(10,30)brA(0,0)C(50,30)r2259.6. Графические объекты9.5.3.СеткаПакет graphpap определяет команду\graphpaper[spacing](x0 ,y0 )(x-dimen,y-dimen)(graphpap)которая рисует пронумерованную координатную сетку.
Первый аргумент (x0 ,y0 ) задаёт координаты левого нижнего угла сетки, а второй аргумент (x-dimen,y-dimen) задаёт ширину ивысоту сетки.100\graphpaper(-75,0)(200,100)50(0,0)@R0@-75-252575125Каждая координатная линия проводится через 10 единиц (выраженных в \unitlength). Необязательный первый аргумент spacing позволяет изменить это правило.\graphpaper[9](-75,0)(200,100)90450-75-301560105Все аргументы \graphpaper должны быть целыми числами.9.6.Графические объектыГрафическим объектом становится любой текст, если его поместить в последний аргумент pictobj команды \put или \multiput.
LATEX форматирует его в строковой моде, а точку привязки помещает в нижний левый угол строкового бокса. Простейшим примером служит обычныйтекст:\put(12,2){\large\bfseries указ}1указВнимательный Читатель, должно быть, заметил, что нижний угол лежит на базисной линиистроки, а буква «у» простирается ниже.9.6.1.Боксы в рисункахОт обычных строковых боксов, описанных в начале главы, графические боксы отличаются прежде всего тем, что необходимо задать как ширину, так и высоту боксов.\makebox(width,height)[hvpos]{lr-text}\framebox(width,height)[hvpos]{lr-text}\dashbox{dash}(width,height)[hvpos]{lr-text}\frame{lr-text}226Глава 9. Боксы и что там внутриПара аргументов (width,height) задаёт соответственно ширину и высоту бокса в единицахдлины \unitlength.
Точка привязки находится в левом нижнем углу бокса.\put(5,5){\framebox(25,9){устав}}6устав9?-25Опция hvpos управляет позиционированием текста lr-text внутри бокса. Она может состоятьиз одного или двух спецификаторов, определяющих горизонтальное и вертикальное позиционирование:l — горизонтальный сдвиг к левому краю бокса,r — горизонтальный сдвиг к правому краю бокса,s — растяжение текста на всю ширину бокса,t — вертикальный сдвиг к верхнему краю бокса,b — вертикальный сдвиг к нижнему краю бокса.Порядок следования спецификаторов в опции hvpos не имеет значения, то есть lt равнозначноtl.
Допустим также спецификатор c, означающий центрирование текста по вертикали и/или горизонтали, но он действует по умолчанию. Команда \framebox по краям бокса проводит сплошные линии, а команда \dashbox — пунктирные, где длина штриха должна быть задана положительным числом dash в единицах \unitlength. Для наилучшего результата размеры бокса width и height должны быть кратны параметру dash. В отличие от текстового варианта\framebox графические команды не вставляют пробелы между рамкой и текстом:\dashbox{4}(24,12)[sb]{Указ №1}}Указ№1Хотя в графической моде можно применять только команды, формирующие графическиебоксы, сами эти команды могут быть использованы в любом окружении, даже вне процедурыpicture.Команда \makebox(0,0){...}, формирующая бокс нулевого размера, часто бывает полезна для позиционирования текста в рисунках.