среда, 14 апреля 2010 г.

PSTricks. Рисуем в LaTeX.

ЛаТеХ помимо вёрстки текста ещё и умеет рисовать. Сделать набросок схемы установки, подрисовать стрелки или кружочки в презентации, поиграть с текстом или даже построить какой-либо график можно с помощью PSTricks. PSTricks позволяет делать рисунки прямо в тексте, то есть в принципе не надо вылазить в графический редактор, создавать рисунок, а потом экспортировать в удобоваримый формат. PSTricks даёт возможность достаточно быстро и без особых усилий создавать хорошие рисунки. Кроме того, существует множество пакетов, в которых уже реализованы многие примитивы, что позволяет ими оперировать на более высоком уровне. Скажем, вам не придётся рисовать пружинку вручную — это сделает один из макросов в пакете pst-coil, для того, чтобы нарисовать мензурку над горелкой химикам поможет пакет pst-labo.

При этом, следует заметить, что наличие PSTricks не означает, что в его пользу навсегда можно отказаться от такого средств создания иллюстраций, как Metapost. Недостаток PSTricks, на мой взгляд, состоит в том, что нельзя добиться полной автоматизации и построения наиболее общего рисунка. В PSTricks нет в явном виде переменных, которыми можно было бы легко оперировать, а ведь это неоспоримое преимущество Metapost, поскольку очень здорово создать рисунок, в котором всё будет зависеть от пары-тройки переменных, передвинув которые можно добиться наиболее наглядного результата. В PSTricks же всё реализовано через декартовы или полярные координаты в явном виде.

Установка

Для начала установим pstricks. В Debian все как обычно:

> aptitude install texlive-pstricks texlive-pstricks-doc

Эта команда установит pstricks целиком, со всеми входящими в него пакетами и документацией к ним. В общем случае ничего руками доставлять не надо будет. Документация будет лежать в /usr/share/doc/texlive-pstricks-doc/ в виде pdf-файлов.

Синтаксис

Итак, начнём. Концепция всех макросов примерно такова: аргументы указываются в фигурных скобках, дополнительные опции — в квадратных, а координаты — в круглых. В частности, чтобы нарисовать вектор из (1,2) в (4,3) толщиной 2pt и красного цвета, нужно написать следующее:

\psline[linecolor=red, linewidth=2pt]{->}(1,2)(4,3)

Как видно, для макроса \psline, который строит отрезки со стрелками на концах или без них, обязательным аргументом является направление вектора. Если нужен не вектор, а просто отрезок, то фигурные скобки можно опустить.

Для окружности обязательным аргументом является её радиус. Для построения окружности с радиусом 1.8 с центром в точке (4,2), закрашенной красным, пишем следующее:

\pscircle[fillcolor=red, fillstyle=solid](4,2){1.8}

Можно представить, что надо построить несколько элементов, однаково закрашенных. Но при этом не хотелось бы каждый раз писать "fillcolor=red, fillstyle=solid". Для этого существует макрос \psset, благодаря которому можно задать перманентно для всего рисунка от текущего момента до момента переопределения различные графические параметры, такие как тип заполнения, цвет линии, цвет заполнения, тип линии, толщина линии, значение единицы длины (по умолчанию 1cm).

Очевидно, что именно задаёт следующая команда

\psset{linewidth=2pt, linecolor=blue, fillstyle=solid,
   fillcolor=yellow, linestyle=dashed, unit=2cm}

Однако, если для какого-то определённого элемента предустановленный вами параметр не подходит, его легко можно изменить, более подходящим параметром в квадратных скобках. Так, несмотря на определение, окружность будет красной, а не жёлтой, но при этом линия на границе будет хоть и штриховой, но чёрной.

\psset{linewidth=2pt, linecolor=blue, fillstyle=solid,
   fillcolor=yellow, linestyle=dashed}
\psline{->}(0,0)(1,2)
\pscircle[fillcolor=red, fillstyle=solid, linecolor=black](4,2){1.8}

Примитивы

Точки

В рисунке всё начинается с точки.

Нарисовать точку можно следующей командой:

\psdot[dotstyle=triangle](1,1)
Здесь «точка» будет нарисована треугольником (незакрашенным) в координате (1,1). Чтобы треугольник был закрашенным, надо указать triangle*. Аналогично будет и для других стилей точки.

По умолчанию, если не выбран dotstyle, точка будет нарисована закрашенным кружком. Немаловажным параметром является dotsize. Что он означает объяснять не надо.

Ряд точек рисуется с помощью макроса \psdots:

\psdots(x1,y1)(x2,y2)(x3,y3)(x4,y4)

Сетка

Пока мы не пошли дальше, следует отметить, что настоятельно рекомендуется (где это возможно) рисунки оформлять в окружении pspicture. В принципе, можно и без него, но могут в этом случае возникнуть проблемы с взаимодействием рисунков, переносами и пр.

Синтаксис следующий:

\begin{pspicture}(0,0)(3,4)
  ...ваш рисунок...
\end{pspicture}

Здесь (0,0) — это координаты нижней левой точки рисунка, а (3,4) — координаты правой верхней.

В случае, если координаты границ рисунка заданы, есть возможность нарисовать координатную сетку. Для этого используется макрос \psgrid.

Следующая команда нарисует сетку, где между основными делениями будут малые деления, разделяющие большие на две части (по умолчанию на пять, что, на мой взгляд, очень мелко).

\psgrid[subgriddiv=2]

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

\begin{pspicture}(0,0)(3,4)
  \psgrid[subgriddiv=2]
  \psdot(1,1)
  \psdot[linecolor=red, dotstyle=asterisk, dotsize=20pt](1,2)
  \psdot[linecolor=blue, dotstyle=diamond*, dotsize=10pt](1,3)
  \psdot[linecolor=green, dotstyle=square, dotsize=20pt](2,2)
  \psdot[dotstyle=o, dotsize=20pt](2,1)
  \psdot[dotstyle=pentagon*, dotsize=15pt](2,3)
\end{pspicture}

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

Отрезки

Как мы уже видели, для создания отрезков или векторов используется следующая конструкция (при этом дополнительные опции, которые можно определить с помощью \psset я буду преимущественно опускать, чтобы не загромождать вид):

\psline{->}(1,2)(3,-5)

Чтобы поменять направление вектора, совсем не обязательно менять местами координаты — достаточно изменить направление с {->} на {<-}.

Кроме того, можно ввести радиус кривизны при соединении более, чем двух точек, опцией linearc. Можем соединить сразу несколько точек и увидеть как это будет выглядеть для различных радиусов кривизны:

\psline[linecolor=black](0,0)(1,1)(2,-1)(4,2)
\psline[linearc=0.3, linecolor=red](0,0)(1,1)(2,-1)(4,2)
\psline[linearc=0.5, linecolor=blue](0,0)(1,1)(2,-1)(4,2)
\psline[linearc=0.8, linecolor=green](0,0)(1,1)(2,-1)(4,2)

Окружность, эллипс, сектор, сегмент

Как было сказано, для окружности основными параметрами являются положение центра и радиус. А для эллипса положение центра и значения полуосей, также указанные в круглых скобках, как и координаты.

\psellipse[fillcolor=green, fillstyle=solid](2,3)(2,1)
\pscircle*(2,3){1}

Здесь использована конструкция \pscircle*, которая означает, что окружность следует залить тем же цветом, что и цвет линии linecolor.

Для секторов используется макрос \pswedge, для которого нужно задать положение центра окружности, радиус, начальный угол и конечный угол. Аналогичные параметры задаются и для \psarc, рисующего дуги. Сегмент можно нарисовать, с помощью \psarc*:

\pswedge[linecolor=red, linestyle=solid](2,2){2}{15}{135}
\psarc*[linecolor=blue](2,2){2}{190}{300}
\psarc[showpoints=true, arrowsize=10pt]{->}(2,2){2}{310}{360}

Прямоугольники

Для прямоугольников задаются левый нижний и правый верхний углы. Аналогично linearc для прямоугольников использутся framearc:

\psframe[linecolor=blue, framearc=0.5](0,0)(4,3)
\psframe[linecolor=black](1,1)(3,2)

Кроме того, есть возможность загнать в прямоугольник кусок текста:

\psframebox[linecolor=red]{Кусок текста}, \psovalbox{овальный кусок}

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

Кривые

Кривые можно рисовать с помощью \psbezier и \pscurve.

\psbezier рисует кривые безье. Начальное направление кривой идёт по касательной к отрезку, соединяющему первую пару точек, а конечное, соответственно, по касательной к отрезку, соединяющему вторую пару. Дополнительный параметр showpoints позволяет понять принцип:

\psgrid
\psbezier[showpoints=true](0.5,1)(1,3)(2,0.5)(3,4)

\pscurve просто рисует кривую через заданные точки. А \psccurve рисует замкнутую кривую. Параметр curvature, принимающий три значения, определяет насколько «кривой» будет линия. Следует немного поиграть с параметрами, чтобы понять принцип:

\psgrid
\pscurve[curvature=1 0.1 0, showpoint=true](0.5,0.5)(2,0.5)(1,2)(2.5,2.8)
\pscurve[curvature=0.5 0.1 0, linecolor=red](0.5,0.5)(2,0.5)(1,2)(2.5,2.8)
\pscurve[curvature=0.2 0.1 0, linecolor=blue, arrowsize=10pt]{->}(0.5,0.5)(2,0.5)(1,2)(2.5,2.8)
\psccurve[linecolor=purple](0.5,0.5)(2,0.5)(1,2)(2.5,2.8)

Резюме

На этом я закончу первую статью по PSTricks. В принципе, уже описанных примитивов достаточно для создания простеньких и не очень рисунков.

Благодаря простоте синтаксиса и встроенности в LaTeX PSTricks оказывается весьма удобным инструментом для создания самых разнообразных иллюстраций и схем.

В дальнейшем мы посмотрим на операции с цветами, простейшую автоматизацию, рассмотрим некоторые дополнительные пакеты для PSTricks.

И, напоследок, что следует почитать:

Копируете статью - поставьте ссылку на оригинал!

Комментариев нет:

Отправить комментарий