Верстаем заявление в LaTeX
Привет, Хабр! Всех, кого не очень устраивает увлекательное заполнение вордовских официальных бланков, приглашаю под кат.
Все началось с того, что мне предложили принять участие в одной конференции. К требованиям вроде «тезисы подаются в формате ворд!» я кое-как привык, но мое терпение лопнуло, когда мне на почту пришел бланк «заключения о возможности открытой публикации».
Все становится еще веселее, если включить отображение скрытых символов. Бланк представлял из себя .doc файл, изобилующий типичными для русского документооборота полями для заполнения рукой в нужных местах: горизонтальная линия во всю строку с пояснением под ней (например «ФИО, должность, подпись»).
Действительно, сначала я попытался сделать именно так, но вся эта «красота» постоянно ломалась, выезжала за поля и действовала мне на нервы. Казалось бы, нажми на клавиатуре insert да печатай «поверх» набитых линеек, что сложного? Поскрежетал я зубами минут 20 и принял ультимативное решение сделать все в латехе. Чего только стоит кегль текста, норовящий сорваться с 12 на 8, а потом обратно. В итоге потратил всего два вечера получился красивый и качественный документ!
!!!
Все имена и названия вымышлены. Любые совпадения с реальными людьми, организациями и адресами случайны.
!!!
отправляется на замечательный форум «Электронные системы управления» в замечательный город Новые Васюки, чтобы представить доклад «Периферийные вычисления для систем управления». Давайте же представим, что сотрудник НИИ «Электронных систем управления» Кузнецов К.
Преамбула
В 2019 работать в латехе достаточно легко: выбираешь редактор по душе, объявляешь тип документа, подгружаешь нужные пакеты и больше не вспоминаешь про оформление своего текста.
Если я не ошибаюсь, то часть этих опций являются значениями по-умолчанию для класса article. Ничего не изменилось и в этот раз: выбираем формат А4, 12 кегль и отключаем титульную страницу. Заодно подключаем пакет, нормализующий отображение в pdf:
\documentclass[12pt,a4paper,notitlepage]
\usepackage{cmap}
Затем необходимо указать кодировку исходного текста, семейство шрифтов и подключить русский язык:
%%% language, font, encoding
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
Стандартные поля в латехе на мой взгляд совсем широкие, явно шире полей в исходном бланке. Работать с ними я предпочитаю с помощью пакета geometry. Обычно я использую по 2 см со всех сторон. Вежливо отказываемся от колонтитулов:
\usepackage[top=2cm,bottom=2cm,left=2cm,right=2cm,nohead,nofoot]{geometry}
Поскольку у нас используются подстрочные пояснения, необходимо увеличить междустрочный интервал. Это легко сделать с помощью \linespread, но я предпочитаю специализированный пакет:
\usepackage[doublespacing]{setspace}
В присланном бланке присутствовал логотип компании, однако, если вам не нужны изображения в документе, данный пакет можно не подключать:
\usepackage{graphicx}
А теперь самое интересное! Именно эти пакеты сделали всю работу за меня. Фирменный пакет американского математического общества amsmath определяет макрос underset, позволяющий создавать «подстрочный» текст, и пакет ulem, донельзя облегчающий работу с подчеркиваниями:
\usepackage{amsmath}
\usepackage{ulem}
Тело документа
Вбиваем привычные begin-end{document} и начинаем творить. Дизайн у нас будет абсолютно ручной, поэтому не помешает очистить стиль страницы:
\pagestyle{empty}
Если требуется включить в документ логотип
Здесь ничего сложного: объявляем плавающий объект, используем определенный в graphicx макрос includegraphics с необходимой шириной и радуемся жизни. Более того, pdflatex отлично дружит с форматом png.
\begin{figure}[t!]
\includegraphics[width=0.4\textwidth]{logo.png}
\end{figure}
В заявлении обычно присутствует штамп. На хабре я видел, как его релизуют с помощью таблицы с заданной шириной. Такой подход мне не понравился, поскольку у таблицы есть параметры arraystretch и tabcolsep, которые немного портят отступы и форматирование. Их всегда можно переопределить, но на мой взгляд в разы легче воспользоваться окружением minipage. Лично я предпочитаю, чтобы машина сама подобрала необходимые интервалы, для этого существует hfill. Однако, нам не всегда необходимо заполнить всю строку, как, например, в случае с датой. Здесь мы с помощью rule оставим необходимое место:
\begin{flushright}
\begin{minipage}{0.4\textwidth}
\centering{
УТВЕРЖДАЮ\\
}
\raggedright{
Генеральный\hfillдиректор\hfillЗАО\hfill<<НИИ\hfillЭСУ>>\\
\hrulefill~Иванов~И.~И.\\
}
<<\hspace{0.25cm}>>~\rule{2cm}{0.25pt}~201\hspace{0.25cm}г.\hfill
\end{minipage}
\end{flushright}
Сделать строку для номера указа также не составит труда. Кажется, в каком-то из пакетов отдельно определен символ "№", но я нахожу нерациональным подключать целый пакет только ради него:
\begin{flushleft}
\rule{2cm}{0.25pt}~N$^{\underline{\circ}}$~\rule{2cm}{0.25pt}
\end{flushleft}
Указываем название документа и выравниваем по центру строки:
\begin{center}
Экспертное заключение\\
о возможности опубликования информации
\end{center}
Наконец, нам выдалась возможность воспользоваться пакетом ulem. Для нас пакет примечателен в первую очередь тем, что подчеркнутый текст автоматически переносится на следующую строку в отличие от underline. Мы не знаем, сколько пространства займет текст, и чтобы линии всегда доходили до полей, мы добавляем hfill.
Экспертная комиссия (руководитель-эксперт) ЗАО <<НИИ ЭСУ>> \uline{исполнительный директор ЗАО <<НИИ ЭСУ>> Петров П. П.\hfill}\\
Теперь мы дошли до самой интересной части документа. Подстрочные пояснения мы реализуем с помощью макроса underset пакета amsmath. Единственная проблема, возникающая при таком подходе — работа в математическом режиме. Соответственно, hfill нам уже не поможет. Тут нам придется проделать немного больше работы: вручную растянуть боксы с помощью hspace и расставить при необходимости принудительные переносы. Изначально я пытался автоматизировать и эту часть при помощи resizebox пакета graphicx, но это не привело к удобоваримым результатам. (Приглашаю в комментарии знатоков ТеХ-программирования).
рассмотрев\\
$\underset{\text{(ФИО автора, вид, название материала)}}{\text{\uline{тезисы и доклад Кузнецова К. К. <<Периферийные вычисления для систем управления>>\hspace{2.75cm}}}}$\\
\uline{для участия в форуме <<Электронные системы управления>>, проводимом с 1 по 10 сентября 2019 года по адресу г. Новые Васюки, Российская Федерация, ул. Пушкина, дом 37\hfill}\\
Самая юридически важная часть заявления:
Подтверждает, что представленный материал:\\ $\underset{\text{(содержит ли информацию с ограниченным доступом или компетенции МО РФ)}}{\text{\uline{информацию с ограниченным доступом или компетенции МО РФ не содержит\hspace{4.25cm}}}}$\\
На публикацию материалов получить разрешение:\hfill$\underset{\text{(следует ли)}}{\text{\uline{\hspace{3.5cm}не следует\hspace{3.5cm}}}}$\\
$\underset{\text{(наименование организации с указанием ведомственной принадлежности, заказчика работ)}}{\rule{\textwidth}{0.25pt}}$\\
Заключение экспертной комиссии: \uline{Тезис и доклад могут быть опубликованы в открытых источниках\hfill}\\
Наконец, назначаем ответственных экспертов. Можем оставить и так, а можем вписать реальные фамилии и должности, не забыв при этом про hspace:
$\underset{\text{(должность, подпись, инициалы)}}{\rule{\textwidth}{0.25pt}}$\\
$\underset{\text{(должность, подпись, инициалы)}}{\rule{\textwidth}{0.25pt}}$\\
$\underset{\text{(инициалы руководителя подразделения, должность, подпись)}}{\rule{\textwidth}{0.25pt}}$\\
Финальные штрихи
Почти всегда любой документ разбит на логические части, которые очень легко расположить на листе, поместив между ними vfill. Возвращаясь к оформлению строк, если никак не получается сделать ровную линию до полей, то можно оставить ее немного меньше и уже в начало строки добавить hfiil.
Отдельную благодарность я хотел бы выразить авторам статей:
habr.com/ru/post/207364 за авторством dbarashev
habr.com/ru/post/144648 за авторством Skiminok
Удачной верстки!
Исходный текст
\documentclass[12pt,a4paper,notitlepage]{article}
\usepackage{cmap} %%% language, font, encoding
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel} %%% pagesize
\usepackage[top=2cm,bottom=2cm,left=2cm,right=2cm,nohead,nofoot]{geometry} %%% line spacing and indentation
\usepackage[doublespacing]{setspace} %%% working with graphics
\usepackage{graphicx} \usepackage{amsmath}
\usepackage{ulem} \begin{document}
\pagestyle{empty}
\vfill
\begin{flushright}
\begin{minipage}{0.4\textwidth}
\centering{
УТВЕРЖДАЮ\\
}
\raggedright{
Генеральный\hfillдиректор\hfillЗАО\hfill<<НИИ\hfillЭСУ>>\\
\hrulefill~Иванов~И.~И.\\
}
<<\hspace{0.25cm}>>~\rule{2cm}{0.25pt}~201\hspace{0.25cm}г.\hfill
\end{minipage}
\end{flushright}
\vfill
\begin{flushleft}
\rule{2cm}{0.25pt}~N$^{\underline{\circ}}$~\rule{2cm}{0.25pt}
\end{flushleft}
\vfill
\begin{center}
Экспертное заключение\\
о возможности опубликования информации
\end{center}
\vfill
Экспертная комиссия (руководитель-эксперт) ЗАО <<НИИ ЭСУ>> \uline{исполнительный директор ЗАО <<НИИ ЭСУ>> Петров П. П.\hfill}\\
рассмотрев\\
$\underset{\text{(ФИО автора, вид, название материала)}}{\text{\uline{тезисы и доклад Кузнецова К. К. <<Периферийные вычисления для систем управления>>\hspace{2.75cm}}}}$\\
\uline{для участия в форуме <<Электронные системы управления>>, проводимом с 1 по 10 сентября 2019 года по адресу г. Новые Васюки, Российская Федерация, ул. Пушкина, дом 37\hfill}\\
Подтверждает, что представленный материал:\\ $\underset{\text{(содержит ли информацию с ограниченным доступом или компетенции МО РФ)}}{\text{\uline{информацию с ограниченным доступом или компетенции МО РФ не содержит\hspace{4.25cm}}}}$\\
На публикацию материалов получить разрешение:\hfill$\underset{\text{(следует ли)}}{\text{\uline{\hspace{3.5cm}не следует\hspace{3.5cm}}}}$\\
$\underset{\text{(наименование организации с указанием ведомственной принадлежности, заказчика работ)}}{\rule{\textwidth}{0.25pt}}$\\
Заключение экспертной комиссии: \uline{Тезис и доклад могут быть опубликованы в открытых источниках\hfill}\\
Члены экспертной комиссии (руководитель-эксперт):\\
$\underset{\text{(должность, подпись, инициалы)}}{\rule{\textwidth}{0.25pt}}$\\
$\underset{\text{(должность, подпись, инициалы)}}{\rule{\textwidth}{0.25pt}}$\\
$\underset{\text{(инициалы руководителя подразделения, должность, подпись)}}{\rule{\textwidth}{0.25pt}}$\\
\vfill
\end{document}