Журнал LinuxFormat - перейти на главную

LXF86:LaTeX

Материал из Linuxformat
Перейти к: навигация, поиск
Компьютерные TeXнологии Учимся использовать культовую систему вёрстки


Содержание

Графика

ЧАСТЬ 3: Порой иллюстрация стоит тысячи слов – и сегодня Евгений Балдин расскажет, как добавить их в создаваемые вами документы LaTeX!
Q: Как быстро написать на LaTeX-е курсовую, в которой кроме текста есть и графики?
A: Сделать для начала графики.
Вопрос и краткий ответ


Вероятно, на текущий момент TeX лучше других программ вёрстки умеет разбивать абзацы на строки, то есть удачнее всех разливать порции «клея» между «боксами». Но подготовка графики выносится за рамки этого процесса. Почти…

С точки зрения TeX, картинка – это просто очень большой прямоугольник, который надо как-то разместить на странице. От пользователя нужны только размеры этого прямоугольника. Отображение же иллюстрации лежит на плечах драйверов. Самым востребованным форматом для представления графики в LaTeX до сих пор является Encapsulated PostScript.

Encapsulated PostScript

Уже больше двадцати лет прошло с тех пор, как никому не известная фирма Adobe Systems Inc. получила от компании Apple инвестиции на «обучение» лазерных принтеров молодому языку PostScript. Как следствие, этот платформеннонезависимый язык с полностью открытой спецификацией стал безальтернативным стандартом. Даже сейчас PostScript фактически не имеет конкурентов в области допечатной подготовки. Поэтому почти все «уважающие себя» графические программы умеют экспортировать результаты своей деятельности в виде инструкций PostScript. Это особенно касается векторных графических редакторов, так как PostScript подразумевает векторную графику.

Encapsulated PostScript (EPS) – графический формат [скорее даже язык программирования, – прим. ред.]. Файлы в этом формате обычно имеют расширение .eps. По сути дела, это PostScript с некоторыми упрощениями и дополнительными договорённостями. Самая интересная с точки зрения LaTeX договорённость – это обязательное наличие в заголовке информации о размере картинки, которая передаётся вместе с комментарием:

 %!PS-Adobe-2.0 EPSF-2.0
 %%Creator: dvips(k) 5.95b Copyright 2005 Radical Eye Software
 %%Title: picture.dvi
 %%BoundingBox: 127 464 430 667
 %%DocumentFonts: SFRM1200 SFRM0800
 %%EndComments

Первая строка комментария обычно содержит версию PostScript (Некоторые программы (не будем тыкать пальцем в драйвер для РostScript-принтеров одной очень распространённой операционной системы) добавляют перед комментарием бинарный мусор. Для полноценной работы с такими файлами этот мусор следует удалить.). Вслед за комментарием BoundingBox идёт информация о размерах. Первые два числа соответствуют координатам левого нижнего угла картинки, а последние соответствуют координатам правого верхнего угла. Единицей измерения является «большой пункт» (bp=1/72 in), который примерно равен 0,351 мм. Для вёрстки текста указанной информации достаточно.

Чтобы из уже имеющегося одностраничного PostScript-файла сделать EPS, необходимо и, как правило, достаточно добавить BoundingBox. Для вычисления искомых размеров можно воспользоваться утилитой ps2eps из одноимённого пакета. Если же в стандартной поставке эта программа отсутствует, то можно напрямую воспользоваться программой Ghostscript – свободным программным интерпретатором PostScript:

 > gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox «имя файла»

Размеры выясняются с помощью указания специального драйвера bbox. Ключи -q, -dNOPAUSE и -dBATCH используются для подавления вывода ненужной информации и вопросов со стороны программы. Ключ -dSAFER гарантирует, что Ghostscript не будет производить никаких деструктивных действий (Отключается возможность выполнения таких команд, как удаление и переименование, а чтение файлов происходит в режиме read-only. Очень полезный ключ, если Ghostscript используется в качестве фильтра.).

Ещё одной особенностью формата EPS является возможность добавлять растровое изображение для предварительного просмотра. Это было сделано для ситуаций, когда программа не понимает PostScript, а что-то на месте «дырки» для картинки отобразить надо. Такое добавление идёт вразрез с принципиальной кроссплатформенностью PostScript и его следует, по возможности, избегать. Для операций с этим расширением, в том числе и для добавления/удаления растра, можно воспользоваться утилитой epstool из одноимённого пакета.

В конце рассказа про EPS хотелось бы упомянуть о замечательной утилите pstoedit из, естественно, одноимённого же пакета. Не все, но некоторые из болееменее внятно созданных PostScript-файлов она ухитряется перевести в редактируемый векторный графический формат. Это упрощает правку файлов, которые не имеют исходных текстов.

Как сделать EPS из растра

Одним из важных вопросов является конвертация растровых форматов в EPS. Растр гораздо проще создавать, а кое-где, например, при снятии скриншотов, применим фактически только растр. Стандартные же средства преобразования, например, утилита convert из пакета ImageMagick, не всегда дают оптимальные результаты.

Возможным и вполне разумным решением является замена традиционной линейки: LaTeX dvips [ps2pdf] на pdfLaTeX, сразу «из коробки» поддерживающий растровые форматы PNG и JPEG, которые можно внедрять в формат PDFнапрямую. Массового перехода на данную технологию пока не наблюдается, но заметное движение в эту сторону есть. У неё есть неоспоримые достоинства, но она не лишена недостатков. Рассказ о pdfLaTeX выходит за рамки этой статьи.

Вопрос о конвертации из JPEG можно решить с помощью простой утилиты jpeg2ps, которую можно найти в любом CTAN-архиве (The Comprehensive TeX Archive Network. Центральный сайт: http://www.ctan.org.) в директории nonfree/support/jpeg2ps. Утилита не преобразовывает JPEG-файл, а просто добавляет правильный EPS-заголовок. Декомпрессия JPEG производится непосредственно интерпретатором PostScript (Это стало возможным, начиная с версии PostScript Level 2.). К недостаткам утилиты можно отнести то, что в силу своей лицензии она не может распространяться со свободными дистрибутивами, а к достоинствам – отсутствие зависимостей.

Более комплексными решениями являются утилиты sam2p из одноимённого пакета и bmeps. Их также можно найти на CTAN в директориях graphics/sam2p и support/bmeps, соответственно. sam2p является своеобразным комбайном, который поддерживает множество растровых графических форматов, в то время как bmeps фокусируется на PNG и JPEG. Обе эти программы позволяют получить вполне приличную EPS-картинку для печати или просмотра на экране. В обоих случаях будет необходимо разобраться в ключах и настройках. С моей точки зрения, bmeps является более удобным решением, производящим достаточно маленькие (Это важно, так как мало какой растровый редактор может оптимально сохранить EPS.) по размеру EPS-файлы, но и sam2p достаточно хорош.

Опять же на CTAN в директории graphics/a2ping можно взять довольно увесистый perl-скрипт a2ping.pl. Он является своеобразной надстройкой над sam2p и Ghostscript, что позволяет ему более-менее автоматически конвертировать из растра в PostScript и обратно.

Обзор внешних программ закончен. Внимание! Далее слово «пакет» будет относиться к пакетам LaTeX, а не пакетам дистрибутива GNU/Linux.

graphicx

Ответственным за создание «бокса» для размещения картинки является пакет graphicx (graphicx пришёл на смену пакету graphics — различия в последней букве. Команды из предыдущего пакет также можно использовать, но делать это настоятельно не рекомендуется.), а точнее, команда \includegraphics.

Пример использования \includegraphics.

В команде есть один обязательный параметр – вставляемая картинка. Необязательные параметры передаются с помощью пар «ключ=значение», разделяемых запятой. За подобный способ объявления параметров отвечает пакет keyval. Некоторые из поддерживаемых пакетом параметров перечислены ниже:

  • bb – позволяет исправить BoundingBox прямо в коде, не меняя EPS-файл. Значение представляет из себя четыре

числа, кодирующие положение левого нижнего и правого верхнего углов, например: [bb=127 464 430 667]. Вместо одного bb можно воспользоваться четвёркой ключей: [bbllx=127,bblly=464,bbrx=430,bbry=667], каждому из которых присваивается только одно значение.

Помимо перечисленных ключей, для модификации BoundingBox можно использовать viewport – четыре числа, описывающих границы BoundingBox, где в качестве центра координат выбирается левый нижний угол уже сущест вующего описания и trim – четыре числа, представляющих собой отступы от левой, нижней, правой и верхней границ.

  • clip – обрезает вставленную картинку по BoundingBox. Это необходимо делать в случае изменения границ для «выкусывания» части картинки, иначе она будет «вылезать» за пределы выделенного ей бокса. По умолчанию имеет значение false. Отсутствие значение у ключа clip при его упоминании эквивалентно значению true. Подобное поведение верно и для других логических переключателей.
  • angle – поворачивает картинку на заданный угол в градусах.
  • origin – определяет координаты центра, вокруг которого вращается рисунок. Кроме непосредственно координат, origin принимает и буквенные сокращения: l, b, r и t – соответствует центру вращения слева, снизу, справа и сверху. В каждом случае выбирается середина указанной стороны. Возможны комбинации, задающие углы картинки: lt, rt, rb и lb. c обозначает центр картинки.
  • width – ширина вставляемой картинки.
  • height – высота вставляемой картинки.
  • scale – масштабный коэффициент.
  • keepaspectratio – логический переключатель. Модифицирует параметры высоты и ширины картинки в сторону уменьшения с целью сохранения исходных пропорций изображения.

Ещё один пример использования \includegraphics

Аргументы \includegraphics интерпретируются слева направо. Для команд вращения и масштабирования порядок следования имеет значение.

По вашим правилам

Пакет graphicx предоставляет возможность вызвать внешнюю программу для обработки картинки перед её вставкой. Так, например, можно добавить возможность включения в документ PNG-файлов:

 \DeclareGraphicsRule{.png}{eps}{.bb}{`bmeps -p3 -c #1`}

Первый параметр определяет расширение нового графического формата, для которого задаются правила. В представленном примере это .png. Второй параметр указывает тип графики. После преобразования это будет EPS – по умолчанию, dvips ничего другого и не знает. Третий параметр определяет расширение файла, из которого будут считаны параметры BoundingBox. Файл должен содержать одну строчку вида:

 %%BoundingBox: 0 0 848 979

Такой файл необходимо предварительно создать для каждой PNG-картинки. Это можно сделать, например, так:

bmeps -b «картинка».png «картинка».bb

Последний параметр определяет команду, которую следует выполнить для преобразования картинки. Команда должна выдавать результат в стандартный поток вывода. #1 соответствует имени обрабатываемого файла. Непосредственное выполнение команды происходит при трансляции dvi-файла.

Выполнение внешней команды является потенциально опасной процедурой, поэтому защита по умолчанию этого не позволяет. Для просмотра dvi-файла через xdvi следует использовать ключ -allowshell. В противном случае будет выдаваться запрос на выполнение команды каждый раз, когда встречается вставка по новым правилам. Для преобразования в PostScript через dvips также следует отключить защиту с помощью ключика -R0. Лучше всё-таки, по возможности, избегать вышеописанной процедуры и сразу готовить картинки в формате EPS.

Для трактования всех неизвестных драйверу расширений как EPS следует применить команду:

 \DeclareGraphicsRule{*}{eps}{*}{}

Это полезно в случае вставки картинок MetaPost, которые по умолчанию не имеют расширений. Если третий параметр равен «звёздочке», то это означает, что BoundingBox следует искать в том же файле, что и графику.

Плавающие объекты

Мало просто добавить картинку – её надо красиво разместить, и, по возможности, она должна это делать самостоятельно. Просто \includegraphics для этого дела не очень подходит, так как размещение регулируется исключительно пользователем. Для этой цели в LaTeX имеется специальная сущность: плавающий объект (float) (Пакет, который позволяет создавать новые типы плавающих объектов, так и называется: float. Вместо него можно использовать floatraw, созданный Ольгой Лапко.). Если для данного объекта не хватает места на текущей странице, он переносится на следующую.

Стандартные классы определяют плавающий объект для размещения картинок как окружение figure:

 \begin{figure}[ht]
   \centering%центрируем картинку
   \includegraphics{«картинка»}
   \caption{«подпись»}\label{fig:metka}
 \end{figure}

В качестве необязательного параметра окружению figure можно передать допустимые способы размещения плавающего объекта:

  • h – разместить по возможности здесь же,
  • t – разместить в верхней части страницы,
  • b – разместить в нижней части страницы,
  • p – разместить на отдельной странице, где нет ничего, кроме плавающих объектов.

Приоритет размещения определяется порядком следования букв. Если первой следует буква h, то в случае неудачи LaTeX размещает плавающий объект на следующей странице. Если же первыми следуют буквы t или b, то размещение организуется на текущей странице.

Для «красивого» размещения картинок LaTeX опирается на некоторые значения по умолчанию, которые не всегда могут быть оптимальными для текущего случая. Поэтому, если очень хочется разместить картинку, например, внизу, то пожелание можно усилить с помощью восклицательного знака: [b!].

Управление плавающими объектами

Если плавающих объектов в документе немного, то всё будет хорошо и без какого-либо вмешательства человека. Но если их много, то так или иначе надо будет управлять их размещением.

clearpage

Если LaTeX не справляется с размещением картинок, то он переносит их на следующую страницу. В какой-то момент может накопиться целая «толпа» таких перенесённых картинок, и возникнет необходимость в их «насильственном» выводе в каком-то определённом месте. Для этого существует команда \clearpage. При вызове этой команды завершается текущая страница и выводятся все отложенные плавающие объекты – и только потом продолжается обычный вывод текста. Единственная проблема этой команды в том, что текущая страница обрывается. Чтобы избежать обрыва, можно воспользоваться пакетом afterpage, точнее, одноимённой командой из него:

 \afterpage{\clearpage}

Команда \afterpage откладывает выполнение указанных в ней инструкций до конца текущей страницы.

suppressfloats

Команда \suppressfloats полностью подавляет размещение плавающих объектов на текущей странице. В качестве необязательного параметра ей можно передать t или b – в этом случае запрет распространяется только на размещение плавающих объектов вверху или внизу страницы, соответственно.

placeins

Пакет placeins не даёт плавающим объектам «утекать» за установленные пределы. Барьер устанавливается с помощью команды \FloatBarrier.

Это бывает полезно, когда хочется, чтобы все картинки не выходили за пределы своего раздела. В этом случае следует переопределить нужную команду секционирования для установки перед ней барьеров. В случае команды секционирования раздела (section) достаточно передать пакету при загрузке опцию [section]:

 \usepackage[section]{placeins}
 endfloat

Часто при подготовке статей необходимо размещать иллюстрации на отдельных страницах после основного текста. Подобная галерея предваряется списком иллюстраций. Пакет endfloat именно это и делает. Достаточно просто загрузить его.

«Упаковка» картинок в один float

Для уменьшения «поголовья» плавающих объектов полезно размещать картинки группами. Например, чтобы разместить две картинки рядом, можно применить команду \parbox или окружение minipage:

 \parbox[«позиционирование»]{ширина}{текст}
 \begin{minipage}[«позиционирование»]{ширина}
  текст
 \end{minipage}

В обоих случаях поддерживается обязательный параметр «ширина», по которой формируется создаваемый бокс, и необязательный «позиционирование» – расположение сформированного бокса относительно базовой линии по вертикали. Позиционирование может проводиться по центру (опция [c] – задана по умолчанию), по верхней линии ([t]) и по нижней линии бокса ([b]). Шаблон для двух стоящих рядом рисунков может иметь примерно следующий вид:

 \begin{figure}[ht]\centering
   \parbox[b]{0.49\TeXtwidth}{\centering
     \includegraphics{«рисунок-1»}
     \caption{«подпись-1»}\label{fig:metka-1}}
   \hfil\hfil%раздвигаем боксы по горизонтали
   \begin{minipage}[b]{0.49\TeXtwidth}
     \centering
     \includegraphics{«рисунок-2»}
     \caption{«подпись-2»}\label{fig:metka-2}
   \end{minipage}
 \end{figure}

Использование команды \parbox или окружения minipage зависит исключительно от личных предпочтений. С их помощью можно организовать и более сложные конструкции.

Для целей автоматизации упаковки можно использовать специализированные пакеты:

  • subfig – организует группы из множества картинок. Относительно современный пакет.
  • miniplot – делает то же что subfig, хоть и менее изощрённо.
  • figsize – специализируется на автоматическом вычислении размеров картинокn для размещения их в указанных пределах.
  • dpfloat – определяет новый тип плавающего окружения, занимающего сразу две страницы – двойные иллюстрации на развороте.

Картинки «в оборку»

Маленькие иллюстративные рисунки удобно делать в оборку с текстом, то есть текст должен обтекать их. Такие картинки располагаются на внешней стороне страницы – слева для чётных и справа для нечётных страниц или, в случае, одностороннего режима печати, справа.

Картинка в оборку.

Традиционно описываются два пакета для создания подобных рисунков: floatflt и wrapfig. floatflt более автоматизирован для размещения картинок, но он также чаще «ломается» при большом числе плавающих объектов. Возможны даже «потери» картинок. Упомянутые пакеты определяют окружения floatingfigure и wrapfigure, соответственно.

 \begin{floatingfigure}[«размещение»]{«ширина»}\end{floatingfigure}

Необязательный параметр «размещение» позволяет изменить алгоритм размещения картинки:

  • rflt – размещать справа,
  • lflt – размещать слева,
  • vflt – слева для чётных и справа для нечётных страниц (по умолчанию).
 \begin{wrapfigure}[«число строк в оборке»]
               {«размещение»}{«ширина»}\end{wrapfigure}

В отличие от окружения floatingfigure, wrapfigure требует определить правила размещения картинки. Доступные варианты: справа ({r}), слева ({l}), с внешней стороны страницы ({i}) и с внутренней стороны страницы ({o}). Если вместо строчных букв передать заглавные, то включается запрет на сдвиг по вертикали – картинка должна быть размещена начиная с той строки абзаца, в которой она была определена.

Необязательный параметр «число строк в оборке» позволяет указать число строк текста, которые должны быть сбоку от картинки, при этом выносная формула считается за три строки текста. Если параметр не определён, то число строк вычисляется автоматически – к сожалению, не всегда оптимально.

Свою процедуру размещения картинки в оборку с текстом предлагает так же и пакет nccfloats (nccfloats входит в коллекцию ncctools, созданную А.И. Роженко):

 \sidefig(«ширина картинки»)(«ширина текста»)
 {\includegraphics{«картинка»}}{«текст»}

В этом случае предлагается передавать команде \sidefig и саму картинку, и текст, помещаемый сбоку. Параметр «ширина текста» можно опустить – тогда текст занимает всё оставшееся пространство. Подробности можно посмотреть в документации nccfloats.pdf.

Подписи к рисункам

Для добавления подписи к рисунку используется команда \caption, которую можно использовать только внутри плавающих объектов. В качестве обязательного параметра передаётся текст подписи. При выводе подпись центрируется, если она достаточно мала. В противном случае подпись оформляется в виде абзаца. Текст подписи не должен содержать команд разрыва строки. Все хрупкие команды внутри подписи должны быть защищены с помощью команды \protect. \caption можно передать также необязательный параметр, который должен представлять из себя краткую версию подписи, появляющуюся в автоматически создаваемых списках.

Оформление подписи жёстко привязано к стилю документа, и изменить её без переопределения самой команды \caption непросто. Для модификации параметров следует воспользоваться пакетами caption или ccaption. Оба упомянутых пакета позволяют «покрутить» множество ручек и снабжены исчерпывающей документацией.

При включении русской опции \usepackage[russian]{babel} перед подписью выводится слово «Рис.», за которым следует автоматически вычисляемый порядковый номер картинки. В качестве разделителя между счётчиком и подписью по умолчанию используется двоеточие. Для замены двоеточия на точку в преамбуле достаточно набрать, например, следующее:

  \usepackage{ccaption}
  % заменяем для рисунков ‘:’ после номера рисунка на ‘.’
  \captiondelim{. } % после точки стоит пробел!

Кроме традиционного размещения подписи под картинками, её можно вынести, например, на поля страницы. Недаром же стандартные классы имеют такие широкие поля! Пакет mcaption определяет окружение margincap:

  \begin{figure}[ht]
    \begin{margincap}{«Подпись»}
      \includegraphics{«картинка»}
    \end{margincap}
  \end{figure}

В качестве обязательного параметра окружению передаётся подпись, а внутри определяется картинка.

Странный получился рассказ. В статье, озаглавленной «Графика», не было ска зано ни слова о том, как эту графику, собственно говоря, создавать. А ведь есть что сказать, но в данном случае информация о размещении и оформлении готовых картинок поважнее будет. О том, что LaTeX умеет рисовать, мы тоже поговорим, но чуть попозже. LXF

OpenSource шагает по стране – «пользователи» наступают.

LXF86 latex04.png

Посмотрите на картинку. Что это? Это TpX – простой векторный редактор для Windows.

Чем же он интересен? Гм, сложный вопрос. Ну да – его можно запустить в Wine и от некоторых действий он даже не выпадает в осадок. Но это не Inkscape и отнюдь не xfig. Ещё один ничем не выдающийся «велосипед», если бы не три «но».

Первое «но» состоит в том, что этот «велосипед» выпущен под GPL: (http://sourceforge.net/projects/tpx/).

Второе «но» заключается в специализации этого редактора – он предназначен для создания простых картинок с последующим внедрением в LaTeX. То есть это всё-таки специализированный «велосипед».

«Но» третье и основное заключается в авторе. Это Александр Анатольевич Цыплаков (http://www.nsu.ru/ef/tsy/) – кандидат экономических наук и доцент Новосибирского государственного университета. Да, для разработки использовался Delphi, да информацию, что программа под GPL найти в коде непросто (её там нет) – отсутствие технической культуры, да, диссертация написана в Microsoft Word – как это принято у экономистов. Но автор не технарь – он тот самый «пользователь», о котором так любят рассуждать программисты. Пользователь, недовольный нехваткой инструментов настолько, что начал создавать их самостоятельно. Не просто создавать, а распространять результаты своего труда под свободной лицензией. И этой программой вполне можно пользоваться.

Правда, пока автор не освоит в совершенстве Lazarus, более-менее стабильной версии под Linux (у автора это в планах) вряд ли можно ожидать. Ну, естественно, если кто-нибудь ему не поможет, а то «пользователи» будут вынуждены взять власть в свои «очумелые» руки.

Персональные инструменты
купить
подписаться
Яндекс.Метрика