(La)TeX является одной из наиболее продвинутых систем обработки
текста. Тексты созданные в ЛаТеХе, обычно естественно-научной
направленности, легко узнать не только по красивым формулам,
но и по исключительно сбалансированному тексту.
В тоже время, графики и рисунки, обычно созданные в "посторонней"
программе и импортированные в ЛаТеХ, зачастую
изрядно портят внешний вид документа. Хотя их расположением
занимается ЛаТеХ (см. пост о
плавающих объектах), сам внешний вид рисунков полностью
на совести пользователя.
Одним из наиболее бросающихся в глаза недостатков рисунков
является несоотвествие шрифтов (размера и начертания)
между иллюстрацией и основным текстом.
В одном из предыдущих постов
мы разобрали как с этим
бороться в случае графиков функций, импортируемых из MATLAB.
Одним из самых удобных
средств для создания рисунков (поясняющих иллюстраций, диаграм, схем
и т.п.) является
Inkscape:
свободный, кросплатформенный векторный графический редактор.
Цель этого поста: применение аналогичного трюка для экспорта иллюстраций,
схем и рисунков из Inkscape таким
образом, что текст на них будет соответствовать использованному
в основном тексте.
Импорт рисунков Inkscape в LaTeX
Основная идея и простой пример
Inkscape
создаёт рисунки в формате svg. Наша задача: "красиво" вставить
их в ЛаТеХ-документ. Итак, по порядку:
- Рисуем рисунок :)
Лучше всего задать размер страницы равным желаемому размеру иллюстрации
в ЛаТеХе. Все надписи выполняем, как если бы мы это делали в ЛаТеХе.
Т.е. пишем, например,
$\vec{F}$
, если хотим получить
F с вектором-стрелочкой сверху.
Размер и тип шрифта роли не играет: в результате получится шрифт
как в документе (хотя можно указать размер посредством
\large
и т.п. команд).
Цвет и "поворот" текста, напротив, будут приняты во внимание.
Уделяем особое внимание горизонтальному выравниванию текста
(влево, вправо, по центру), иначе он "переедет" в ЛаТеХе.
- Сохраняем в PDF формате: через пункт меню
"Сохранить как..."/"Save as...". В
появившемся окошке ставим галочку напротив
"PDF+LaTeX: опустить текст в ПДФ и создать ЛаТеХ файл"/"PDF+LaTeX: Omit text in PDF, and create LaTeX file".
Будут созданы два файла: "имя.pdf" с рисунком и "имя.pdf_tex" со всеми
надписями (ниже полагаем имя=drawing).
- В ЛаТеХ-файл вставляем вот так:
01:
02:
\usepackage
{graphicx,xcolor}
03:
...
04:
05:
\begin
{figure
}\centering
06:
07:
\input
{drawing.pdf_tex}
08:
\caption
{...}\label
{...}
09:
\end
{figure
}
Если необходимо изменить размер, то нужно переопределить параметр
\svgwidth
.
Здесь также предполагается, что все файлы были сохранены в текущей
директории.
- Компилируем:
pdflatex имя-tex-файла
.
ЛаТеХ сначала вставит pdf-картинку из drawing.pdf
,
а затем наложит на неё текст из drawing.pdf_tex
.
Результат:
Оптимизация процесса
У описанного выше процесса есть два больших недостатка. Во-первых,
каждый раз, когда
что-то изменено в Inkscape, надо заново сохранять файл как PDF+LaTeX,
тыкая мышкой в разные пункты меню.
Кроме того, включение файла срабатывает только, если файлы картинок
находятся в текущей директории.
От обоих недостатков можно легко избавиться, используя следующий код в
ЛаТеХ-файле:
01:
...
02:
03:
04:
\graphicspath
{{figs/}}
05:
06:
07:
\newcommand
{\executeiffilenewer
}[3]{
08:
\ifnum
\pdfstrcmp
{\pdffilemoddate
{#1}}
09:
{\pdffilemoddate
{#2}} > 0 {\immediate
\write
18{#3}}\fi
}
10:
\newcommand
{\includesvg
}[1]{
11:
\executeiffilenewer
{#1.svg}{#1.pdf}
12:
{inkscape -z -D --file=#1.svg
13:
--export-pdf=#1.pdf --export-latex}
14:
\input
{#1.pdf_tex}
15:
}
16:
17:
...
18:
\begin
{document}
19:
...
20:
21:
\begin
{figure
}\centering
22:
23:
\includesvg
{figs/drawing}
24:
\caption
{Example Inkscape: include svg.}
25:
\end
{figure
}
26:
...
27:
\end
{document}
Здесь для начала указано, что
\includegraphics
должен
искать картинки в поддиректории
figs
.
Затем определены две новые команды.
Первая
\executeiffilenewer{файл1}{фаил2}{команда1}
выполняет
команду команда1
, если файл1
новее, чем
файл2
.
Вторая
\includesvg{}
сначала, если нужно, конвертирует svg
файл в пару PDF+LaTeX, а затем вставляет получившуюся картинку.
Конвертирование происходит посредством вызова Inkscape
"из командной строки". Параметр -z означает "without-gui", а
-D говорит Инкскейпу, что нужно экспортировать всю картинку.
Предполагается,
что команда inkscape находится в "путях к исполняемым файлам"
(переменная $PATH в Юниксах или %path% в нетрадиционных операционных
системах). Проверить так ли это можно открыв терминал
("коммандную строку"),
набрав там inkscape
и нажав ENTER. Если ничего не запустилось,
значит надо в 12-й строке прописать полный путь к исполняемому файлу,
что-то вроде "c:/Programms/Inkscape/inskcape" или "/usr/bin/inkscape",
в зависимости от операционной системы.
Для компиляции используем pdflatex -shell-escape имя-tex-файла
.
Ключик -shell-escape
разрешает ЛаТеХу запускать
сторонние программы: в нашем случае, Инкскейп для конвертации svg в
pdf+tex.
Возможности и ограничения
После вставки в ЛаТеХ, не должно быть никаких проблем с цветами,
градиентными заливками и т.п. вещами: они сохранены в pdf-файле.
С текстовыми же эффектами могут быть проблемы. Поддерживается только
цвет и поворот текста. Такие навороты, как "текст вдоль линии" или
"отображение" работать не будут, хотя в большинстве случаев они и не нужны.
Единственным действительно неприятным недостатком является то,
что не поддерживается текст в несколько строк.
Связка MATLAB - Inkscape - LaTeX
Иногда приходится "усовершенствовать" график, например, указав
стрелками на какие-то его особые точки или разместив дополнительный
рисунок поверх графика. Инкскейп идеально для этого подходит:
он может "читать" файлы в формате eps и pdf.
Однако, если график построен в MATLAB, то лучше его сохранить
напрямую в svg-формате, вместо промежуточного (для наших целей) eps.
Сделать это очень просто с помощью функции plot2svg, которую можно
скачать с MATLAB Central.
На всякий случай, файл plot2svg.m
включён также в
архив с примерами из этого поста.
Строим график, а затем сохраняем его как, например,
plot2svg('figs/example_matlab.svg')
После этого "график" можно открыть в Инкскейп и внести изменения.
Экспорт/импорт в ЛаТеХ осуществляется в точности как уже было описано выше.
Результат:
ЛаТеХ в Инкскейпе
Итак, прямая задача — экспорт рисунков из Инкскейпа в ЛаТеХ — решена.
Но иногда приходится решать и обратную задачу: вставлять формулы
из ЛаТеХа в Инкскейп. Сделать это можно двумя способами.
Способ первый: Render LaTeX Formula
Стандартное расширение Инкскейпа (из базовой поставки) позволяет
легко и просто вставить формулу. Идём в пункт меню Extensions, выбираем
Render, а потом LaTeX Formula.
Если нужно, можно также подгрузить дополнительные пакеты, как, например,
kpfonts в примере выше. В результате получаем суперкрасивую...
нарисованную формулу.
Да-да, не "написанную буквами", а "нарисованную линиями".
Если в вашем Инкскейпе отсутствует пункт меню "LaTeX Formula", то
попытайтесь найти файл extension-errors.log и посмотреть, что именно
произошло. Например, в Windows велики шансы, что Инкскейп не смог
найти програмку pstoedit, необходимую для функционирования "LaTeX Formula":
если дело действительно в этом, то установите pstoedit и добавьте его в путь %path%
.
Способ второй: Tex Text
Это расширение не входит в базовую поставку Инкскейпа, но его
можно установить самостоятельно, скачав отсюда.
Пожалуй, наиболее очевидным преимуществом Tex Text
перед описанным выше
способом является возможность подключать свой стилевой файл, через который
можно подгрузить другие пакеты или определить свой команды
Заключение и выводы
Итак, экспортировать рисунки из Инкскейпа совсем несложно. Процесс
легко автоматизировать с помощью простого ЛаТеХ-скрипта, автоматически
конвертирующего svg-рисунок в связку PDF (картинка) и ТеХ (текст),
которые вставляются в ЛаТеХ-документ один поверх другого.
Достоинством этого метода является весьма неплохо выглядящий результат
(рисунок с ТеХ шрифтом, формулами, ссылками)
при минимальных затратах времени.
Хотя мы рассмотрели данный рецепт на примере Инкскейпа,
аналогичные методы могут быть использованы и с другими программами.
Из графических редакторов, ЛаТеХ неплохо поддерживается Xfig:
об этом написано, например,
здесь.
Справедливости ради, стоит отметить, что весьма неплохих результатов
можно также добиться с помощью
inkscape2tikz. Но
это уже совсем другая история...
Все примеры из данного поста доступны для скачивания по адресу
tinyurl.com/amorua-inkscape.
Зеркала на случай сбоя:
зеркало1
зеркало2