данные,
ЛаТеХ
13 коммент.
В этом блоге публикуются заметки и решения, найденные в процессе работы, освоения и жизни в дистрибутиве Debian GNU/Linux.
\usepackage[mathlines]{lineno}% Enable numberingОтлично, теперь вставляем команду:
\linenumbers\par %%% <---- turn on the numeration of linesтам, где мы хотим начать нумерацию линий. Если нужно оборвать нумерацию в конце статьи перед, скажем, списком литературы, команда выглядит так:
\nolinenumbers %%% do not use line numbers any more.Важно то, что пакет lineno позволяет не только автоматически проставлять номера строк, но ещё и ссылаться на них. Автор настоятельно рекомендует использовать эту возможность, чтобы не сойти с ума самому при правках и не злить рецензентов.
\linelabel{review:1R1}Как и везде в ЛаТеХе, ссылки стоит ставить разумные: например, здесь написано, что это ответ на замечание 1 от рецензента 1 (они обычно анонимные).
We clarified this on page~\pageref{review:1R1} line~\ref{review:1R1}.
\newcommand{\footnoteremember}[2]{\footnote{#2} \newcounter{#1} \setcounter{#1}{\value{footnote}}} \newcommand{\footnoterecall}[1]{\footnotemark[\value{#1}]}Теперь в тексте можно написать:
The Finite Element Analysis was perfomed on a crappy computer\footnoteremember{footnotelatitude}{Simulations were run on the Dell Latitude E5400 notebook with Intel Celeron 2.2 GHz processor, 2GB DDR2 SDRAM, 120 GB SATA HDD 5400 rpm under Debian GNU/Linux v 5.0 with MATLAB v2007b for UNIX.}.
(see footnote\footnoterecall{footnotelatitude})И вы теперь сможете видеть номер сноски, на которую вы ссылаетесь. Трюк позаимствован отсюда.
pdftotext -layout -nopgbrk reviewnotes_12-0238_MS.pdfгде ключи означают:
-layout : maintain original physical layoutЕсли нужно перевести в текст только со страницы 5 по страницу 10, даём команду:
-nopgbrk : don't insert page breaks between pages
pdftotext -f 5 -l 10 reviewnotes_12-0238_MS.pdfПосле этого текст можно вставлять в веб-форму для ответа рецензентам.
\usepackage{nameref}
\section{Introduction}\label{intro}И ссылемся в тексте:
See more details in the \nameref{intro} section that has number \ref{intro}.Вместо этого мы при компиляции увидим:
See more details in the Introduction section that has number 1.Этот удобный и простой трюк подсмотрен тут.
Нужно сказать, что LaTeX является Turing complete language, то есть на нем можно писать любые программы. Например, можно написать интерпретатор Бейсика, симулятор машины Тьюринга, Mandelbrot with LaTeX и другие программы. То есть на латехе можно писать что угодно. Не всегда это просто (особенно в случае с календарём), но можно.Пост поделён на две части: сначала немного о возможностях пакета Calendar, а потом про то, как обновление названий месяцев сделать автоматически из LaTeX.
%%% Turning on the Monthly calendar and Event listдля календаря на месяц и списка событий, и:
\usepackage{monthly,evntlist,lscape} \parindent=0pt
%%% Turning on the Yearly calendarдля календаря на год соответсвенно.
\usepackage{yearly}
%%%%%%% My Personal CalendarСначала указываем год в отдельном файле Essentials/Calenda/year2010.cld в котором пишем:
range Essentials/Calendar/year2010 %% What year do we want?
%% ONE-TIME EVENTS
january 28 2010 {Описать GTD} [Описать GTD для блога]
%%%%% RECURRING EVENTS
every Sunday {Еженед. обзор} [Еженед. обзор]
%% Span the whole year hereПовторяющиеся события будут определены только в интервале из этого файла.
January 1 2010 to December 31 2010 {The year 2010}
\begin{eventlist} {} {Essentials/Calendar/myEvents}и собираете LaTeXом документ, получая список календарных событий на это время:
january 24 2010 to january 30 2010
\end{eventlist}
\begin{monthly}Все события в календаре на указанный месяц (январь 2010 в данном случае) берутся из того же файла events.cld, который мы использовали для генерации списка календарных дней на неделю.
{firstday=1} %% begins with Monday
{Essentials/Calendar/myEvents}
jan 2010
\end{monthly}
\begin{yearly}После сборки документа годовой календарик будет выглядеть так:
{title= \begin{center} \textbf{\Large The Year 2013}\end{center} \normalsize,firstday=1}
{}
2013
\end{yearly}
out +=r'\begin{landscape}'+'\n'
указывает Питону не интерпретировать \b а печатать как есть. Вызов команды date делается через os.popen(cmd)
, хотя теперь так уже не модно (но тем не менее работает), а модно через subprocess.check_output
(но у меня так не получилось)..rstrip('\n')
и далее сшивается с другими стоками. Результат записывается в файл tmpCalendarMonth.tex, который в свою очередь вставляется в ЛаТеХ через \input{Calendar/tmpCalendarMonth} и обрабатывается при сборке. Скрипт на питоне ниже: #! /usr/bin/python import string, os import commands kmvStartDir = '.' kmvDestDir = kmvStartDir+'/Calendar/' #destination directory for graphs ###### Getting dates and months as text using DATE command in Linux #### cmd='date --date="today" +%Y' stdout_handle = os.popen(cmd) kmv_year = stdout_handle.read() kmv_year = kmv_year.rstrip('\n') stdout_handle.close() cmd='date --date="today" +%B' stdout_handle = os.popen(cmd) kmv_month = stdout_handle.read() kmv_month = kmv_month.rstrip('\n') stdout_handle.close() cmd='date --date="today" +%e' stdout_handle = os.popen(cmd) kmv_day = stdout_handle.read() kmv_day = kmv_day.rstrip('\n') stdout_handle.close() #################################### #### Month Calendar regeneration ### #################################### kmvCalName = kmvDestDir+'tmpCalendarMonth' out = '' out +=r'\begin{landscape}'+'\n' out +=r'\begin{monthly}' out +='\n {firstday=1} \n' out +='{Calendar/myEvents} \n' out +=kmv_month+' '+kmv_year+'\n' out +='\end{monthly}\n' out +='\end{landscape}\n' ### Output to the Calendar's file ###### kmvCalName+='.tex' fout=open(kmvCalName,'w') fout.write(out) fout.close() ####################################
calendar_regenerate.py
и все остальные файлы можно взять отсюда. Скрипт написан для того, чтобы быть максимально понятным, а не красивым или эффективным.calendar_regenerate.py
в тот же каталог, где лежит файл 4myGTD.tex, из которого скрипт будет вызываться. В преамбуле документа пишем:%%% Python script for calendar regeneration \immediate\write18{./calendar_regenerate.py}
-shell-escape
который позволяет выполнение внешних скриптов.
Внимание! Как совершенно справедливо отмечается многими, подобный трюк в сочетании с параметром –shell-escape
небезопасен и представляет собой потенциальную дыру в безопасности. Так
можно написать вредоносный документ с командой типа \write18{rm -rf ~} в
Unix. По этому поводу есть статья (PDF) об этой и других опасных командах в LaTeX.
Команда \immediate приказывает ЛаТеХ выполнить скрипт немедленно,
не дожидаясь окончания генерации всего документа. В данном случае это
оправдано, так как мы хотим, чтобы в документ вставился уже обновлённый
календарь.
Как уже обсуждалось в предыдущем посте из серии "ЛаТеХ для продвинутых", одним из самых универсальных средств для контроля над расположением картинок, таблиц и подписей к ним в пределах плавaющего объекта является пакет floatrow.
В предыдущей части
мы рассмотрели всевозможные способы
взаимного расположения картинки и подписи (снизу, сверху, сбоку),
выравнивания их по горизонтали и т.п.
Этот же пост будет посвящён
расположению нескольких объектов (рисунков, таблиц) в ряд.
Обратите внимание, что
имеется в виду именно расположение нескольких объектов
типа figure и/или table, а не нескольких картинок/таблиц (обычно
помеченных как а, б, в, ...) в пределах
одного объекта, как это делают пакеты subcaption
или subfig
.
Все примеры из данного поста могут быть найдены
здесь
и
здесь
в виде tex-файлов готовых к компиляции. Документация к пакету
floatrow
доступна на
русском и
английском языках.
Сначала мы познакомимся с командами
\ffigbox{}{}
и \ttabbox{}{}
, которые создают
бокс для картинки/таблицы и соответствующей подписи.
Затем будут освещены средства, необходимые для контроля над горизонтальным выравниванием:
И, наконец, будут разобраны способы выравнивания объектов по вертикали, как то
\TopFloatBoxes
,
\BottomFloatBoxes
,
\CenterFloatBoxes
, выравнивающие весь float.
heightadjust
и valign
для выравнивания только картинки/таблицы.
Основной рабочей лошадкой во всех примерах ниже является команда
\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
}
Предыдущий рисунок выглядит очень неуравновешенно, так как ширина отводящаяся на подпись не соответствует ширине картинки. Гораздо более симпатичного результата можно добиться вот так:
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
}
По порядку
\ffigbox
, который задаёт ширину плавающего объекта.
В этом примере мы задаём ширину на 1см больше, чем ширина соответствующего
изображения: т.е. подпись будет выдаваться на 0.5см с каждой стороны.
Заметьте, что ширина самого
изображения доступна через \FBwidth
, a
для того, чтобы можно было к ней прибавить 1см, надо загрузить пакет
calc
в строке 1.
floatrowsep
. Обратите внимание, что
нельзя просто написать floatrowsep=3cm
,
вместо этого надо определить
новый разделитель (назовём его mysep
) в строке 3, а затем
использовать в floatrowsep=mysep
. Пакет предопределяет
следующие разделители:
none
, quad
(=1em), qquad
(=2em),
columnsep
(равен
длине \columnsep
, которую ЛаТеХ использует для разделения
двух колонок текста).
Помимо очень полезной длины \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 в ряду должны быть
одинаковой высоты. Соответственно, его значения
object
: место, отводящееся под саму картинку, выполнить одинаковой высоты для всех картинок; caption
: то же, но для места, отводящегося под подпись;all
: первое и второе вместе;noobject
, nocaption
, none
: отрицание, соответственно, первого, второго и третьегоfloatrow
инструктирован выделить под
обе картинке блоки одинаковой высоты.
valign
: "тип" вертикального выравнивания. Может быть
t
(по верху), b
(по низу), c
(по центру).
Для рисунков, когда подписи размещены под иллюстрацией, нет необходимости их дополнительно "выравнивать": подписи и так выровнены "по верху". Однако у таблиц, когда подписи размещены сверху, так как использована директива
или, что то же самое,01:
\floatsetup
[table]{style=plaintop}
то подписи автоматически оказываются вырoвненными "по низу", вот так:01:
\floatsetup
[table]{capposition=top}
Чтобы выр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 & c17:
\end
{tabular
}18:
}19:
% вторая таблица
20:
\ttabbox
[\FBwidth
]{\caption
{My Caption right, let us21:
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 & c28:
\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
}
Хотя во введении и было обещано не рассматривать вопросы,
связанные с расположением "подрисунков" (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
}
subcaption
;floatrow
используем subfloatrow
;\ffigbox
(строка 5);\ffigbox
помещаем подпись ко всему ряду рисунков (строка 14).
Абсолютно аналогично можно это применить и к таблицам,
заменив \ffigbox
на \ttabbox
Помимо рассмотренных выше трюков, floatrow
позволяет
создавать собственные типы float. Кроме того, пакет иеально функционирует
в тандеме с другим пакетом caption
, который позволяет
должным образом оформить подпись.
В следующем примере использованны эти возможности:
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
доступна на
русском и
английском языках.
Одним из самых часто задаваемых вопросов о 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
,
который выделит под подпись всю оставшуюся часть ширины страницы.
Например,
выделит на картинку 60% страницы, а всё остальное отдаст под подпись. Заметьте, что здесь был использован ещё один параметр01:
\floatsetup
[figure]{capposition=beside,%
02:
floatwidth=0.6\textwidth
,%
03:
capbesidewidth=sidefil%
04:
}
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=raggedleft05:
}
Все параметры схематически изображены на рисунке ниже.
До настоящего момента мы в подробностях рассмотрели всевозможные
варианты взаимного расположения и выравнивания картинки и подписи к ней.
Один весьма специфический случай, однако, остался без внимания: как сделать
так, чтобы весь флоат (то есть картинка и подпись) по ширине
совпадали с шириной картинки. При этом хотелось бы, чтобы ширина
определялась автоматически, а не вручную посредством
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
предоставляет набор стилей, некоторые из которых вполне могут
буть использованы в реальных документах.
![]() |
![]() |
![]() |
![]() |
![]() | Полный список предопределённых стилей можно найти в документации на странице 31. |
Стили можно комбинировать с другими командами, например
01:
\floatsetup
[тип флоат]%
02:
{style=ruled,floatwidth=0.6\textwidth
,...}
Итак, пакет floatrow
позволяет легко и непринуждённо
управлять расположением различных частей плавающего объекта:
например, картинки (таблицы) и подписи.
Осуществляется это посредством команд \floatsetup
(для глобальных установок или установок в пределах блока) и
\thisfloatsetup
(только для первого следующего объекта):
где01:
\floatsetup
[тип флоат]{параметр=значение,...}
тип флоат
может быть, например,
figure
,
table
,
wrapfigure
, и т.п. Список наиболее интересных параметров
можно найти в таблице приведённой выше.
Основным достоинством floatrow
по сравнению с "ручными"
способами, вроде использования minipages, является гибкий интерфейс,
позволяющий одной командой \floatsetup
настроить
параметры всех плавающих объектов в документе.
Во всей своей красе floatrow
проявляет
себя при расположении
плавающих объектов в ряд. Но об этом в следующий раз.
Все примеры из данного поста могут быть найдены здесь и здесь в виде tex-файлов готовых к компиляции.
Документация к пакету
floatrow
доступна на
русском и
английском языках.
Материалы сайта «Записки дебианщика» написаны virens’ом и доступны на условиях лицензии Creative Commons Attribution-Non-Commercial-Share Alike 3.0 Unported License. Вы можете копировать, распространять, показывать эту работу, и создавать производные работы в некоммерческих целях на условиях:
1) обязательной ссылки на автора (virens, http://mydebianblog.blogspot.com/);
2) распространении любых производных работ на условиях этой же лицензии (ссылка на эту лицензию обязательна!).
Пожалуйста соблюдайте условия лицензии Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. Авторские права - Михаил Конник aka virens.