Верстаем заявление в LaTeX

в 14:23, , рубрики: latex, заявление

Привет! Всех, кого не очень устраивает увлекательное заполнение вордовских официальных бланков, приглашаю под кат.

С чего все началось?

Все началось с того, что мне предложили принять участие в одной конференции. К требованиям вроде «тезисы подаются в формате ворд!» я кое-как привык, но мое терпение лопнуло, когда мне на почту пришел бланк «заключения о возможности открытой публикации».

Бланк представлял из себя .doc файл, изобилующий типичными для русского документооборота полями для заполнения рукой в нужных местах: горизонтальная линия во всю строку с пояснением под ней (например «ФИО, должность, подпись»). Все становится еще веселее, если включить отображение скрытых символов.

Казалось бы, нажми на клавиатуре insert да печатай «поверх» набитых линеек, что сложного? Действительно, сначала я попытался сделать именно так, но вся эта «красота» постоянно ломалась, выезжала за поля и действовала мне на нервы. Чего только стоит кегль текста, норовящий сорваться с 12 на 8, а потом обратно. Поскрежетал я зубами минут 20 и принял ультимативное решение сделать все в латехе. В итоге потратил всего два вечера получился красивый и качественный документ!

Приступаем к верстке

!!!
Все имена и названия вымышлены. Любые совпадения с реальными людьми, организациями и адресами случайны.
!!!

Давайте же представим, что сотрудник НИИ «Электронных систем управления» Кузнецов К. отправляется на замечательный форум «Электронные системы управления» в замечательный город Новые Васюки, чтобы представить доклад «Периферийные вычисления для систем управления».

Преамбула

В 2019 работать в латехе достаточно легко: выбираешь редактор по душе, объявляешь тип документа, подгружаешь нужные пакеты и больше не вспоминаешь про оформление своего текста.

Ничего не изменилось и в этот раз: выбираем формат А4, 12 кегль и отключаем титульную страницу. Если я не ошибаюсь, то часть этих опций являются значениями по-умолчанию для класса article. Заодно подключаем пакет, нормализующий отображение в pdf:

documentclass[12pt,a4paper,notitlepage]{article}
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.4textwidth]{logo.png}
end{figure}

В заявлении обычно присутствует штамп. На хабре я видел, как его релизуют с помощью таблицы с заданной шириной. Такой подход мне не понравился, поскольку у таблицы есть параметры arraystretch и tabcolsep, которые немного портят отступы и форматирование. Их всегда можно переопределить, но на мой взгляд в разы легче воспользоваться окружением minipage. Лично я предпочитаю, чтобы машина сама подобрала необходимые интервалы, для этого существует hfill. Однако, нам не всегда необходимо заполнить всю строку, как, например, в случае с датой. Здесь мы с помощью rule оставим необходимое место:


begin{flushright}
begin{minipage}{0.4textwidth}
centering{
УТВЕРЖДАЮ\
}
raggedright{
ГенеральныйhfillдиректорhfillЗАОhfill<<НИИhfillЭСУ>>\
hrulefill~Иванов~И.~И.\
}
<<hspace{0.25cm}>>~rule{2cm}{0.25pt}~201hspace{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 года по адресу г. Новые Васюки, Российская Федерация, ул. Пушкина, дом 37hfill}\

Самая юридически важная часть заявления:


Подтверждает, что представленный материал:\ 
$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.4textwidth}
centering{
УТВЕРЖДАЮ\
}
raggedright{
ГенеральныйhfillдиректорhfillЗАОhfill<<НИИhfillЭСУ>>\
hrulefill~Иванов~И.~И.\
}
<<hspace{0.25cm}>>~rule{2cm}{0.25pt}~201hspace{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 года по адресу г. Новые Васюки, Российская Федерация, ул. Пушкина, дом 37hfill}\
Подтверждает, что представленный материал:\ 
$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}

Автор: mux4in1

Источник

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


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