Репозиторий deb-пакетов своими руками: сборка пакетов в Debian из исходников и бинарников на скорую руку



17 коммент.
Часто бывает нужно по-быстрому собрать deb-пакет в Debian, особенно когда уже имеется бинарный файл. Так как мы не слакварщики и не хотим засорять систему make & make install, мы пойдём другим путём и сделаем собственный пакет. А чтобы они не валялись по всему диску, закатаем наши пакеты в собственный же репозиторий.

Распаковка существующих пакетов

Сначала посмотрим, что внутри пакета deb или rpm.

Распаковка deb-пакета

Распаковать пакет Debian нужно в два этапа - сначала извлекаем из него файлы, а потом добираемся до собственно бинарников. Вскрываем пакетик:
# ar vx mypackage.deb
Файл пакета mypackage.deb содержит три вложенных файла:
  • debian-binary - это текстовый файл, который содержит информацию о версии пакета (например: 2.0)
  • control.tar.gz - этот архив содержит всю мета-информацию: имя и версию пакета, зависимости и прочее.
  • data.tar.gz - собственно, бинарники программы, необходимые для работы. Именно эти файлы будут разархивированы в каталог /usr для дальнейшего использования.
Теперь, если нам охота поживиться бинарниками пакета (содержимое data.tar.gz), даём команду:
$ tar -xzvf data.tar.gz
В текущем каталоге появится ./usr текущего каталога. Желанный бинарник лежит в ./usr/bin подкаталоге.

Если же вам нужно просто извлечь файлы из пакета, можно всё сделать одной командой
$ ar p mypackage.deb data.tar.gz | tar zx
это распакует пакет deb в текущий каталог. Другой вариант - использовать dpkg-deb в виде:
$ dpkg-deb -x что.deb куда/


Распаковка rpm-пакета

На всякий случай о том, как распаковать пакеты вероятного противника RPM-based систем. Для этого нам потребуются программы rpm2cpio и cpio. Распаковка содержимого RPM пакета делается в один шаг:
$ rpm2cpio mypackage.rpm | cpio -vid
Если же нужно просмотреть содержимое пакета, не распаковывая его, даём команду:
$ rpm2cpio mypackage.rpm | cpio -vt
Для того, чтобы (попытаться) конвертировать RPM-пакет в Debian, можно воспользоваться командой:
# alien mypack.i386.rpm
Надо сказать, что пакеты RPM и DEB сильно отличаются друг и друга, и такое простое конвертирование не всегда проходит.

Deb-пакет из бинарного файла

Теперь, когда мы знаем, что ничего волшебного внутри deb-пакетов нет, можно попробовать сварганить свой собственный дебиановский пакетик.
Часто хочется сделать побыстрее, чтоб "завелось и поехало" - и вместо пакетов пользователи устанавливают программы в виде ./configure, make & make install (вместо make install можно использовать checkinstall). Как уже говорилось не раз, не стоит поддаваться искушению и ставить программы в Linux в обход менеджера пакетов - пакетный менеджер ничего о них знать не будет, и при обновлении системы вы рискуете получить больше проблем на свою голову, чем представляете.
Иногда бывает так, что исходников к пакету нет - скажем, поступила к нам проприетарщина, а упаковать её в пакет хочется. Или мы наваяли скрипт, и хочется, чтобы он был на многих машинах. Нет проблем: завернём это в deb-пакет и скормим apt-у.
Для этого нам понадобится утилита
# apt-get install dpkg-dev
Подопытным кроликом будет служить бинарный файл системы контроля версий fossil, о котором уже говорилось ранее.
Идея в том, чтобы в локальном каталоге (назовём его ~./tempprog) отдублировать структуру каталогов для программы так, как она лежала бы в системе в установленном виде. Большинство бинарников находится в системном каталоге /usr/bin, поэтому создаём такую же структуру в локальном:
$ mkdir -p ./tempprog/usr/bin/
Так мы создадим все подкаталоги за один проход. Зайдём внутрь:
$ cd tempprog/
и увидим созданные подкаталоги:
$ tree
Вот они:

.
└── usr
     └── bin
2 directories, 0 files

Отлично, теперь в локальном каталоге ./tempprog создаём подкаталог ./DEBIAN:
$ mkdir ./DEBIAN

Внутри подкаталога ./DEBIAN создаём текстовый файл control с таким содержимым:
Package: имя-пакета
Version: версия пакета, скажем 1.0 или 2.7.9.
Architecture: архитектура(i386, amd64, all...)
Maintainer: сопровождающий_пакета
Installed-Size: размер программы в килобайтах
Depends: зависимости (пакет (>= версия))
Recommends: рекомендации (пакет (>= версия))
Suggests: предложения (пакет)
Section: секция (multimedia, games, system, или другое)
Priority: приоритет (optional)
Homepage: http://www.домашняя_страница
Description: описание программы 

Таким образом, в нашем локальном каталоге ./tempprog будет лежать вот что:

.
├── DEBIAN
│.. └── control
└── usr
    └── bin
        └── fossil
3 directories, 2 files

Теперь из каталога ./tempprog даём команду на сборку этого простенького пакета:
$ dpkg-deb -b ./ ./
В результате появится пакет (в нашем примере с fossil) вида:
fossil_1.21_i386.deb
который можно сразу же установить в систему:

$ sudo dpkg -i fossil_1.21_i386.deb
[sudo] password for starscream:
Selecting previously deselected package fossil.
(Reading database ... 247627 files and directories currently installed.)
Unpacking fossil (from fossil_1.21_i386.deb) ...
Setting up fossil (1.21) ...

И всё, наступает счастье.

Небольшое примечание: если кто хочет установить программу в директорию
/opt/ нужно сделать следующее:

- В локальном каталоге ./tempprog создаём каталог /opt/ и размещаем там
программу так, как она и будет установлена в /opt
- Там же, в ./tempprog создаём подкаталоги /tempprog/usr/bin/
в котором размещаем небольшой скрипт, например zotero
- В нём пишем:

#! /bin/sh
PATH=$PATH:/opt/zotero/
/opt/zotero/zotero

Это говорит системе, что теперь можно запускать файлы и из /opt/zotero


Deb-пакет из исходников на скорую руку

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

Если нам повезло и все зависимости уже в системе, можно скомпилировать исходные тексты программы и по-быстрому завернуть всё в пакет Debian.

Для этого скачанные исходные тексты программы (для примера foobar версии 1.2.3) распаковываем в каталог foobar-1.2.3, и от рута даём команду:
# dh_make --createorig
Далее пишем
# debuild
Опять, если нам повезло, всё должно собраться без вопросов. Полученный пакет устанавливаем
# dpkg -i foobar_1.2.3-1_i386.deb
Охочим до тонкостей дебиановской кулинарии и прочим правильно писающим мальчикам просьба пройти сюда и насладиться The Debian Administrator's Handbook. Эта Книга о вкусной и здоровой пище довольно занудная, водянистая и словоохотливая книжеца от двух дебианщиков расскажет вам о Debian Policy, как всё делать ортодоксально и, когда авторы вспоминают, что не мемуары пишут, про то, что же таки собственно делать.

Создание собственного локального репозитория Debian своими руками

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

Создаём каталог, в котором будут лежать все собранные непосильным трудом пакеты - пусть это будет ~/zips/virensdebianrepositor в который копируем deb-пакеты.

Для создания репозитория нам понадобится dpkg-scanpackages который является (во всяком случае на момент написания поста) частью пакета dpkg-dev, как это неожиданно выяснилось.

Создаём список пакетов:
$ dpkg-scanpackages . /dev/null | gzip -9c > ./Packages.gz
Может быть, нам будет выведено сообщение типа:

dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning:   fossil linux-headers-3.8.0-avl9-pae linux-image-3.8.0-avl9-pae pdfsam sublimetext virtualbox-4.2 xserver-xorg-input-wacom zotero
dpkg-scanpackages: info: Wrote 8 entries to output Packages file.

Теперь в нашем репозитории 8 пакетов. Отлично, добавляем наш репозиторий в файл:
# vim /etc/apt/sources.list
строчкой типа:

deb file:///home/имя_пользователя/zips/virensdebianrepository ./

Теперь нужно обновить список пакетов, чтобы они стали доступны для установки:
# apt-get update
Всё, теперь можно установить, к примеру, свежесобранный текстовый редактор Sublime Text 2 (отличная инструкция там) как всегда: Теперь, для того, чтобы установить SublimeText достаточно сделать:

# apt-get install sublimetext

Reading package lists... Done
 Building dependency tree
 Reading state information... Done
 The following NEW packages will be installed:
   sublimetext
 0 upgraded, 1 newly installed, 0 to remove and 245 not upgraded.
 Need to get 0 B/11.4 MB of archives.
 After this operation, 17.4 MB of additional disk space will be used.
 WARNING: The following packages cannot be authenticated!
   sublimetext
 Install these packages without verification [y/N]? Y
 Selecting previously deselected package sublimetext.
 (Reading database ... 247813 files and directories currently installed.)
 Unpacking sublimetext (from ..././sublimetext_2.0.2_i386.deb) ...
 Setting up sublimetext (2.0.2) ... 
Всё, пакет будет распакован и установлен, а то, что он из местного репозитория, видно вот тут: (from ..././sublimetext_2.0.2_i386.deb)

Заключение

Описанные в этом посте рецепты - блюда на скорую руку, а не фуагра с трюфелями. Для больших репозиториев или сложных пакетов придётся-таки ознакомиться с документацией и руководствами. Ещё можно воспользоваться программой APTonCD, которая умеет не только создавать репозитории, но и записывать их на CD/DVD диски.
Читать далее

Исчезновение старых картинок в Google Blogger, или Что бывает, когда всё бездумно затаскивается в Google Plus



16 коммент.
Небольшой краткий пост - мало ли кому пригодится - с описанием технической проблемы Google Blogger, которой почему-то нигде нет. Затрагивает пользователей, которые не хотят заводить себе аккаунт Google+, но имеют старые блоги на Blogger.


Читать далее

Как втиснусть много данных в график gnuplot



12 коммент.
Собственно, этот пост есть коллекция трюков, которая набралась в процессе подготовки двух последних конференций. Проблема в том, что нужно вместить много данных в небольшой график, и делается это порой весьма нетривиальным образом. Как известно, с помощью gnuplot можно сделать всё, что угодно, но мало кто знает как именно. Демонстрация чёрной магии в стиле Gnuplot с полным разоблачением ниже.

Читать далее

Getting Things Done: вся идея GTD одним рисунком



28 коммент.
Сегодня весь день у автора этих строк работа никак не клеилась, и он по этому поводу решил страдать ерундой написать пост в бложик. Повод тем более благодатный, ибо автору пришла в голову мысль сделать из всей системы Getting Things Done (басурм.: Приводим дела в порядок) один большой шарж забавы ради и пользы дела для. Собственно...
Читать далее

Перенос таблиц из MS Excel или OpenOffice Calc в LaTeX через Calc2LaTeX



8 коммент.
Это небольшая заметка может пригодится помимо автора этих строк тем, кому нужно переносить или создавать сравнительно простые таблицы из Excel или Calc в LaTeX, потому как создание таблиц в LaTeX это занятие, часто причиняющее адские боли ниже поясницы.

Читать далее

ЛаТеХ для продвинутых. Floatrow - картинки и таблицы в ряд.



3 коммент.

Как уже обсуждалось в предыдущем посте из серии "ЛаТеХ для продвинутых", одним из самых универсальных средств для контроля над расположением картинок, таблиц и подписей к ним в пределах плавaющего объекта является пакет floatrow.

В предыдущей части мы рассмотрели всевозможные способы взаимного расположения картинки и подписи (снизу, сверху, сбоку), выравнивания их по горизонтали и т.п. Этот же пост будет посвящён расположению нескольких объектов (рисунков, таблиц) в ряд. Обратите внимание, что имеется в виду именно расположение нескольких объектов типа figure и/или table, а не нескольких картинок/таблиц (обычно помеченных как а, б, в, ...) в пределах одного объекта, как это делают пакеты subcaption или subfig.

Все примеры из данного поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции. Документация к пакету floatrow доступна на русском и английском языках.

Краткий анонс

Сначала мы познакомимся с командами \ffigbox{}{} и \ttabbox{}{}, которые создают бокс для картинки/таблицы и соответствующей подписи.

Затем будут освещены средства, необходимые для контроля над горизонтальным выравниванием:

  • Окружение floatrow для расположения иллюстраций и таблиц в ряд.
  • Длины FBwidth (ширина картинки) и Xhsize (ширина остатка страницы).
  • Параметр floatrowsep, определяющий расстояние между картинками в ряду.

И, наконец, будут разобраны способы выравнивания объектов по вертикали, как то

  • Команды \TopFloatBoxes, \BottomFloatBoxes, \CenterFloatBoxes, выравнивающие весь float.
  • Параметры heightadjust и valign для выравнивания только картинки/таблицы.
  • Выравнивание подписей.

Команда \ffigbox

Основной рабочей лошадкой во всех примерах ниже является команда \ffigbox предоставляемая пакетом floatrow. Её синтаксис прост:

01:  \ffigbox[ширина][высота][вертикальное положение]{подпись}{картинка}
Она определяет бокс, в который помещается картинка и подпись к ней, например
01:  \usepackage{floatrow}
02:  \usepackage{graphicx}
03:  ...
04:  \begin{figure}[!h]
05:   \ffigbox{\caption{My Caption}\label{fig:ffb}}%
06:           {\includegraphics{roman_a}}
07:  \end{figure}
создаст обычный плавающий объект, как произошло бы и без использования \ffigbox, с той единственной разницей, что благодаря \ffigbox автоматически включается горизонтальное выравнивание по центру.

Для таблиц определена аналогичная команда \ttabbox: далее мы сосредоточимся на картинках, но всё без исключения применимо и к таблицам.

Расположить несколько рисунков в ряд нам поможет окружение floatrow:

01:  \begin{figure}
02:  \begin{floatrow}
03:   \ffigbox{\caption{My Caption left}\label{...}}%
04:           {\includegraphics{...}}
05:   \ffigbox{\caption{My Caption right}\label{...}}%
06:           {\includegraphics{...}}         
07:  \end{floatrow}
08:  \end{figure}

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

Горизонтальное выравнивание

Волшебная длина \FBwidth

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

01:  \usepackage{floatrow,graphicx,calc}
02:  % Создаёем новый разделитель
03:  \DeclareFloatSeparators{mysep}{\hspace{3cm}}
04:  ...
05:  % Настраиваем значение разделителя для объектов 
06:  \thisfloatsetup{floatrowsep=mysep}
07:  % А вот и сам плавающий объект
08:  \begin{figure}
09:   \begin{floatrow}
10:    \ffigbox[\FBwidth+1cm]{\caption{...}}%
11:            {\includegraphics{...}}
12:    \ffigbox[\FBwidth+1cm]{\caption{...}}%
13:            {\includegraphics{...}}         
14:   \end{floatrow}
15:  \end{figure}

По порядку

  1. В строках 10 и 12 использован необязательный аргумент в \ffigbox, который задаёт ширину плавающего объекта. В этом примере мы задаём ширину на 1см больше, чем ширина соответствующего изображения: т.е. подпись будет выдаваться на 0.5см с каждой стороны. Заметьте, что ширина самого изображения доступна через \FBwidth, a для того, чтобы можно было к ней прибавить 1см, надо загрузить пакет calc в строке 1.
  2. Расстояние между двумя объектами (Figure 3 и Figure 4) задано в строке 6 с помощью параметра floatrowsep. Обратите внимание, что нельзя просто написать floatrowsep=3cm, вместо этого надо определить новый разделитель (назовём его mysep) в строке 3, а затем использовать в floatrowsep=mysep. Пакет предопределяет следующие разделители: none, quad (=1em), qquad (=2em), columnsep (равен длине \columnsep, которую ЛаТеХ использует для разделения двух колонок текста).

Волшебная длина \Xhsize

Помимо очень полезной длины \FBwidth, пакет предопределяет длину (точнее, ширину) \Xhsize, равную оставшейся ширине страницы. Эта длина может быть использована точно так же, как и \FBwidth, в первом необязательном аргументе \ffigbox.

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

01:  \begin{figure}
02:   \begin{floatrow}
03:    \ffigbox[\FBwidth+1cm]{\caption{My Caption left}}%
04:            {\includegraphics{...}}
05:    \ffigbox[\Xhsize]{\caption{My Caption right very .... very long}}%
06:            {\includegraphics{...}}         
07:   \end{floatrow}
08:  \end{figure}

Несколько картинок в ряд

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

01:  \thisfloatsetup{floatrowsep=qquad}
02:  \begin{figure}
03:  \begin{floatrow}[3] % три рисунка в ряд!
04:   \ffigbox[\FBwidth+0.5cm]{\caption{...}}{\includegraphics{...}}
05:   \ffigbox[\Xhsize/3*2]{\caption{...}}{\includegraphics{...}}  
06:   \ffigbox[\Xhsize]{\caption{...}}{\includegraphics{...}} 
07:  \end{floatrow}
08:  \end{figure}

Из этого же примера очевидна гибкость использования \FBwidth и \Xhsize: к ним можно прибавлять длины, их можно умножать на скаляры. Кроме того, обратите внимание, что параметр \Xhsize в строках 5 и 6 имеет разные значения: он каждый раз означает ширину, оставшуюся на странице на момент вызова \ffigbox!

Вертикальное выравнивание

Весь объект

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

Эта проблема решается с помощью одной из команд
\BottomFloatBoxes (выравнивание по низу),
\TopFloatBoxes (выравнивание по верху),
\CenterFloatBoxes (выравнивание по центру),
которая должна следовать сразу после \begin{figure}.

Например
01:  \begin{figure}[!h]\TopFloatBoxes % or \BottomFloatBoxes or \CenterFloatBoxes
02:   \begin{floatrow}
03:     \ffigbox{...}{...}
04:     \ffigbox{...}{...}
05:   \end{floatrow}
06:  \end{figure}
приводит к такому результату:

Только картинки

В большинстве случаев, однако, необходимо выровнять только картинки, а подписи к ним оставить на одном уровне. Без проблем:

01:  \begin{figure}[!h]
02:   \floatsetup{heightadjust=object,valign=c}
03:   \begin{floatrow}
04:    \ffigbox{\caption{...}}%
05:            {\includegraphics{...}}
06:    \ffigbox{\caption{...}}%
07:            {\includegraphics{...}}         
08:   \end{floatrow}
09:  \end{figure}

Здесь использованы два параметра:

heightadjust: какие части float в ряду должны быть одинаковой высоты. Соответственно, его значения

  1. object: место, отводящееся под саму картинку, выполнить одинаковой высоты для всех картинок;
  2. caption: то же, но для места, отводящегося под подпись;
  3. all: первое и второе вместе;
  4. noobject, nocaption, none: отрицание, соответственно, первого, второго и третьего
В нашем примере, floatrow инструктирован выделить под обе картинке блоки одинаковой высоты.

valign: "тип" вертикального выравнивания. Может быть t (по верху), b (по низу), c (по центру).

Подписи

Для рисунков, когда подписи размещены под иллюстрацией, нет необходимости их дополнительно "выравнивать": подписи и так выровнены "по верху". Однако у таблиц, когда подписи размещены сверху, так как использована директива

01:  \floatsetup[table]{style=plaintop}
или, что то же самое,
01:  \floatsetup[table]{capposition=top}
то подписи автоматически оказываются вырoвненными "по низу", вот так:

Чтобы вырoвнять их "по верху" используем

01:  \floatsetup[table]{style=Plaintop}
или же
01:  \floatsetup[table]{capposition=TOP}

Полностью код примера выше: открыть

01:  % используем стиль, в котором подписи таблиц 
02:  % сверху и выравнены "по верху"
03:  \floatsetup[table]{style=Plaintop,floatrowsep=qquad}
04:  %
05:  % Теперь сами таблицы в ряд
06:  \begin{table}[!h]
07:  \begin{floatrow}
08:   % первая таблица
09:   \ttabbox[\FBwidth]{\caption{My Caption left}}%
10:           {\begin{tabular}{c|cc}
11:             Column 1 & Column 2 & Column 3 \\ \hline
12:               a      &  b       &  c       \\
13:               a      &  b       &  c       \\
14:               a      &  b       &  c       \\
15:               a      &  b       &  c       \\
16:               a      &  b       &  c
17:            \end{tabular}
18:    }
19:   % вторая таблица
20:   \ttabbox[\FBwidth]{\caption{My Caption right, let us 
21:                             make it somewhat longer}}%
22:           {\begin{tabular}{c|cc}
23:                      Column 1 & Column 2 & Column 3 \\ 
24:                      \hline
25:                        a      &  b       &  c       \\
26:                        a      &  b       &  c       \\
27:                        a      &  b       &  c       
28:            \end{tabular}
29:           }
30:  \end{floatrow}
31:  \end{table}

Картинка рядом с таблицей

Все трюки, приведённые выше, обсуждались на примере или картинок, или таблиц. Если картинка и таблица должны находиться рядом, нужно воспользоваться командой \killfloatstyle. Например
01:  \begin{figure}[!h]\CenterFloatBoxes
02:   \begin{floatrow}
03:     \ffigbox[...]{\caption{...}}{...}   
04:    %
05:    \killfloatstyle
06:    %
07:     \ttabbox[...]{\caption{...}}{...}
08:   \end{floatrow}
09:  \end{figure} 
произведёт следующий результат

И всё-таки subfloats

Хотя во введении и было обещано не рассматривать вопросы, связанные с расположением "подрисунков" (subfigures, subtables), стоит отметить, что все вышеприведённые рецепты действуют и в их случае с той лишь разницей, что надо использовать окружение subfloatrow вместо floatrow.

Простой пример ниже демонстрирует это в деталях

01:  \usepackage{subcaption,floatrow,graphicx,calc}
02:  \floatsetup{floatrowsep=qquad}
03:  ...
04:  \begin{figure}[!h]
05:  \ffigbox{
06:    % объявляем, что будут 3 картинки в ряд
07:    \begin{subfloatrow}[3]
08:       \ffigbox[\FBwidth+1cm]{\caption{My Caption left}}{\includegraphics{...}}
09:       \ffigbox[\FBwidth+1cm]{\caption{My Caption mid...}}{\includegraphics{...}} 
10:       \ffigbox[\FBwidth+1cm]{\caption{My Caption right...}}{\includegraphics{...}} 
11:    \end{subfloatrow}
12:  }
13:  { % подпись ко всему float 
14:    \caption{Overall caption.}
15:  }
16:  \end{figure}
Пара пунктов, на которые стоит обратить внимание:
  1. надо загрузить дополнительно пакет subcaption;
  2. вместо окружения floatrow используем subfloatrow;
  3. причём помещаем его внутрь первого аргумента \ffigbox (строка 5);
  4. а во втором аргументе \ffigbox помещаем подпись ко всему ряду рисунков (строка 14).

Абсолютно аналогично можно это применить и к таблицам, заменив \ffigbox на \ttabbox

Заключительный сложный пример для любознательных

Помимо рассмотренных выше трюков, floatrow позволяет создавать собственные типы float. Кроме того, пакет иеально функционирует в тандеме с другим пакетом caption, который позволяет должным образом оформить подпись.

В следующем примере использованны эти возможности:

  1. Определен новый тип float под названием Photo (с собственным счётчиком и другими атрибутами), подпись которого набирается справа от картинки.
  2. Для таблиц и др. объектов, подпись отфoрмaтирована специальным образом.

Подробные разъяснения приведены в коде: открыть
01:  \usepackage{caption,floatrow}
02:  %------------------------------------------------
03:  % Форматируем подписи к таблицам, благодаря пакету caption
04:  \DeclareCaptionLabelFormat{rightline}{\rightline{\bothIfFirst{#1}{ }#2}}
05:  % метка Table справа, затем новая строка, метка наклонным, сама подпись жирным малым шрифтом
06:  \captionsetup[table]{labelformat=rightline,labelsep=newline,%
07:                       labelfont={md,sl},textfont={bf,small}}
08:  % Подпись размещаем вверху от таблицы
09:  \floatsetup[table]{style=Plaintop}
10:  %-------------------------------------------------
11:  % Создаём новый тип float: photo
12:  % Команда \DeclareNewFloatType{тип}{опции} из пакета floatrow
13:  \DeclareNewFloatType{photo}{name={Photo},placement=tbp}
14:  % Определяем аналог \ffigbox для photo
15:  % с помощью \newfloatcommand{команда}{тип}[преамбула][ширина]   
16:  \newfloatcommand{photobox}{photo}%
17:    [{\capbeside
18:      \thisfloatsetup{capbesideposition={right,bottom},% подпись справа внизу
19:                      capbesidewidth=3cm}% ширина подписи 3см
20:    }]%
21:    [\FBwidth]
22:  % форматируем подпись с помощью пакета caption  
23:  \captionsetup[photo]{labelformat=rightline,labelsep=newline,%
24:                       labelfont={md,sl},textfont={bf,small}}%
25:  %--------------------------------------------------
26:  % для обычного "Figure"
27:  \floatsetup[figure]{capposition=bottom}
28:  \captionsetup[figure]{labelfont={md,sl},textfont={bf,small}}%
29:  %---------------------------------------------------
30:  ...
31:  \begin{table}[!h]\CenterFloatBoxes
32:  \begin{floatrow}
33:   \ttabbox[\FBwidth]{\caption{My Caption left}\label{tab:1}}%
34:           {\begin{tabular}{c|c}
35:             ...   
36:     \end{tabular}
37:           }
38:   %  
39:   \killfloatstyle 
40:   % 
41:   \photobox{\caption{Here goes a photo}\label{ph:1}}{\includegraphics{...}}
42:  \end{floatrow}
43:  \end{table}
44:  
45:  See Table~\ref{tab:1} and Photo~\ref{ph:1}. Also a ``normal'' Figure~\ref{fig:1}.
46:  
47:  \begin{figure}[!h]
48:   \ffigbox{\caption{Graph of a function}\label{fig:1}}{\includegraphics{...}}
49:  \end{figure}

Подведение итогов

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

Все примеры из данного поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции.
Документация к пакету floatrow доступна на русском и английском языках.

Читать далее

ЛаТеХ для продвинутых. Floatrow - расположение иллюстрации и подписи



4 коммент.

Одним из самых часто задаваемых вопросов о LaTeX является вопрос о вставке картинок. Рисунки чаще всего помещаются в так называемые плавающие объекты (floats). То, как ЛаТеХ размещает эти объекты, уже обсуждалось в одном из предыдущих постов из серии "ЛаТеХ для продвинутых". Теперь же стоит уделить внимание содержанию плавающего объекта: расположению картинок и подписей к ним внутри объекта float.

Одним из самых продвинутых средств в этой области является пакет floatrow. Он предоставляет удобный интерфейс для

  • изменения взаимного расположения подписи и рисунка или таблицы (подпись сверху, снизу, сбоку) без "ручного" перемещения команды \caption{};
  • выравнивания картинки/таблицы и подписи по горизонтали (влево, вправо, центрированно) и контроля полей;
  • расположения нескольких плавающих объектов в ряд и их взаимного выравнивания по вертикали;
  • дополнительных элементов оформления, таких как линий, рамок и теней, отделяющих объект от основного текста или картинку от подписи, и т.д., и т.п.

Целью данного поста является продемострировать возможности предоставляемые floatrow для контроля над расположением подписей к рисункам и таблицам.

Все примеры из поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции. Документация к пакету floatrow доступна на русском и английском языках.

Для нетерпеливых

После загрузки пакета

01:  \usepackage{floatrow}
настройка параметров плавающих объектов осуществляется командой
01:  \floatsetup[тип флоат]{параметр=значение,параметр=значение,...}
где тип флоат может быть, например, figure или table.

Наиболее интересные параметры, значение которых рассмотренно подробнее далее в тексте, приведены в таблице ниже

Параметр Значения, примеры Пояснения
capposition top, bottom, beside, TOP. Напр., capposition=top Положение подписи сверху, снизу, либо сбоку от картинки/таблицы.
capbesideposition {right/left/inside/outside, top/bottom/center}. Напр., capbesideposition= {right,bottom} Если подпись сбоку, её положение относительно картинки/таблицы.
capbesidewidth 10cm, 0.3\textwidth, sidefil. Напр., capbesidewidth= 0.5\textwidth Если подпись сбоку, её ширина
floatwidth 10cm, 0.3\textwidth. Напр., floatwidth= 0.5\textwidth Ширина, отводящаяся на весь флоат. Если подпись сбоку, ширина картинки.
margins raggedright, raggedleft, centering. Напр., margins= raggedright Положение ("выключка") всего плав. объекта по горизонтали на странице (см. рис.).
justification raggedright, raggedleft, centering. Напр., justification= raggedright Положение картинки внутри плав. объекта по горизонтали (см. рис.).

Подпись сверху, подпись снизу

Подпись к рисунку, схеме или таблице можно располагать сверху, снизу или сбоку от самого объекта. Традиционно, подписи к таблицам располагают над ними, тогда как рисунки подписывают снизу. Конечно, этого можно добиться переставляя команду \caption{} соответствующим образом вручную. Однако в мире ЛаТеХа действия "руками" являются моветоном, и поэтому floatrow полностью автоматизирует процесс с помощью команды \floatsetup{}. Например, вот такой код в преамбуле

01:  % загружаем пакеты
02:  \usepackage{floatrow}
03:  \usepackage{graphicx,wrapfigure}
04:  % настраиваем положение подписей
05:  \floatsetup[table]{capposition=top}
06:  \floatsetup[wrapfigure]{capposition=bottom}
07:  \floatsetup[figure]{capposition=beside,%
08:               capbesideposition={right,bottom},%
09:               capbesidewidth=0.3\textwidth,%
10:        capbesidesep=quad% разделитель между картинкой и подписью
11:  }
позволит автоматически перенести подписи ко всем таблицам наверх, все wrapfigure останутся подписанными снизу, а обычные figure плавающие объекты будут подписаны сбоку.
Уделим немного внимания команде \floatsetup[]{}. Она принимает два аргумента. Первый, необязательный, задаёт тип плавающего объекта. Если он не указан, то опции, следующие во втором (обязательном) аргументе будут применены ко всем типам floats в документе.

В данном случае мы использовали опцию capposition, которая может принимать значения top, bottom, TOP и beside. Первые два варианта приводят к очевидному эффекту. Параметр TOP имеет смысл только когда несколько объектов расположены в ряд и поэтому мы сейчас не будем останавливатся на нём в подробностях. Параметру beside стоит уделить чуть болeе внимания.

В комбинации с capbesideposition он позволяет разместить подпись слева capbesideposition={left,..} или справа capbesideposition={right,..} от рисунка. В случае двусторонней печати, можно использовать inside и outside: тогда подпись будет расположена, соответственно, на стороне "корочки" переплёта или на внешней стороне страницы. Помимо этого, capbesideposition контролирует и вертикальное положение подписи относительно рисунка. Надо лишь указать top, bottom или center. Например,

01:  \floatsetup[figure]{capposition=beside,%
02:       capbesideposition={right,bottom}%
03:  }
поместит подпись сбоку справа внизу.

Параметры capbesidewidth и capbesidesep контролируют ширину и отступ от рисунка. Ширину можно указывать в абсолютных величинах (например, 5cm), в долях от какой-либо длины (например, 0.3\textwidth), либо с помощью специального параметра sidefil, который выделит под подпись всю оставшуюся часть ширины страницы. Например,

01:  \floatsetup[figure]{capposition=beside,%
02:       floatwidth=0.6\textwidth,%
03:       capbesidewidth=sidefil% 
04:  }
выделит на картинку 60% страницы, а всё остальное отдаст под подпись. Заметьте, что здесь был использован ещё один параметр floatwidth. Обычно этот параметр задаёт ширину отводящуюся под весь флоат. Однако, если подпись находится сбоку, то floatwidth задаёт ширину отведённую под непосредственно саму картинку, вставленную, например, посредством \includegraphics{}.

Опции необязательно задавать глобально. Если использовать \thisfloatsetup{} вместо \floatsetup{}, то параметры будут применены только к одному плавающему объекту, который первым следует за этой командой.

Пропуски, поля и выравнивание

Всемогущая команда \floatsetup{} позволяет настроить расстояние между картинкой и подписью и в случае, если подпись находится сверху или снизу. Делается это с помощью ключа captionskip=<длина>.

01:  \floatsetup[figure]{capposition=bottom,%
02:              captionskip=5ex,%
03:       floatwidth=0.5\textwidth,%
04:       margins=raggedright% see page 43 of docs
05:  }
Кроме того, в примере задана ширина floatwidth всего float равной половине ширины текста и заказано разместить весь float слева: margins=raggedright (напомним, что по умолчанию и без floatrow, ЛаТеХ выравнивает плавающий объект по центру горизонтали).
Параметр margins принимает также значения centering (по умолчанию), raggedleft и др.

Если параметр margins регулирует, по сути, горизонтальное выравнивание всего float (картинка плюс подпись), то выравнивание по горизонтали картинки в пределах плавающего объекта контролируется с помощью justification. Обратите внимание, что если используется пакет floatrow, то не нужно явно задавать горизонтальное выравнивание картинки (\centering сразу после \begin{figure}) поскольку по умолчанию justification=centering. Другие значения, которые может принимать этот параметр, включают raggedright, raggedleft и justified. Первые два выравнивают картинку по левому и правому краю плавающего объекта, соответственно. justified для самой картинки просто означает, что она будет находиться слева. Однако, если внутри float есть текст (не относящийся к подписи!), то он будет набран, как параграф выравненный по всей ширине плавающего объекта. Например,

01:  \floatsetup[figure]{capposition=bottom,
02:               floatwidth=0.6\textwidth,
03:               margins=raggedright,
04:               justification=raggedleft
05:  }
приводит к такому результату

Все параметры схематически изображены на рисунке ниже.

Выравниваем подпись по ширине картинки

До настоящего момента мы в подробностях рассмотрели всевозможные варианты взаимного расположения и выравнивания картинки и подписи к ней. Один весьма специфический случай, однако, остался без внимания: как сделать так, чтобы весь флоат (то есть картинка и подпись) по ширине совпадали с шириной картинки. При этом хотелось бы, чтобы ширина определялась автоматически, а не вручную посредством floatwidth=ширина.

Сделать это можно с помощью команды \ffigbox{}{} для figure или \ttabbox{}{} для table. Здесь мы не будем обсуждать все возможности этой мощной команды, а приведём конкретный пример

01:  \begin{figure}
02:   \ffigbox[\FBwidth]{\caption{...}\label{...}}%
03:                      { \includegraphics{...} }
04:  \end{figure}
Трюк здесь состоит в том, что первый, необязательный, аргумент команды задаёт ширину плавающего объекта, а значит и подписи. Пакет floatrow определяет длину \FBwidth, которая равна ширине текущего объекта.

Для таблиц, просто заменяем \ffigbox на \ttabbox. Во всей своей мощи и красе \ffigbox и \FBwidth предстают при расположении плавающих объектов в ряд. Но об этом в следующий раз.

Стили

Пакет позволяет создавать стили, которые могут впоследствие быть использованы как

01:  \floatsetup[тип флоат]{style=стиль}
Мы не будем здесь рассматривать создание собственных стилей , а лишь заметим, что floatrow предоставляет набор стилей, некоторые из которых вполне могут буть использованы в реальных документах.

plain plaintop
boxed BOXED
ruled Полный список предопределённых стилей можно найти в документации на странице 31.

Стили можно комбинировать с другими командами, например

01:  \floatsetup[тип флоат]%
02:   {style=ruled,floatwidth=0.6\textwidth,...}

Заключение

Итак, пакет floatrow позволяет легко и непринуждённо управлять расположением различных частей плавающего объекта: например, картинки (таблицы) и подписи.

Осуществляется это посредством команд \floatsetup (для глобальных установок или установок в пределах блока) и \thisfloatsetup (только для первого следующего объекта):

01:  \floatsetup[тип флоат]{параметр=значение,...}
где тип флоат может быть, например, figure, table, wrapfigure, и т.п. Список наиболее интересных параметров можно найти в таблице приведённой выше.

Основным достоинством floatrow по сравнению с "ручными" способами, вроде использования minipages, является гибкий интерфейс, позволяющий одной командой \floatsetup настроить параметры всех плавающих объектов в документе.

Во всей своей красе floatrow проявляет себя при расположении плавающих объектов в ряд. Но об этом в следующий раз.

Все примеры из данного поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции.

Документация к пакету floatrow доступна на русском и английском языках.

Читать далее