Вёрстка визитных карточек в LaTeX

в 9:13, , рубрики: latex, textpos, xelatex, верстка, визитки

Доброго всем дня!

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

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

Отсюда непреодолимое желание начать сверлить пилой и пилить буравчиком решить при помощи LaTeX задачу, требующую полного контроля расположения текста на странице. Классический пример — вёрстка визиток, которой мы и займёмся.

Сразу оговоримся, что разработкой дизайна мы заниматься не будем — кто-то уже выбрал для нас все отступы, шрифты, интерлиньяжи и т.д., и т.п. Мы же просто воплотим это ТЗ в шаблон LaTeX.

Допустим, что ТЗ выглядит следующим образом:

  • Логотип университета: высота изображения 20,6мм, левый верхний угол отстоит от левого верхнего угла карточки на 4,2мм по обеим координатам
  • Логотип лаборатории: высота изображения 20,6мм, правый верхний угол отстоит от правого
    верхнего угла карточки на 4,2мм по обеим координатам
  • Цвет текста в RGB: (00,62,92)
  • Цвет фона — цвет текста, разбавленный белым на 50% (или RGB (00,31,46))
  • Текст с именем и фамилией набран шрифтом Arial: размер 12, интерлиньяж 14,4. Расположен сразу под логотипами, отступ от левого края 18,5мм, поле справа — 4,2мм.
    Под ним с новой строки текст с должностью, Arial, размер 7, интерлиньяж 7,5
  • Текст с названием лаборатории, телефонами и адресом: Consolas, размер 5,5, интерлиньяж 7,5. Отступ слева 18,5мм, отступ снизу — 4,2мм, поле справа — 4,2мм
  • Оборотная сторона визитки: логотип университета на всю ширину, отцентрован по вертикали и горизонтали

Итак, поехали. Для начала надо выбрать компилятор: latex и pdflatex (вообще-то, в некотором смысле, это одно и то же, но для данной статьи это неважно) нам не нужны, потому что очень и очень плохо переваривают неродные шрифты. Если кто-то захочет подружить pdflatex и, скажем, шрифт Myriad, то количество необходимых телодвижений перейдёт все разумные рамки. XeLaTeX умеет работать с любыми шрифтами и понимает юникод, а больше нам ничего и не надо.

documentclass{article}
usepackage{fontspec}

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

Следующий пункт: как решить вопрос с размером странички. Здесь на помощь приходит пакет geometry, который прекрасно с этим справляется.

usepackage{geometry}

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

usepackage[absolute]{textpos}

Пакет подключён с опцией absolute, то есть позиционирование блоков будет в абсолютных единицах.

Ещё нам пригодится пакет adjustbox — это один из способов контролировать положение картинок (и вообще т.н. boxed content'а):

usepackage[export]{adjustpage}

Мы используем опцию export, чтобы стандартные команды пакета распространялись и на includegraphics.

Наконец, пакет xcolor, так как мы захотим ввести свои собственные цвета.

usepackage{xcolor}

Теперь займемся настройкой всех пакетов:

geometry{paperwidth=85mm, paperheight=55mm, layoutwidth=85mm, layoutheight=55mm, left=0mm, top=0mm, right=0mm, bottom=0mm}

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

Зададим основной цвет текста, а также определим макросы для телефонов и адресов:

definecolor{bl}{RGB}{0,62,92}
newcommand{phonei}{T. +7~XXX~XXX~XX~XX - M.  +7~XXX~XXX~XX~XX}
newcommand{emaili}{you@domain.somewhere}
newcommand{urli}{www.domain.somewhere}
newcommand{firstlineaddress}{Name of your Lab}
newcommand{secondlineaddress}{1, Nameless street\* 123456, In The Middle of Nowhere, Earth}

А команда

pagecolor{bl!50!white}

задаёт цвет фона разбавляя уже известный цвет «bl» белым на 50%.

Если мы захотим вставить логотипы и/или картинки на нашу визитку, то наилучшим вариантом будет использовать векторные форматы. Пусть эти файлы называются, соответственно, LogoUni.eps и LogoLab.eps. Мы их расположим рядом с нашим основным файлом. В приниципе, xelatex умеет работать «из коробки» со многими форматами изображений (к сожалению, svg к этому списку не относится).

Можно начинать воплощать требования в жизнь:

begin{document}%

Располагаем логотип нашего ВУЗа так, чтобы левый верхний угол изображения имел координаты (4,2мм, 4,2мм) и высота логотипа составляла 20,6мм. Для этого мы воспользуемся окружением:

begin{textblock*}{width}[a,b](xcoord,ycoord)
end{textblock*}

Расшифровка довольно проста: текстовый блок шириной width надо расположить так, чтобы в точке на листе с абсолютыми координатами (xcoord,ycoord) оказалась точка блока с относительными координатами [a,b], которые изменяются от нуля до единицы. Если a=0, b=0, то мы располагаем левый верхний угол, если a=1,b=0, то правый верхний, если a=1,b=1, то правый нижний, а если a=0.5, b=0.5 — то центр нашего текстового блока.

Для регулировки высоты изображения просто воспользуемся стандартным методом includegraphics:

begin{textblock*}{50mm}[0,0](4.2mm,4.2mm)%
noindent%
includegraphics[height=20.6mm]{LogoUni.eps}%
end{textblock*}

Команда noindent нужна, чтобы движок не вставлял красную строку и не портил отступы. Замечу также, что знаки % в конце каждой строки — комментарии в TeX — здесь по существу, так как обычные переносы обрабатываются как пробелы и могут навредить вёрстке.

Аналогочным образом поступаем с логотипом лаборатории: располагаем правый верхний угол логотипа по указанным координатам.

begin{textblock*}{20mm}[1,0](80.8mm,4.2mm)%
noindent%
includegraphics[height=20mm, right]{LogoLab.png}%
end{textblock*}

Опция right в includegraphics выравнивает картинку по правому краю текста.

Затем расположим блок текста с именем и должностью сразу под картинкой с логотипом, отступ слева — 24,8мм (высота картинки плюс отступ самой картинки):

setmainfont{Arial}%
fontsize{12}{14.4}selectfont%
begin{textblock*}{62.3mm}[0,0](18.5mm,24.8mm)%
{color{bl}%
noindentnamei\*%
fontsize{7}{7.5}selectfont%
posi%
}end{textblock*}%

Команда setmainfont задаёт семейство шрифтов для основного текста (подробнее можно почитать в документации к пакету fontspec), а fontsize{x}{y} определяет размер шрифта x и интерлиньяж y. Команда selectfont применяет изменения, введённые fontsize. Последняя команда \* делает мягкий перенос и не начинает новый абзац.

Наконец, последний блок текста с телефонами и адресом лаборатории расположим с тем же самым отступом 18,5мм так, чтобы от нижние поля были 4,2мм:

setmainfont{Consolas}%
 fontsize{5.5}{7.5}selectfont%
begin{textblock*}{62.3mm}[0,1](18.5mm,50.8mm)
{color{bl}%
noindentfirstlineaddress\*%
secondlineaddress\*%
phonei\%   
E. emaili}end{textblock*}%

Если мы хотим сделать оборотную сторону визитки — или сделать несколько визиток в одном файле, то обычные команды начала новой страницы (pagebreak, newpage, clearpage, cleardoublepage, и т.д.) просто так не сработают. Обычного текста на странце ведь нет, поэтому движок считает, что начинать новую страницу не надо. Обходится это всё следующим образом:

nullnewpage%

Уже по накатанной добавляем картинку с логотипом, располагаем центр текстового блока по центру бумаги:

begin{textblock*}{85mm}[0.5,0.5](42.5mm,27.5mm)%
noindent%
includegraphics[width=85mm]%
{LogoUni.eps}%
end{textblock*}%
end{document} 

Итоговый документ:

documentclass{article}
usepackage{fontspec}

usepackage{geometry}

usepackage{xcolor}

usepackage[export]{adjustbox}
usepackage[absolute]{textpos}
usepackage{tikz}

geometry{paperwidth=85mm, paperheight=55mm, layoutwidth=85mm, layoutheight=55mm, left=0mm, top=0mm, right=0mm, bottom=0mm}

definecolor{bl}{RGB}{0,62,92}
 
newcommand{phonei}{T. +7~XXX~XXX~XX~XX - M.  +7~XXX~XXX~XX~XX}%
newcommand{namei}{Name Surname}
newcommand{posi}{Position}
newcommand{emaili}{E. you@yourdomain.somewhere}
newcommand{urli}{yourdomain.somewhere}
newcommand{firstlineaddress}{Name of your Lab}
newcommand{secondlineaddress}{1, Nameless street\* 123456, In The Middle of Nowhere, Earth}

pagecolor{bl!50!white}

begin{document}%
begin{textblock*}{50mm}[0,0](4.2mm,4.2mm)%
noindent%
includegraphics[height=20.6mm]{LogoUni.eps}%
end{textblock*}%
begin{textblock*}{50mm}[1,0](80.8mm,4.2mm)%
noindent%
includegraphics[height=20.6mm,right]{LogoLab.eps}%
end{textblock*}%
%
setmainfont{Arial}%
fontsize{12}{14.4}selectfont%
begin{textblock*}{62.3mm}[0,0](18.5mm,24.8mm){color{bl}noindentnamei\*%
setmainfont{Arial}%
fontsize{7}{7.5}selectfont%
posi%
}end{textblock*}%
setmainfont{Consolas}%
 fontsize{5.5}{7.5}selectfont%
begin{textblock*}{62.3mm}[0,1](18.5mm,50.8mm){color{bl}noindentfirstlineaddress\*%
secondlineaddress\*%
phonei\%   
emaili}end{textblock*}%
nullnewpage%
begin{textblock*}{85mm}[0.5,0.5](42.5mm,27.5mm)%
noindent%
includegraphics[width=85mm]
{LogoUni.eps}%
end{textblock*}%
end{document} 

Логотипы я для этой статьи сам набросал в Inkscape, цвета и шрифты подобрал «лишь бы было», так что за эстетическую составляющую ручаться не буду.

Итоговая лицевая и оборотная сторона:

Вёрстка визитных карточек в LaTeX Вёрстка визитных карточек в LaTeX

Ссылки на документацию к использованным пакетам:

adjustbox
geometry
textpos
xcolor

Автор: windgrace

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js