Как я написал диплом по химии с (Xe)LaTeX

Эту статью я задумал еще на втором курсе, когда впервые решил перейти с Word’а на LaTeX. В конце третьего курса я ее начал, и, наконец, после защиты диплома я нашел в себе силы ее дописать. Здесь я постарался собрать свой опыт (и созданные костыли, куда же без них) в использовании LaTeX при подготовке текста, связанного с химией и в решении тех проблем, с которыми столкнулся я.

Введение


К использованию LaTeX меня подтолкнул тот факт, что однажды при попытке добавить подписи к картинкам Word просто испортил файл: файл открывался, текст отображался, однако отредактировать что-то было невозможно. Файл был успешно восстановлен из резервной копии, но осадочек, как говорится, остался. После этого момента я и вспомнил о LaTeX, о котором когда-то слышал. Далее последовал стандартный путь изучения: гугл, книги, stackexchange, метод проб и ошибок, etc.

Я не претендую на какую-либо полноту или правильность моего решения, я описываю те задачи, которые я решил в процессе подготовки текста диплома. Некоторые из них мне показались достаточно общими, чтобы описать способы их решения в отдельной статье.

Статья подразумевает некоторые знания в LaTeX, примерно на уровне написать простую преамбулу, вставить картинку и сверстать таблицу.

Общие настройки


Я использую движок XeLaTeX и biber для обработки библиографической информации.
Общие идеи преамбулы я взял у Amet13 и дополнил необходимыми мне пакетами.

Из непосредственно химических пакетов:

  • chemmacros — дает возможность выводить длинные названия веществ с адекватными переносами, и форматировать всяческие экспериментальные данные (спектры, температуры плавления)
  • mhchem — форматирует простые (строчные) формулы и реакции
  • chemscheme — добавляет плавающее окружение для схем реакций со своим названием и нумерацией
  • chemnum — нумерация соединений
Настраивается это всё так
\usepackage{chemmacros}

\usepackage[version=4]{mhchem}
\mhchemoptions{layout=stacked}
\chemsetup{formula = mhchem}
\chemsetup{modules=all}

\usepackage{chemscheme}
\renewcommand{\schemename}{Схема}

\usepackage{chemnum}
\setchemnum{format=\bfseries}

Дополнительные пакеты:

  • placeins — вместе с модификатором h! из пакета float не позволяет плавающим рисункам уплывать куда-нибудь не туда
  • todonotes — позволяет оставлять заметки на полях и в тексте
  • threeparttable — добавляет возможность делать сноски к таблицам
  • makecell — переносы в таблицах (очень удивился, когда узнал, что для этого требуется отдельный пакет)

Организация файлов


Мне показалось логичным создать корневой файл, в котором подключается все необходимое — преамбула, разделы, приложения. Для всего, что подключается один раз и навсегда — папка include, для разделов — папка sections, для приложений — appendix.
У каждого раздела в папке sections своя папка, где хранятся изображения в папке img и исходные файлы схем в папке ChemDraw.

Дерево папок и корневой файл
.
├── appendix
│   └── img
├── include
└── sections
    ├── conclusion
    │   └── img
    ├── experimental
    │   └── img
    ├── introduction
    │   └── img
    ├── literature
    │   ├── ChemDraw
    │   └── img
    └── results
        ├── ChemDraw
        └── img

main.tex:
\documentclass[12pt, a4paper, final]{extarticle}

\input{include/preamble.tex}
\input{include/siunitx.tex}
\input{include/acronyms.tex}

\begin{document}
\includepdf{include/titul_bac.pdf}

\include{include/toc}
\include{include/loa}

\include{sections/introduction/introduction}
\include{sections/literature/literature}
\include{sections/results/results}
\include{sections/experimental/experimental}
\include{sections/conclusion/conclusion}

\include{include/bibliography}

\include{appendix/appendix}
\end{document}

Для файлов был создан git-репозиторий в основном для бэкапа и возможности фиксировать добавление тех или иных фрагментов диплома или правок.

Картинки


Мне было удобнее использовать EPS или векторный PDF, который умеет выводить любой химический редактор.

Для создания изображения из нескольких частей, подписанных буквами, служит пакет subfigure с настройкой:

\renewcommand{\thesubfigure}{\asbuk{subfigure})}


В коде это выглядит так
\begin{figure}
    \centering
    \subfigure[Подпись к рисунку 1]
    {
    \includegraphics[width = 0.45\textwidth]{рисунок1}
    }
    \subfigure[Подпись к рисунку 2]
    {
    \includegraphics[width = 0.45\textwidth]{рисунок2}
    }
    \caption{Подпись ко всему рисунку}
\end{figure}

Таблицы


Таблицы в целом стандартные, созданы в основном с помощью Excel и сайта Tables Generator. Для того, чтобы входило больше текста все таблицы обернуты в окружение small, для переносов в ячейках строк используется пакет makecell. Для более книжного вида используются линейки различной толщины из пакета booktabs, сноски к таблицам делаются пакетом threeparttable.

Цитаты


Для LaTeX существует несколько библиографических движков: biblatex, biber. Эти программы требуют наличие bib-файла. Для его подготовки существуют несколько подходов от ручного редактирования до специальных программ типа Mendeley и Zotero.

Я пользуюсь Mendeley, потому что там у меня есть коллекция отсортированных статей.

Единственная проблема — при поиске библиографической информации по doi Mendeley загружает также дату выхода статьи, а biblatex ее вставляет в документ, давая что-то типа:

Jakob F., Herdtweck E., Bach T. Synthesis and Properties of Chiral Pyrazolidines Derived from (+)­Pulegone // Chemistry ­ A European Journal. — 2010. — Июль. — Т. 16, No 25. — С. 7537—7546.


вместо

Jakob F., Herdtweck E., Bach T. Synthesis and Properties of Chiral Pyrazolidines Derived from (+)­Pulegone // Chemistry ­ A European Journal. — 2010. — Т. 16, No 25. — С. 7537— 7546.


Проблема решается двумя командами в преамбуле:

\AtEveryBibitem{\clearfield{month}}
\AtEveryCitekey{\clearfield{month}}

Также в процессе общения с рецензентом выявились следующие недостатки списка литературы: для русскоязычных статей слова «Том», «Номер» и «Страницы» следует сокращать как «Т.»,»№» и «С.» соответственно, а для англоязычных как «V.»,»№» и «P.»; в случае, если авторов больше трех, то следует выводить первых трех (а не одного, как сделано по умолчанию) и далее [и др.] или [et al.] с учетом языка источника.

К моему счастью, biblatex позволяет настраивать вывод библиографических записей непосредственно в преамбуле. Проблема крылась в том, что Mendeley не умеет работать с полем langid в bib-файле, которое требуется для biblatex. В итоге я решил прописать каждой статье поле language через Mendeley и заменить в bib-файле «language» на «langid». Далее через интерфейс biblatex для разных языков были заданы разные настройки:

\DefineBibliographyExtras{russian}{\renewcommand{\bibrangedash}{\,--\,}}
\DefineBibliographyExtras{english}{\renewcommand{\bibrangedash}{\,--\,}}
\DefineBibliographyStrings{english}{number = {№}, jourvol = {V. }}

Также по-умолчанию несколько ссылок подряд разделяются не запятой, как это требуется по ГОСТу, а точкой с запятой. Это легко решается одной командой:

\renewcommand{\multicitedelim}{, }

Непосредственно химия


Формулы


Поскольку диплом у меня по органической химии, и все структурные формулы вставляются как изображения, то и от пакета мне требуются только простейшие формулы типа CO2, H2O и прочих, что прекрасно делается пакетом mhchem.

Простые формулы
(\ce{Mg(ClO4)2}, \ce{Mg(NTf2)2}, \ce{TiCl4}, \ce{SnCl4}, \ce{Yb(OTf)3})

превращется в pyyves48djmxcshjztz8waf6_gw.png

Нумерация соединений


В органической химии принято присваивать соединениям номера, ибо иногда название вещества по системе ИЮПАК, призванной (по идее) обеспечивать однозначное соответствие между структурной формулой и названием, может растянуться строчки на две-три:

Например (doi:10.1021/cm052861i)
h_-mpilga93odyaqbz9aqsgdtdc.jpeg
2-(1-(3,5-bis ((perfluorophenyl)methoxy)benzoyl)-3-cyano-4-((E)-2-(5-((E)-4-(dibutylamino)styryl)thiophen-2-yl)vinyl)-5-oxo-1,5-dihydro-2H-pyrrol-2-ylidene)malononitrile

Современные редакторы химических структур умеют генерировать их автоматически, но на английском, и приведение их к русскоязычном нормам требует некоторых усилий, помимо перевода.

Возвращаясь к нумерации, передо мной встали две задачи: вести эту нумерацию в LaTeX и каким-то образом выводить ее на схемах в документе.

Первая задача прекрасно решается с помощью пакета chemnum, который позволяет вести нумерацию соединений в порядке их упоминания в тексте, в том числе и структур с разными заместителями, обозначающимися буквами рядом с номером, и настраивать формат этой нумерации.

Вторая же проблема имеет несколько вариантов решения. Во-первых существует изрядно устаревший подход с заменой строки текста в eps-файле с помощью специального пакета в момент компиляции документа. Способ малоприменимый на практике в моем случае: эти пакеты совместимы только с оригинальным LaTeX (а с некоторыми костылями и с pdfTeX), а новые версии ChemDraw хранят текст в eps-файле побуквенно.

Вариант номер два — отрисовывать структурные формулы средствами LaTeX, для чего служат такие пакеты как XyMTeX и chemfig. Вариант не лишенный достоинств, но требующий перевода структур в формат пакета вручную или почти вручную. В случае chemfig, существует скрипт на Python под названием mol2chemfig (который я так и не смог у себя запустить), который позволяет из стандартного формата mol получать код для отрисовки структурной формулы в LaTeX. Однако этот подход требует ручного создания схем в документе, что мне не понравилось.

В итоге я остановился на пакете overpic, который позволяет вывести любой текст поверх любого изображения в любом месте. Из недостатков — необходимость этот текст вручную выставлять, пересобирая в процессе документ несколько раз. Зато это позволяет рисовать схемы в WYSIWYG редакторе по типу ChemDraw, пользуясь всеми его графическими возможностями.

Как это выглядит
В документе:
ue0hdfi4ts-9rnx1pqvlvimexfc.png
И в коде:
\begin{overpic}{sections/literature/img/azomethine_generation.eps}
        \put(6, 44){\textbf{\cmpd{hydrazone}}}
        \put(56, 44){\textbf{\cmpd{enhydrazine}}}
        \put(6, 29){\textbf{\cmpd{carbene}}}
        \put(62, 29){\textbf{\cmpd{silyl}}}
        \put(6, 15){\textbf{\cmpd{oxidation}}}
        \put(49, 16){\textbf{\cmpd{diazo}}}
        \put(65, 16){\textbf{\cmpd{azo}}}
        \put(22, 0){\textbf{\cmpd{metathezis}}}
    \end{overpic}

Экспериментальные данные


В отличие от основной части работы, в экспериментальной части принято приводить полные названия соединений по ИЮПАК, а не номера. Проблема заключается в том, что LaTeX в каждом слове допускает только один перенос, а команда \iupac{} из пакета chemmacros позволяет своему аргументу переноситься несколько раз и добавляет макросы \E, \Z и подобные для использования в названиях соединений.
Также принято приводить экспериментальные характеристики полученных соединений — температуру плавления, спектры и прочие подобные вещи.

Например
\data*{Т\textsubscript*{пл.}} 147--\SI{150}{\celsius}.

будет выведено как:
8qxrk9rhfaakoaj6gfppna_mzra.png

Приложения


Неотъемлемая часть любого диплома — приложения. Обычно туда выносят все, что имеет слишком большой объем для основного текста, но может быть полезно. Для этого я использовал пакет appendix с некоторыми костылями.

Стандарты оформления моего ВУЗа требуют не нумеровать страницы в приложениях и давать их заголовки с выравниванием вправо.

    \pagenumbering{gobble}

    \titleformat*{\section}{\raggedleft\large\bfseries}

Из оглавления я также решил их убрать.

    \addtocontents{toc}{\protect\setcounter{tocdepth}{0}}

По-умолчанию пакет appendix нумерует приложения латинским буквами, я изменил нумерацию на арабскую в соответствии со стандартами оформления (опять с помощью костыля)

    \makeatletter
    \renewcommand{\thesection}{\@arabic\c@section}
    \makeatother

В приложениях у меня живут в основном ЯМР-спектры в виде картинок, которые из программы для их обработки выходят в виде PDF формата A4 альбомной ориентации. К сожалению, у меня так и не получилось в одном документе совместить книжную и альбомную ориентацию (я подозреваю, что это вообще невозможно), поэтому пришлось изобретать свой велосипед с использованием пакета rotating.

Велосипед
    \begin{figure}[h!]
        \rotatebox{90}{
            \begin{minipage}{0.82\textheight}
                \includegraphics[width=\linewidth]{appendix/img/1.pdf}
                \caption{Спектр 1}
            \end{minipage}
        }
    \end{figure}

Список сокращений


Список сокращений я делал с использованием пакета acro. Он позволяет создать отдельно список сокращений, вывести его в необходимом месте и вставлять сами сокращения по тексту в нужном формате. Большего мне не требовалось.

Пример
\DeclareAcronym{bz}
{
    short={Bz},
    long={Бензоил},
    first-style=short
}

при упоминании в тексте как 

\ac{bz}
будет выведено в виде «Bz», а в списке сокращений будет приведено с расшифровкой.

Часть списка сокращений выглядит так:
pqcupido45galki5h6tu6aybrp4.png

Презентация


На презентации к защите останавливаться не буду, поскольку решил ее делать по-старинке — в PowerPoint. На мой взгляд, «смотрибельность» для презентации важнее, а WYSIWYG-подход этому более способствует.

Вместо заключения


Главный вопрос: стоило ли оно того? К окончательному выводу я так и не пришел, поскольку при всех его достоинствах LaTeX выдает PDF-файл, в который невозможно вносить исправления. Из-за этого моему руководителю приходилось каждый раз присылать список правок в виде файла в Word’e. Также мне сильно повезло с тем, что в моем ВУЗе отстутствует такое мероприятие как нормоконтроль, и в большинстве вопросов оформления я был ограничен только своим чувством прекрасного и здравым смыслом.

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

Основными источниками информации для статьи послужили:

  1. Серия статей «Каталог классов и стилей LaTeX» за авторством Евгения Балдина, в особенности, пятая часть
  2. Раздел chemistry на CTAN
  3. Документация упомянутых в статье пакетов

© Habrahabr.ru