Русский
Русский
English
Статистика
Реклама

Latex

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

22.10.2020 12:07:47 | Автор: admin
Эту статью я задумал еще на втором курсе, когда впервые решил перейти с 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. С. 75377546.

вместо
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})

превращется в


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


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

Например (doi:10.1021/cm052861i)

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, пользуясь всеми его графическими возможностями.

Как это выглядит
В документе:

И в коде:
\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}.

будет выведено как:



Приложения


Неотъемлемая часть любого диплома приложения. Обычно туда выносят все, что имеет слишком большой объем для основного текста, но может быть полезно. Для этого я использовал пакет 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 а в списке сокращений будет приведено с расшифровкой.

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




Презентация


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

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


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

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

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

Mathcha внебрачный сын Word и Latex

02.06.2021 16:12:10 | Автор: admin


Некоторое время назад у меня возникла потребность писать несложные тексты, которые включали в себя математические рассуждения, формулы и вычисления. С помощью примеров и гайдов из интернета я смог освоить самые основы TeX и выполнять поставленные задачи. Но меня не покидала мысль о том, что я стреляю из пушки по воробьям, поэтому я очень обрадовался, когда один знакомый показал мне редактор Mathcha, который включал в себя возможности Word и TeX одновременно. Я считаю, что этот сервис слишком недооценён, и многим он понравится, поэтому я делаю обзор на него.


Дисклеймер: данный обзор основан на опыте работы автора с инструментом и не является рекламой сервиса Mathcha.io


С чем же мы имеем дело


Mathcha.io онлайн WYSIWYG (What You See Is What You Get) редактор текста, который имеет поддержку встроенных в текст формул, блоков формул, картинок, кода с подсветкой, а также некоторых других фич, про которые речь в этой статье не пойдёт (checkbox, вставка видео с Youtube, создание диаграмм и рисунков).



Работа с программой


Текст


Интерфейс программы напоминает Word, что помогает быстро сориентироваться. Сверху есть разные инструменты форматирования: центровка текста, жирный/подчёркнутый/курсив, ссылки, копирование стиля, списки, шрифт (всего 5 штук), размер и цвет текста. Всё это помогает работать с обычным текстом в один клик (в том числе благодаря общепринятым ctrl+b и подобным).



Математика


Вот ради чего это всё затевалось. Есть 2 способа подключения формул: inline-math и math-container (первый можно встраивать в строки текста, а второй только как отдельный блок, что является логичным для математических выкладок).


Лайфхак: можно создать inline-math на текущей позиции курсора, напечатав $. Я не нашёл в настройках способа отключить это (возможно он есть). Но по умолчанию вместо обычного значка доллара приходится писать \$ + Enter, что очень неудобно в финансовых документах. В обычном TeX такая проблема тоже есть, так как $ обозначает начало формулы.



Синтаксис из TeX символы


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


Большинство символов можно найти в выпадающем списке по названию:



Также очень удобная фича, когда не можешь описать символ словами поиск по рисунку:



А также есть автозамена "программистских" значков на математические, например, <= (меньше или равно) заменяется на цельный символ.


Математические конструкции


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



Поиск по рисунку также работает



Так ли это удобно?


Но именно тут возникает главное упущение разработчиков mathcha, которое сильно затрудняет работу: после каждого специального символа необходимо нажимать Enter. Даже если вы полностью напечатали название. Да, предпросмотр дроби хорошо выглядит, а также он очень полезен, когда числитель и знаменатель сложные, но, например, напечатать \frac{3}{5} часто быстрее, чем \frac <Enter> 3 <стрелочка вниз> 5 <стрелочка вправо>.


В любом месте документа (в том числе в математических блоках) можно сделать импорт из TeX, но для этого необходимо напечатать \from-latex <Enter>, потом написать формулу как в TeX (в этом окне также есть предпросмотр), а потом мышкой нажать на OK. Это может занять ещё больше времени, чем первый вариант.



Ещё одна проблема границы блоков формул никак не отображаются, когда курсор находится не в них. Из-за этого найти пустой блок формулы практически невозможно



Вставка картинок


Вставить картинку в документ можно из буфера обмена, с устройства или по url. Также 50 мегабайт ваших картинок хранятся в привязке к аккаунту. Можно делать подпись к картинкам или открывать их на полный экран.



Код


Присутствует поддержка блоков кода с подсветкой и другим оформлением.



Связь с внешним миром


Экспорт в PDF


Единственный способ экспортировать документ в PDF нажать кнопку "Печать" (ctrl+P) и далее выбрать "Печать в PDF" (в зависимости от ОС). Можно выбрать поля и формат страницы, а также колонтитулы.



Экспорт в TeX


Есть возможность экспорта выделенной области как тело документа TeX, но полная совместимость не гарантируется.


Поделиться документом


Можно поделиться документом по прямой ссылке на сайт mathcha.io в формате read-only. Также недавно появилась возможность добавить коллабораторов в документ, но я не пробовал, насколько хорошо работает синхронизация при такой совместной работе.


Десктопная версия


Существует платная (3$ в месяц) офлайн версия, которая имеет некоторые преимущества по сравнению с онлайн версией. Она имеет поддержку экспорта в формат .mathcha, а также снимаются некоторые лимиты. Без лицензии программа находится в режиме read-only, то есть вы всё ещё можете экспортировать файл из онлайн редактора в .mathcha, а после открыть его на чтение в десктопной версии (онлайн версия открывать .mathcha файлы не умеет). Также плюсом офлайн формата является приватность, то есть ваши документы не хранятся где-то в интернете


Выводы


Mathcha самостоятельный инструмент, который использует TeX, а также другие виды контента. Я бы не рекомендовал использовать её людям, которые имеют обширный опыт при работе с обычными TeX документами (так как при большой скорости печати подсказки начинают мешать). Также не стоит рассматривать Mathcha как полную замену TeX-у, так как её возможности сильно ограничены (например, отсутствием внешних пакетов). При работе в ней вы будете "заперты", то есть вынести текущие наработки за пределы редактора не всегда просто. У меня никогда не пропадали документы из хранилища mathcha, но я не могу быть полностью уверен в его надёжности.


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




Облачные серверы от Маклауд быстрые и безопасные.


Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!


Подробнее..

Jupyter для .NET. Как в питоне

18.11.2020 18:12:16 | Автор: admin
Несколько месяцев назад Microsoft рассказали о Jupyter в .NET. Но активности по этому топику очень мало, а ведь тема очень интересная. Но что такое прикольное придумать? Я решил сделать удобный вывод класса Entity из библиотеки символьной алгебры:



Выглядит круче, чем в питоне. Делается просто, доставляет массу удовольствия. Приглашаю под кат!



О Jupyter


Это что-то вроде IDE для создания интерактивных блокнотиков. Вместо того, что бы в привычных средах запускать весь код сразу, здесь вы запускаете его по кускам, сохраняя состояния переменных. Очень удобно для исследований и простых скриптов чего-нибудь подсчитать.

О dotnet/interactive


Этот проект как раз позволяет встроить дотнет в юпитер. То есть вы буквально можете написать

И получать результаты работы кода прямо вот сразу.

Причем некоторые фишки работают из коробки


Об AngouriMath


Это относительно небольшая библиотека символьной алгебры для .NET для работы с математическими выражениями. Разумеется, с математическими выражениями можно работать в одну строку, но это не всегда удобно/красиво.

Все математические выражения так или иначе наследуются от класса Entity, который имеет метод Latexise, возвращающий строку. Поэтому остается всего лишь его отрендерить.

Встраиваем латех


У нас есть возможность зарегистрировать собственный вывод для наших типов, что я и делаю:

let magic() =    let register (value : ILatexiseable) = $@"            <script src='https://polyfill.io/v3/polyfill.min.js?features=es6'></script>            <script id='MathJax-script' async src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'></script>            \[{value.Latexise()}\]            "    Formatter.Register<ILatexiseable>(register, "text/html")

(хабр почему-то не поддерживает F#)

То есть мы просто регистрируем, что тип ILatexiseable должен выводиться в html-формате, а сам код будет генерироваться нашей функцией. Для рендеринга я взял MathJax, хотя наверное имеет смысл кешировать js-скрипт, но это для будущих обновлений.

Ну и собственно все, теперь все выражения, унаследованные от этого интерфейса, будут красиво рендериться. Вот как это выглядит в C#:



Что именно тут происходит?
1. В первом блоке мы вызываем extension-метод ToEntity(), который парсит выражение
2. Во втором блоке мы создаем систему уравнений и сразу ее выводим
3. В третьем создается матрица и сразу выводится


Так как юпитер предзназначен для небольших участков кода, которые не обязаны следовать каким-то проектным требованиям, F# подходит лучше для этого. Поэтому, как это понятно из скриншота в начале статьи, он тоже поддерживается. Для примера, так выглядит решение школьного уравнения:



Дальнейшие планы


Я очень большой любитель .NET-а, но я также очень люблю Jupyter. Поэтому Interactive меня очень порадовал, и я поспешил сделать поддержку Interactive для AngouriMath для вывода выражений в LaTeX. Но дальше интереснее. Я думаю сделать что-то типа Entity.Plot(), который выводил бы сразу график функции. Для простых use-кейсов очень нужна штука, мне кажется.

Если хочется попробовать не устанавливая ничего из необходимого, вы можете потыкаться тут: (аларм: почему-то долго грузится, придется подождать)

Спасибо за внимание! Такая вот короткая заметка.

Ссылки


1. Jupyter удобная браузерная среда для интерактивного программирования
2. .NET Interactive та самая гениальная вещь, благодаря которой можно использовать дотнет в юпитере
3. AngouriMath математическая библиотека, для которой я написал оболочку для латеха
4. MyBinder демка для ленивых
Подробнее..
Категории: C , Математика , Net , F , Jupyter notebook , Jupyter , Latex , Angourimath

Как писать книгу в LaTeXe по физике. Cтатья 1

08.09.2020 18:17:15 | Автор: admin
Это моя первая статья на Хабре.

Глава 1. Введение



1.1 Позвольте представиться и почему я это пишу
Я научный сотрудник, физик. Недавно выпустил книгу по спектроскопии объемом 880 страниц и весом 1560 грамм. Эту книгу я писал 9 лет, параллельно читая лекции по ее содержимому. Она отняла у меня очень много времени, что естественно. Что не естественно это то, что громадная часть потраченного времени ушла на оформление, то есть на изучение языка Латех. И это при том, что я на Латехе пишу всю жизнь, лично написал и опубликовал около 50-ти статей в разных издательствах.
В этой статье (планируется продолжение, но это как пойдет) я хотел бы поделиться с читателями своими, с большими затратами полученными знаниями. Если читатель пишет только статьи, то моя статья ему не очень нужна в ней собрано то, что требуется авторам больших книг.
После публикации книги (пока, увы, только на русском языке) у меня возникло громадное желание написать еще книгу "Как написать книгу по физике в Латехе"


1.2 А почему на Хабре?
Если бы в России существовал некий Главный Форум для пользователей Латеха, я был бы там. Но его нет, увы. Есть ли в мире не знаю. Есть очень достойные форумы, вроде latex.org/forum или tex.stackexchange.com, но там в основном вопросы и ответы.
Есть в России хорошие авторы, а большого общеизвестного форума нет. Жалко.
Знакомая студентка СПбГУ недавно сказала мне, что их заставляют писать текcты в Латехе, но не рекомендуют ни книг, ни хороших сайтов. При таком подходе наши крокодилы может и взлетят, но только очень низенько.

1.3 А почему Латех?
Да я просто не знаю других редакторов. Ни разу в жизни не написал ни одной серьёзной работы в Word или OpenOffice. Поэтому сравнивать редакторы я не могу. Латех это как старая жена. Была любовь, были ссоры, всё было Вот только без него я уже не смогу.
Часто встречается мнение, что Латех лучше, легче и красивее форматирует текст, чем любой другой редактор. Что он как-бы говорит автору: "Отойди в сторонку, ты все равно ничего не понимаешь в оформлении текста, дай поработать профессионалу".
Я думаю, что это так только частично. Я убил море времени на оформление текста, и это очень печально. Я не собираюсь описывать правила работы с Латехом, для этого есть хорошие книги,* как раз наоборот я собираюсь писать о том, чего в этих книгах нет.
В деле оформления текста и создания рисунков есть очень много хитрых приемов, которые я хочу хотя бы кратко описать, если мой текст заинтересует кого-нибудь здесь, на Хабре.

1.4 Есть ли у меня цель
Я, разумеется, понимаю, что в Латехе пишет ничтожное количество людей. Как правило, математики и физики, да и то далеко не все. Из пишущих в Латехе авторов доля пишущих книги очень и очень мала. Наконец, пишущих на русском языке пренебрежимо мала.
Логика этой заметки состоит не в том, чтобы дать читателю широкий взгляд на применения Латеха для книгописательства. У меня нет для этого достаточного кругозора: я уверен, что тот, кто копает везде, копает неглубоко. Логика заметки такая: "я не знаю, какие тропинки куда ведут в нашем дремучем лесу. Я прошёл по густому лесу по одной тропинке, о ней я и собираюсь вам рассказать."

Если говорить о тенденциях, то повсеместное введение наукометрии в России, то есть индексов Хирша (и ему подобных) и количества цитирований, должно полностью уничтожить научную книгу. Я имею в виду прежде всего учёт этой наукометрии при назначении на должности, а также при распределении грантов и других видов финансирования. Напоминаю, что в индексе Хирша книги вообще не учитываются.
Если наши научные руководители будут во всем последовательными, они в будущем должны запретить русский язык, особенно письменный, за написание книг наказывать, а за написание книг на русском языке жестоко наказывать, вплоть до увольнения. За крайне неэффективное использование казёного рабочего времени.
Поэтому мой труд, эта книга, мне самому иногда кажется чем-то дурацким и ненужным. Но ведь без чудаков (дураков?) жить скучно
К тому же здесь, на Хабре, люди часто пишут статьи про всякое старьё, вроде грамплатинок или кассетных магнитофонов. Чем моя тема хуже?

1.5 Лучшие современные книги
В процессе написания своего учебника я перебрал громадное количество иностранных книг и учебников, и пришел к выводу, что самые лучшие учебники в моей области написаны Аткинсом (P. W. Atkins) из Оксфорда с разными соавторами. См., например, "Molecular Quantum Mechanics " (2005). Есть ещё очень хорошие книги Демтрёдера (W. Demtroder, "Laser spectroscopy: basic concepts and instrumentation", 2003; Electrodynamics and Optics ", 2019; ...)
Что интересно в у Демтрёдера автор благодарит специальную службу, которая помогла ему оформить книгу в ЛаТехе. В Германии такая служба есть, а в России нет.
Причем эти книги являются лучшими не столько по содержанию, сколько по оформлению. Невооруженным глазом видно, что все они сделаны в Латехе с активным использованием пакета TikZ. В результате у меня сложилось чувство, что связка Латех--TikZ наилучший способ создать книгу, оформленную на лучшем мировом уровне. Именно поэтому в моей книге активно использовался TikZ (даже там, где можно обойтись и без него).

1.6 Идеальная книга будущего
Хотелось бы порассуждать об идеальной книге будущего. То есть от том, куда неизбежно придёт (ну должно прийти) научное издательское дело. То есть о том, к чему нам, учёным, надо стремиться для повышения своей конкурентноспособности и привлекательности.
Естественно, книга будущего существовать в двух вариантах: бумажном и электронном. Кроме того, она будет цветной. Причем цветом будут выделяться не только рисунки.
Чёткое современное разделение содержимого на текст, рисунки, таблицы и формулы уйдёт в прошлое. Например, есть потребность в стрелочках, которые связывают какие-то места в текстах, рисунках, таблицах и.т.д. Почему надо разделять рисунки и таблицы? Почему я не могу разместить рисунки внутри таблицы или наоборот? Разве не удобнее иногда иметь смесь из них?
На рисунке 1 показаны две страницы моей книги (Интернет-версия), чтобы было понятно, что текст и рисунок могут плавно перетекать друг в друга.


Рис. 1. Пример оформления моей книги. Показано перетекание таблицы в рисунок

Другие идеи, навскидку.
1) Ссылки на формулы, рисунки, таблицы, главы и т.д. выделяются шрифтом и цветом (и, естественно, должна быть гиперссылкой).
2) Каждая глава имеет свой аватар. Аватары различаются цветом. На каждой странице на полях показан аватар и номер главы.
3) Краешек страницы рядом с аватаром окрашен в цвет аватара так читателю удобнее искать нужную главу. Эта идея используется во многих каталогах и справочниках.
4) А, может быть, из Интернета в научные тексты переберутся спецсимволы. Например, смайлики то есть символы, выражающие эмоции.
Когда-то давно мои преподаватели-математики использовали чёрный квадратик в конце доказательств теорем вместо фразы "что и требовалось доказать". Почему бы не возродить?
5) Наконец, очень отдалённое будущее: электронная версия книги может содержать картинки с анимацией. Причём это далеко не фантастика: эта возможность уже сейчас есть в том же TikZ.

Конечно, все эти мечты расцветали в моей голове только до встречи с живым редактором, который считает все это дорогой и ненужной блажью, но это уже другая тема.

1.7 Про компиляторы, редакторы, диалекты Латеха
Это очень большая и больная тема.
Я использую связку Windows/MikTeX/WinEdt (=ОС/компилятор/редактор), но даже в рамках этой связки есть большой выбор версий.
Редактор WinEdt я считаю лучшим (хотя иногда пользуюсь и TexStudio), но и он после версии 5.6 стал эволюционировать в неприятную для меня сторону (взлом WinEdt я здесь не описываю, но это не проблема для любой версии).
Например, потому, что я консервативен и подслеповат, поэтому признаю только свою расцветку синтаксиса, а не ту, которую предлагает создатель WinEdt, см. рис. 2 и рис. 3.


Рис. 2. Расцветка синтаксиса в WinEdt v.10


Рис. 3. Здесь будет моя расцветка синтаксиса в WinEdt v.5.6

Но главная неприятность новые компиляторы делают вид, что умеют работать с 8-мибитным шрифтами в кодировках типа UTF-8, для чего разработаны и активно внедряются диалекты типа LuaLatex, XeLatex, и др. Кажется прогрессом, что эти новые диалекты умеют создавать текст с любыми шрифтами, хоть со старославянскими. Но сколько тут издержек
Одна из моих главных претензий если я перенесу из Интернета какой-нибудь текст, то там наверняка будет смесь кодировок, часть символов мне редактор не покажет, а компилятор выдаст ошибку, которую будет трудно найти.
Для русскоязычного текста я признаю только 7-мибитные шрифты и кодировку ANSI/Windows1251, а тексты из Интернета переношу не напрямую, а через какой-нибудь упрощённый редактор (например, Notepad++), в котором можно все кодировки настроить, как надо.
И только под самый конец, занимаясь окончательным форматированием текста, можно перейти на UTF-8. Это большая работа.
Единственное простое улучшение шрифта Латеха, никак не влияющее на форматирование текста, это переход с CM на CM-super.

Напоминаю, что всегда можно поиграть с настройками форматирования, например,
\clubpenalty=400   % Эти числа -- разрешение на запрет висячих строчек. Подразумеваемость = 300, абсолютный запрет = 10000.\widowpenalty=400  %% Увеличиваем эти числа до тех пор, пока не начнет увеличиваться количество страниц.\righthyphenmin=2 % сколько букв можно переносить. Если используется Babel, то команда немного другая.\tolerance=500   %max=10000, default=200 (выбор между разрежением и переполнением).% лучше разрядить, чем переполнить!\looseness=-1 % иногда можно удлинять страницу на одну строку.\hfuzz=2.5pt % иногда можно вылезти за край строки на 2.5 pt.


Глава 2. Свои стандарты


2.1 Советы начинающему автору
Вот список основных советов начинающему автору большого текста. Большой текст это текст, который очень утомительно листать, его можно править только командами поиска и замены.
Как выразились бы военные люди, каждый совет написан кровью. Ну ладно, не кровью Но затраченное время, нервы, головная боль, и т.д. Сначала кажется, что потом будет время всё поправить. А потом окажется. что работы по переделке книги под вкусы редакции это очень времязатратное дело.
2.1.1 Узнайте формат страницы Вашей будущей книги и с самого начала внесите его в преамбулу. Это избавит Вас от мучительного переформатирования. С самого начала задайте в преамбуле конечный макет страницы (размеры колонтитулов, полей, и т.д.), а также размер и вид шрифта. Это тоже сэкономит вам время потом.
Например, формат моей книги 70x100 1/16, и поэтому в преамбуле стоят такие настройки:
\special{papersize=170mm,240mm}\textheight 187mm % 200-(12+25)*0.35146 = 186.99598\textwidth 130mm\headheight13.6pt % = 0.48 mm\oddsidemargin -5.4mm\evensidemargin -5.4mm\topmargin -5.4mm\usepackage{setspace}\singlespacing

здесь команда
\singlespacing
задаёт во всём документе одинарный интервал, а сама является частью пакета setspace.
Понимать это надо так. Поля, сверху и снизу, равны 20 мм. Поэтому доступна площадь 130*200 мм. Запись
\topmargin -5.4mm
означает, что расстояние от верхнего края колонтитула h до верхнего края страницы равно h= = 1 дюйм + topmargin = 2 см, что и требуется. Ширина текста равна 130 мм, а вот из высоты 200 мм надо вычесть высоту колонтитула (headheight) и расстояние от колонтитула до текста (headsep).
Подразумевается, что есть ещё три команды:
\voffset=0 \headheight12pt \headsep25pt % 1 pt = 0.3528 мм

и общая формула:
240= y-papersize = 2*(2.54 см + topmargin) + y-textheight + headheight + headsep = 40+ 186.99598 + (12+25)*0.35146 мм.
Всё, казалось бы, понятно. Но компилятор на каждой странице выдаёт сообщение:
Package Fancyhdr Warning: \headheight is too small (12.5pt):
Make it at least 13.59999pt.
We now make it that large for the rest of the document.
This may cause the page layout to be inconsistent, however.

Значит, переделываем, теперь
\headheight13.6pt
.
Полезно помнить, что родные, то есть встроенные шрифты Латеха это 10, 11 и 12 пт. Для получения других размеров нужно подключать специальные пакеты. Я хотел, чтобы шрифт был поменьше, чтобы на страницу влезло побольше текста. Но в в редакции мне сказали, что латеховский шрифт 11 пт смотрится как 10.5 пт в редакторе Microsoft Word. И поэтому я выбрал 11 пт. А зря. Надо было 10 пт, как делают в большинстве издательств за границей.

Большое серьезное издательство имеет свой стиль, и тогда автору не надо думать, но к России это (обычно) не относится.
Написал, и подумал, что это может быть хорошо, что наши редко выпендриваются со своим стилем. Совсем недавно посылал статью в журнал AIP Conference Proceedings, его стиль документа
\documentclass[aip,cp,amsmath,amssymb,reprint]{revtex4-2}
, и получаю ответ: " Ваше оформление не соответствует Электронные адреса должны быть сразу после фамилий авторов, а не в сносках..."
А как он может не соответствовать, если и стиль, и шаблон документа я взял у них на сайте?
В ходе переписке со службой поддержки выяснилось, что, как они считают, у меня какие-то пакеты устарели, и поэтому мне лучше компилировать свои статьи у них на сайте, служба www.overleaf.com/latex
Я, во-первых, терпеть не могу эти модные попытки упростить мой компьютер до интерфейса к программам, расположенным у них в Интернете, a во-вторых, каким надо быть креативным, чтобы привязать стиль статей к каким-то глубоко запрятанными настройками моего компилятора?
Меняйте стиль журнала (cp), меняйте стиль издательства (revtex4-2), но зачем делать их зависящими от компилятора ?!

2.1.2 Выбор шрифта
Шрифт в редакторе обязательно должен быть моноширинный (Consolas, Lucida Console, Courier, Courier New, ), а редактор текста должен легко переходить между блочным и строчным режимами. Это позволяет, переставлять колонки в таблицах, если они правильно приготовлены.
Другой пример. Когда мне нужно оставить для компиляции только один файл (одну главу из двадцати), я выделяю столбец из знаков % и переношу его в начало абзаца. Потом руками убираю знак % перед нужным мне файлом, и в результате все файлы оказываются комментариями, кроме нужного.
2.1.3 У человека хорошо работает зрительная память. Он узнает знакомые места в тексте и грех не пользоваться этой способностью. Поэтому мой стандарт: одно предложение = один абзац. Никакого автоматического выравнивания строк (отключить Wrap). В результате расположение текста в строке не изменится, если я что-то изменю в предшествующих предложениях.
2.1.4 Имя файла с рисунком должно совпадать с его меткой. Это удобно, и, кроме того, экономит одну переменную в макросе, вызывающим рисунок.
2.1.5 Имя статьи составляется по стандарту. Страшно удобно, но на вкус и цвет товарищей нет.
Мой стандарт: ссылка Purcell46_681 означает (автор)-(год публикации)-(номер страницы).
2.1.6 Раскраска синтаксиса. Для меня это почему-то очень важно.Пример моей раскраски и стандартной раскраски WinEdt показаны на рис. 2.
Раскраска синтаксиса от производителя WinEdt убога, и никак не соответствует моим вкусам.
Правильные (мои) принципы раскраски состоят в следующем:
комментарии: бледный наклонный текст на сером фоне.
текст ссылок (\ref, \cite): яркий фон, но разный для ссылок на литературу и уравнения
скобки: жирный шрифт, яркий фон, задняя скобка должна быть подчеркнута.
латеховские команды (\begin ): светлый фон.
служебные символы ($, _, ): жирные и выделяются в тексте цветом,
конец строки в таблице (\\) жирный белый на черном фоне.
2.1.7 Простейшая "правильная" структура книги это две директории: одна для текста книги, другая это мастерская для изготовления векторных рисунков в пакете TikZ.
Внутри каждой есть поддиректория \Figs для готовых рисунков.
Про мастерскую в этой статье я рассказывать не буду.

Глава 3. Свои обозначения


3.1 Малые замены
которые я привык называть макросами, хотя это, вероятно, неправильно.
Когда-то, лет 30 назад, я был сильно впечатлён тем, что я могу набивать математические формулы с пулеметной скоростью, не глядя на монитор. Мне и сейчас это нравится. Но особенно полюбил я набивать тексты, используя свои обозначения. Все они, само собой, собраны в файле с преамбулой.
Всегда ли можно ввести аббревиатуры? Да нет, к сожалению, не всегда. Многие из них компилятор понимать не хочет. Например, я пока не нашел аббревиатуры для страшно полезных окружений типа
\begin{split}--\end{split}, \begin{align}--\end{align}
и т.д.
Простейшие примеры.
\newcommand*{\BE}{\begin{equation}} %\newcommand*{\EN}{\end{equation}} %\newcommand*{\BEA}{\begin{subequations} \begin{eqnarray}} %\newcommand*{\ENA}{\end{eqnarray} \end{subequations}} 

Набивать текст вроде
\begin{equation}
очень лень.Поэтому я давно ввел аббревиатуру \BE. Почему с большими буквами? До потому что лет 30 назад досовский Латех (=EmTex) с маленькими буквами работать не захотел.
\newcommand*{\hs}{\hspace*{\parindent}}

В английском языке первый абзац начинается без красной строки. Чтобы отменить это правило, обычно используется команда \hs
\newcommand*{\nn}{\nonumber}

Отмена автоматической нумерации формулы
\newcommand*{\ea}{{\it et al\/}\xspace}

Для списка авторов, аналог русского и др. Особенно полезно, если вам хочется аббревиатуру et al напечатать курсивом. Обратите внимание на команду \xspace, она разбирается, нужно ли делать пробел (если дальше идут слова) или не нужно (если дальше идут знаки препинания).
Если вы часто пишите химические формулы, то подходят замены типа
\newcommand*{\1}{$_1$}\newcommand*{\2}{$_2$}\newcommand*{\3}{$_3$}\newcommand*{\4}{$_4$}\newcommand*{\5}{$_5$}\newcommand*{\6}{$_6$}\newcommand*{\7}{$_7$}\newcommand*{\8}{$_8$}\newcommand*{\9}{$_9$}

Например, вместо C$_2$H$_5$OH я пишу C\2H\5OH. Это чуть-чуть быстрее.
Для вставки текста в математические формулы я использую
\newcommand*{\T}[1]{\text{#1}}

В моей науке часто используются волновые числа (это единицы измерения частоты, они равны обратным сантиметрам),
\newcommand*{\ic}{cm $^{-1}$\xspace}

Были времена, когда я сокращал буквально все. Например, если мне было лень писать слова типа "photodissociation", я вводил аббревиатуру \pd.
Если надо писать числа, то я понаделал сокращений типа
\newcommand*{\po}[1]{$\times \! $10$^{#1}$} % *10(-n)\newcommand*{\vp}[2]{#1$ \times \! $10$^{#2}$\xspace} % v*10(n)\newcommand*{\ve}[2]{#1$\pm$#2\xspace} % v+-e\newcommand*{\vep}[3]{$(#1 \pm #2)\times \! 10^{#3}$\xspace} % (v+-e)*10^n

Например, \vep это число v с погрешностью e, помноженное на 10 в степени p, т.е. (v+-e)*10^p.

3.2 Обращение к таблицам и рисункам
Немножко о другом: латеховское обращение к ссылке \ref не различает рисунки, таблицы, разделы, и т.д. Когда их очень много, это раздражает.

3.3 Большие замены
Постепенно выработался стиль для сложных манипуляций никогда не использовать латеховские стандарты напрямую, а только через макросы.
Вот макрос для создания рисунка, который обтекается текстом:
\newcommand*{\EpsWrapD}[7]{%\begin{wrapfigure}[#5]{#3}{#2 \textwidth} % #3=l,r,L,R\begin{center} \sffamily\includegraphics*[width= #2 \textwidth ]{#1} % 1-имя файла и метка заодно,% 2-ширина рисунка (доля от ширины страницы)\vspace{-#7mm} % #7: сократить расстояние между подписью снизу и рисунком\caption{\label{fig:#1}#4} % #4 - подпись под рисунком\vspace{-#6pt}\end{center}% #6: сократить расстояние между подписью снизу и текстом после таблицы \end{wrapfigure}}

Вот макрос для создания таблицы, который обтекается текстом:
\newcommand*{\TableBE}[5]{\begin{table}[#1] %\captionabove\vspace*{-#5mm}\centering \sffamily \caption{\label{tab:#2}#3} \begin{tabular}{#4} \toprule }\newcommand*{\TableEN}[3]{\bottomrule \end{tabular}\vspace{-#2mm} \small \begin{flushleft} #1 \end{flushleft}\vspace{-#3mm}\end{table}}

А вот текст простой таблицы
\TableBE{H}{RS_Ham_2pi}{\TableBE{H}{RS_Ham_2pi}{Гамильтониан линейной молекулы в состоянии $^2\Pi $}{G LL}{2} $^2\Pi $ }{G LL}{2}\CR & |^2\Pi_{1/2} JM_J \pm \rangle & |^2\Pi_{3/2} JM_J \pm \rangle \\\midrule|^2\Pi_{1/2} JM_J \pm \rangle & B[J_{\perp}^2+1] -A/2 & -B J_{\perp} \\|^2\Pi_{3/2} JM_J \pm \rangle & -B J_{\perp} & B[J_{\perp}^2-1] +A/2 \\\TableEN{}{0}{0}

и ее откомпилированный вид:


Макрос \TableBE имеет 5 переменных:
#1) как и где поставить таблицу. Напрмер, h="хотелось бы таблицу здесь",
h!="очень хочу таблицу здесь", H="хочу таблицу именно здесь и баста",
t!=поместить таблицу вверху страницы и т.д.
#2) ссылка на таблицу,
#3) заглавие таблицы,
#4) Описание столбцов. Например, {G LL} означает: выравнивание по левому краю, математическая мода, первый столбец подкрасить.
#5) Эстетство: иногда хочется уменьшить расстояние между заголовком и таблицей.
Макрос \TableEN имеет 3 переменные:
#1) текст под таблицей.
#2) Эстетство: иногда хочется уменьшить расстояние между текстом и таблицей.
#3) Эстетство: иногда хочется уменьшить расстояние между таблицей и последующим текстом.

Часто бывает удобно создавать семейства макросов. Например, у меня есть главный макрос для вставки рисунка в текст.
\newcommand*{\RisEpsLarge}[7]{\begin{figure}[#5] \begin{center}\includegraphics*[width= #2 \textwidth,#6]{#1} %#6: scale=2, bb=10 20 100 200\vspace{-#3mm}\sansmath\caption{ \label{fig:#1}#4}\vspace{-#7mm}\end{center} \end{figure}}

У него 7 параметров, для меня это много. Поэтому я создал семейство макросов, показанное ниже. Основная идея уменьшить количество параметров, чтобы можно было как можно меньше думать при создании таблицы. Читатель легко догадается, что они отличаются правилом расположения рисунка и его поворотом на +-90 градусов (иногда это нужно, потому что эта умная бестолочь, Латех, имеет свои представления, как поворачивать рисунки).
\newcommand*{\RisEpsPos}[5]{\RisEpsLarge{#1}{#2}{#3}{#5}{#4}{angle=0}{0}}\newcommand*{\RisEps}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{!tbhp}{angle=0}{0}}\newcommand*{\RisEpsTop}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{!t}{angle=0}{0}}\newcommand*{\RisEpsBot}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{!b}{angle=0}{0}}\newcommand*{\RisEpsPlace}[5]{\RisEpsLarge{#1}{#2}{#3}{#5}{#4}{angle=0}{0}}\newcommand*{\RisEpsRot}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{tbhp}{angle=90}{0}}\newcommand*{\RisEpsRotTop}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{!t}{angle=90}{0}}\newcommand*{\RisEpsRotBot}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{!b}{angle=90}{0}}\newcommand*{\RisEpsRotBotPlace}[5]{\RisEpsLarge{#1}{#2}{#3}{#5}{#4}{angle=90}{0}}\newcommand*{\RisEpsRotClock}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{tbhp}{angle=-90}{0}}\newcommand*{\RisEpsRotClockTop}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{!t}{angle=-90}{0}}\newcommand*{\RisEpsRotClockBot}[4]{\RisEpsLarge{#1}{#2}{#3}{#4}{!b}{angle=-90}{0}}\newcommand*{\RisEpsRotClockBotPlace}[5]{\RisEpsLarge{#1}{#2}{#3}{#5}{#4}{angle=-90}{0}}

Наконец, в примере к этой статье используется макрос для вставления таблицы в текст
\WrapTableBE<\source>:<source lang="tex">\newcommand*{\WrapTableBE}[6]{\renewcommand{\baselinestretch}{0.75}\small\normalsize\begin{wraptable}{#1}{#5\textwidth} \sffamily\begin{center} \vspace*{-#6mm}\caption{\label{tab:#2}#3} \begin{tabular}{#4} \toprule }% #1 : l, r #2 : label #3 : caption #4 : cc|cc|rr|ll #5 : 4 #6: 5% вставить в текст таблицу, окончание\newcommand*{\WrapTableEN}[2]{\bottomrule \end{tabular} \end{center} \vspace{-#2pt} \small #1 \end{wraptable}\renewcommand{\baselinestretch}{1}\small\normalsize}


Глава 4. Экспорт текста в разные части книги или в другие книги


В конце каждой главы я помещаю список задач и список вопросов на экзамене. В конце книге размещены эти задачи с решениями, а также полный список экзаменационных вопросов.
Я также параллельно пишу вторую книгу "решебник", в которой приведены решения задач из учебника.Это значит, что в процессе компиляции книги происходит добавление текста в "решебник".
Таким образом, одни и те же тексты должны появиться в двух совершенно разных местах. В дальнейшем для краткости будем обсуждать только задачи с решениями в конце книги. Я хочу, чтобы условие каждой задачи было напечатано дважды, в конце главы и в конце книги перед решением.
Но я категорически не хочу иметь две версии одного и того же текста в разных местах, потому что это источник бесконечного количества ошибок. И значит, компилятор должен сам дублировать фрагменты текста, копируя их в разные места разных книг.
Как я решаю эту задачу. В конце преамбулы у меня стоит команда:

\usepackage{newfile} % загрузить пакет newfile\newoutputstream{ZO} % создать поток по имени ZO\openoutputfile{Zadachi.tex}{ZO} % направить поток в файл по имени Zadachi.tex\newcommand*{\PutNumberZO}{\addtostream{ZO}{$\{$\thechapter.\theenumi$\}$}} % в файл Zadachi.tex % добавить номер главы и номер задачи.

Она открывает файл Zadachi.tex и во время компиляции направляет туда текстовый поток.
Файл Zadachi.tex до начала работы пустой, а еще есть файл Zadachi_Head.tex который потом будет компилироваться, и который выглядит, например, так:
\chapter{Задачи и решения}\Epigraf{0.68}{Отплякиваясь от сурых пляк, каждый хамсик шмыряет на глын по 5 гнусиков. Сколько гнусиков шмырнут на глын 12 гнусиков, отплякивающихся от сурых пляк?}{"Задачи по математике"\ , Г.Остер}\bigskip\input{Zadachi}\endinput   После компиляции всех глав идёт команда закрыть поток и начать компилировать  файл \closeoutputstream{ZO}  % закрыть поток ZO\include{Zadachi_Head} % компилировать файл Zadachi_Head.tex 


Здесь появился новый пакет clipboard, который имеет всего четыре команды:
\newclipboard{myclipboard}
открытие файла myclipboard.cpy для записи,
\openclipboard{myclipboard}
открытие файла myclipboard.cpy для чтения,
\Copy{item_name}
запись в файл myclipboard.cpy фрагмента с меткой item_name,
\Paste{item_name}
чтение их файла myclipboard.cpy фрагмента с меткой item_name.
Важная особенность этого пакета запоминая фрагмент текста во внешнем файле, он не забывает откомпилировать фрагмент в исходном файле. Так возникает процедура копирования. Большой недостаток этого решения состоит в том, что мы должны сначала открыть файл myclipboard.cpy для записи, записать в него условия задач, закрыть, и только потом открыть его для чтения. Я, к сожалению, не нашёл простого способа закрыть и открыть, поэтому использую более громоздкое решение: введена булевская переменная FR (FR= First Run) значение которой при первой компиляции равно FR=true, а при последующих FR=false. И если FR=true, то файл myclipboard.cpy открывается для записи, а если FR=false, то файл myclipboard.cpy открывается для чтения.
К сожалению, перед первой и второй компиляциями надо вручную устанавливать значение переменной FR. Это неприятно, но не будет ничего страшного, если Вы забудете это делать. Если у Вас всегда будет FR=true или FR=false, то в задачнике просто не будет условия задач, что вполне допустимо при работе над текстами глав.
Мне было лень решать эту проблему, всё равно текст надо компилировать минимум трижды.

Глава 5. Работа со ссылками


5.1 Создание списка литературы
Допустим, я пишу большой обзор. Это значит, что я выдергиваю куски из своих текстов вместе с ссылками на литературу. В конце я прошу компилятор (BibTex) пересмотреть мои предыдущие списки литературы, разбросанные по файлам Bib_File1.bib, Bib_File2.bib, и т.д., используя, например, команду
\bibliography{Bib_File1,Bib_File2,...Bib_FileN}

Компилятор ссылок, конечно, сделает мне макет моего обзора, но мне этого мало.
При написании книг и обзоров очень полезно иметь продвинутый сортировщик библиографических ссылок. Для этого существует пакет bibMacros гражданина R. Schlicht. В результате установки этого пакета в меню WinEdt в разделе BibTex появятся куча команд для работы с ссылками.
В частности, я получаю возможность создать новый файл с ссылками из нового обзора, Bib_FileN+1.bib, причем по моему желанию ссылки могут быть расставлены в правильном порядке (например, в порядке упоминания в тексте, как принято в физике).
Напоминаю, что файлы типа bib содержат список литературы в виде записей вроде этой:
@article{Levchenko01_7485,year=2001, title={Electronic structure of halogen-substituted methyl radicals: excited states of {CH$_2$Cl and CH$_2$F}}, author={S{ergey} V. Levchenko and A{nna} I. Krylov}, journal=JCP,volume=115,pages=7485,numpages=10, abstract={Electronically excited states in CH2Cl and CH2F radicals are...}}


5.2 Змей Горыныч ГОСТ
Дальше у англоязычных товарищей проблем, по-моему, не бывает. А у нас, русскоязычных, есть большая головная боль. Она называется ГОСТ.
Российский ГОСТ разабатывал, несомненно, очень высокоэффективный диверсант какой-нибудь абсолютно враждебной России страны. Вот пример его творчества



Рис. 4. Змей Горыныч ГОСТ (2008).

Как видим, русскоязычный автор должен писать фамилии по два раза, лихо переставлять инициалы и фамилии и использовать пять разных стилей оформления в зависимости от количества авторов. Потренеруйтесь переставить инициалы и фамилию, например, у господ H. Ford III и W. S. Stoner Jr.
И это только книги. В статьях диверсант ввёл разные наклонные и даже двойные палочки чтобы стало так, как нету ни у кого в мире.
В диссертации, например, следование стандартам обязательно. Во всяком случае, многие соискатели так думают. В мое время, в 2008 году, пакет для форматирования по ГОСТу написал хороший человек Поляков, и я его использовал для форматирования списка литературы. Я молодец, но и белая ворона одновременно, потому что соискатели массово этот ГОСТ игнорировали. Но в стране все с тех пор только ужесточалось, так что я не знаю, как там сейчас.
А сейчас я закончил книгу, а в ней ссылки тоже должны быть отформатированы по ГОСТу. Но, как я понял, ГОСТы в диссертации и в книге разные, в книге он менее уродский. Идем в Интернет, скачиваем пакет Котельникова gost, вставляем в преамбулу строчку
\bibliographystyle{gost2008}

после чего форматируем список литератулы. Дело сделано, все ГОСТы соблюдены.
Но даже Котельников иногда ошибается. Так, в его пакете есть мелкие ошибочки.**
Например, пусть надо напечатать "Vol. 115". Правило хорошего тона состоит в том, чтобы не было разрыва строки между "Vol." и "115". А пакет Котельникова этот разрыв иногда допускает, см. рис. 5.


Рис. 5. Плохо отформатированаая запись.

5.3 Доработка напильником
Значит, надо доработать напильником (Тем более, что не только в этом месте. Авторский указатель со смесью английских и русских имен тоже.) В процессе компиляции bib-файлов создается файл P_bibs.bbl, содержащий записи типа
\bibitem{Levchenko01_7485}\selectlanguageifdefined{english}\BibEmph{Levchenko~S.~V., Krylov~A.~I.} Electronic structure of halogen-substituted methyl radicals: excited states of {CH$_2$Cl and CH$_2$F}~// \BibEmph{J. Chem. Phys.} \BibDash\newblock 2001. \BibDash\newblock Vol. 115. \BibDash\newblock P.~7485.

Так вот, находим все неправильности и исправляем их руками. В данном примере вместо "Vol. 115" делаем "Vol.~115". Этот исправленный файл прячем в укромном месте. Перед последней, окончательной компиляцией заменяем текущий файл P_bibs.bbl на исправленный, и все получится хорошо.

Глава 6. Минимальный работающий пример


6.1 Список файлов
Привожу минимальный шаблон книги, в котором можно найти перечисленные выше
идеи. В главной директории должны быть файлы:
P_main.tex % главный в проекте
P_preamble.tex % преамбула
Ch1.tex % часть 1
Ch2.tex % часть 1
Figs\P_ABC.eps % В поддиректорию Figs положите свой рисунок P_ABC.eps.
Zadachi.tex % до начала работы пустой
Zadachi_Head.tex % Заголовок части с задачами и решениями

6.2 Файлы маленькой книги, можно компилировать
Скрытый текст
% Файл P_main.tex  % главный в проекте\documentclass[10pt,twoside,openany]{book}\usepackage{etoolbox}   % this package introduces operations: \newbool,...\newbool{For_Internet}\booltrue{For_Internet}    % % Цветная книга для Интерента%\boolfalse{For_Internet}  % или черно-белая для бумаги\newbool{FR} %FR= First Run%\booltrue{FR}  %  --  make  FR = true\boolfalse{FR}  %  --  make  FR = false\input{P_Preamble}       % загрузить преамбулу\includeonly{             % какие главы включаем в книгуP_Ch1,        %%%P_Ch2,        %%%Zadachi_Head  %%%}\begin{document}         % начало документа\tableofcontents         % Оглавление\ifbool{FR}{\newclipboard{myclipboard}}{}                          % какие главы компилируем\include{P_Ch1}          %%%\include{P_Ch2}          %%%\closeoutputstream{ZO}  % закрыть поток в файл Zadachi.tex\ifbool{FR}{}{\openclipboard{myclipboard}}\include{Zadachi_Head} % загрузить Файл с задачами с решениями%\bibliography{P_Bibs}  % создать список литературы, убираем простоты ради\end{document}         % конец документа\endinput              % конец текста, дальше только комментарии%+++++++++++++++++% Файл P_preamble.tex  % преамбула\usepackage[warn]{mathtext} %(до задания inputenc, fontenc, babel)% русские буквы в формулах, с предупреждением%---- основной язык -- русский\usepackage[T2A]{fontenc}\usepackage[cp1251]{inputenc}\usepackage[english,russian]{babel}   % load Babel setup for English                                      % and Russian languages;                                      % the latter is the default.% Поскольку опция russian стоит последней, основным языком документа будет russian.%-- форматирование страницы\textheight 187mm\textwidth 130mm\headheight13.6pt\special{papersize=170mm,240mm}\oddsidemargin -5.4mm\evensidemargin -5.4mm\topmargin -5.4mm%--- стиль заполнения таблицы\clubpenalty=400\widowpenalty=400\tolerance=500  %max=10000, default=200 (выбор между разрежением и переполнением).\looseness=-1 %(можно удлинять страницу на одну строку)\hfuzz=2.5pt % можно вылезти за край строки на 2.5%--- полезные пакеты\usepackage{amssymb,amsmath} % почти стандарт Латеха\usepackage{xspace}\usepackage{enumerate} % списки\usepackage{booktabs}\usepackage[dotinlabels]{titletoc}%-- включение рисунков\usepackage{graphicx}  % Пакет для включения рисунков%\usepackage[dvips]{color} % есть цветные фотографии!\graphicspath{{figs/}} % В этой директории хранятся все рисунки *.eps,\usepackage[usenames,dvipsnames]{xcolor,colortbl}%--- мой цвет для таблиц, и для ссылок на рисунки и формулы\definecolor{lightcyan}{rgb}{0.88,1,1} % обычно: ( 0.88, 1, 1)\ifbool{For_Internet}{\newcolumntype{g}{>{\columncolor{lightcyan}}c}}%{\newcolumntype{g}{>{\columncolor{light-gray}}c}}\newcommand*{\red}[1]{\textcolor[rgb]{1.00,0.00,0.00}{#1}}\newcommand*{\blue}[1]{\textcolor[rgb]{0.00,0.00,1.00}{#1}}\ifbool{For_Internet}%{\renewcommand{\thetable}{\red{{\it\arabic{chapter}.\arabic{table}\,}\normalfont}}}%{\renewcommand{\thetable}{{\it\arabic{chapter}.\arabic{table}\,}\normalfont}}\ifbool{For_Internet}%{\renewcommand{\thefigure}{{\blue{\bfseries{\arabic{chapter}.\arabic{figure}}\normalfont}}}}%{\renewcommand{\thefigure}{{\bfseries{\arabic{chapter}.\arabic{figure}}\normalfont}}}% Чтобы окрасить названия глав в оглавлении \ifbool{For_Internet}{ \titlecontents{chapter}[1.8em] % distance to page margin   {\vspace{3mm} \bfseries\color{blue}} % \sffamily   {\contentslabel[\thecontentslabel. ]{1.5em}} % distance between 1. and Title of chapter   {\hspace*{-2.3em}}{\color{blue}   {\titlerule*[1pc]{}\contentspage}\color{blue}}[\vspace{0.5mm}] }{}\definecolor{light-gray}{gray}{0.95}\ifbool{For_Internet}{\newcommand*{\CR}{\rowcolor{lightcyan}}}%{\newcommand*{\CR}{\rowcolor{light-gray}}}%---- оформление ссылок в виде \label{fig:name} \fref{fig:name}\usepackage[vario]{fancyref} % plain is also possible\renewcommand*{\fancyrefdefaultspacing}{\fancyreftightspacing}\frefformat{vario}{\fancyreffiglabelprefix}{\bfseries{#1}\normalfont }\frefformat{vario}{\fancyreftablabelprefix}{\textit{#1}\normalfont}\frefformat{vario}{\fancyrefenumlabelprefix}{\textrm{#1}\normalfont}% Если это убрать, то пакет fancyref начинает вставлять много отсебятины.%--- мои макросы\newcommand*{\mb}[1]{\mbox{\boldmath$#1$}}  % жирный мат. курсив\newcommand*{\BE}{\begin{equation}}        %\newcommand*{\EN}{\end{equation}}          %\newcommand*{\BEA}{\begin{subequations} \begin{eqnarray}} %\newcommand*{\ENA}{\end{eqnarray} \end{subequations}}   %\newcommand*{\hs}{\hspace*{\parindent}}    %\newcommand*{\nn}{\nonumber}        %\newcommand*{\1}{$_1$}\newcommand*{\2}{$_2$}\newcommand*{\3}{$_3$}\newcommand*{\4}{$_4$}\newcommand*{\5}{$_5$}\newcommand*{\6}{$_6$}\newcommand*{\7}{$_7$}\newcommand*{\8}{$_8$}\newcommand*{\9}{$_9$}%\newcommand*{\T}[1]{\text{#1}}%\newcommand*{\vep}[3]{$(#1 \pm #2) \times \! 10 ^{#3} $\xspace} % (v+-e)*10^n%\newcommand*{\ic}{см$^{-1}$\xspace}                 % inverse centimeters%----  Переопределение математических символов в русских традициях\renewcommand{\le}{\leqslant}\renewcommand{\leq}{\leqslant}\renewcommand{\ge}{\geqslant}\renewcommand{\geq}{\geqslant}%---- вставить простую таблицу\newcommand*{\TableBE}[5]{\begin{table}[#1] %\captionabove\vspace*{-#5mm}\centering \sffamily \caption{\label{tab:#2}#3} \begin{tabular}{#4} \toprule }\newcommand*{\TableEN}[3]{\bottomrule \end{tabular}\vspace{-#2mm}  \small \begin{flushleft}  #1 \end{flushleft}\vspace{-#3mm}\end{table}}%---- вставить в текст таблицу%  начало\newcommand*{\WrapTableBE}[6]{\renewcommand{\baselinestretch}{0.75}\small\normalsize\begin{wraptable}{#1}{#5\textwidth} \sffamily\begin{center} \vspace*{-#6mm}\caption{\label{tab:#2}#3} \begin{tabular}{#4} \toprule }% #1 : l, r   #2 : label   #3 : caption  #4 : cc|cc|rr|ll  #5 : 40mm% вставить в текст таблицу, окончание\newcommand*{\WrapTableEN}[2]{\bottomrule \end{tabular} \end{center} \vspace{-#2pt} \small #1  \end{wraptable}\renewcommand{\baselinestretch}{1}\small\normalsize}%---- вставить рисунок внутрь текста\usepackage{wrapfig} % нужен для RisEpsRight\newcommand*{\EpsWrapD}[7]{%\begin{wrapfigure}[#5]{#3}{#2 \textwidth} %\begin{center} \sffamily\includegraphics*[width= #2 \textwidth ]{#1}\vspace{-#7mm}\caption{\label{fig:#1}#4}\vspace{-#6pt}\end{center}\end{wrapfigure}}%---- потоки в другие файлы\usepackage{clipboard} % It is used to |copy and \HL\Paste the texts with tasks\usepackage{newfile}\newoutputstream{ZO}\openoutputfile{Zadachi.tex}{ZO}\newcommand*{\itemZO}[2]{\item  \label{enum:#1}%\Copy{#1}{\emph{\ifbool{For_Internet}{\blue{ #2 }}{#2}}}%\addtostream{ZO}{$\{$\thechapter.\theenumi $\}$}}\endinput%+++++++++++++++++% Файл \Ch1.tex  % глава 1\chapter{\label{ch:Chast1}Про сжатие текста}\section{Маленькие рисунки}\hs   Латех охотно отдаёт под плавающий объект (рисунок, таблицу) целые строчки, но очень не любитобтекание плавающих объектов текстом.   Печальный факт состоитьв том, что вписать в текст рисунок с подписьюснизу или сверху в Латехе до сих пор проблема.   Это делают пакеты wrapfig и floatflt, но оба капризны.   Так что выбор есть, но он плохой.   Если вы видите маленький красивый векторный рисунок иподпись к нему расположена слева или справа,так что рисунок и подпись занимают всю ширину страницы,то знайте -- это фирменный стиль пакета TikZ.%   Люблю его, как тёщу.  То есть совсем не очень.   Одна из его поганых особенностей состоит в том, что получение pdf-файлапо схеме tex$\to$dvi$\to$ps$\to$pdf очень сильно отличаетсяот результатов, полученных по схеме tex$\to$dvi$\to$pdf.\section{Как форматировать текст}\hs   Представим себе, что вам нужно ужать текст.   Например, чтобы убрать висящую в начале страницы строку, после которой начинается новая глава.   Пример внизу показывает один из полезных трюков -- разное размещение индексов в знаке суммы.   Заодно показано введение текста в формулу в математической и в текстовой моде.\BEA   \sum_{\varkappa=0,...}(1/2)^{\varkappa} \leq {\mb 2}, & \T{скобка справа от text, $e^x$, \vep{2}{1}{3}   },\\   \sum\nolimits_{\phi=0,...}(1/2)^{\phi} \le {\mb 2},   & {\text скобка слева от text, \tg(x) }.\ENA\section{Задачи к главе \thechapter}\begin{enumerate}[$\{$\thechapter.1$\}$]\begin{writeverbatim}{ZO}\section{Задачи и решения к главе~\ref{ch:Chast1}}\end{writeverbatim}%---------------------\itemZO{Zadacha11}{Докажите, как физик физику, что $f= \int_0^{\infty} \cos(x/a) \; dx =0$.}\begin{writeverbatim}{ZO}\Paste{Zadacha11}\smallskip\\\hs   Доказательство.   Пусть математики думают, что $f = \lim_{R \to \infty} \sin(R/a) = ??$, это их дело.   А мы добавим какую-нибудь физическую причину, меняющую определение:\BE \nnf = \int_0^{\infty} e^{-bx}\; \cos(x/a) \; dx = \frac{b}{b^2+1/a^2}.\EN   Теперь надо перейти к частным случаям.   Например, пренебречь физической причиной, положив  $b=0$.   Получим $f = 0$, что и требовалось доказать.\end{writeverbatim}\end{enumerate}%+++++++++++++++++% Файл \Ch2.tex  % глава 2\chapter{\label{ch:Chast2}Про букву ё и кавычки}\section{Передохнём или передохнем?}\hs   Для тех, кто протестует против ничем не заслуженной дискриминации буквы \emph{ё},есть специальная программа Yo.   Скачайте её и вы сможете ёфицировать свой текст!   Долой дискриминацию буквы \emph{ё}!\section{Русские кавычки}\hs   В английском языке приняты одинарные и двойные кавычки в виде ... и ....   В России приняты французские (...) и немецкие (...) кавычки, они называются ёлочки и лапки соответственно.\WrapTableBE{r}{C2_parties}{Ответы политпартий на вопросы}{g llll}{0.3}{8}\CR   & I  & II  & III  & IV   \\\midruleЕдРо  & 0 & 0 & 1 & 1  \\ЛДПР  & 1 & 1 & 0 & 1  \\КПРФ  & 0 & 1 & 1 & 0  \\\WrapTableEN{I, II, III, IV -- номера вопросов, 0 и 1 -- ответы (да, нет)}{5} %%   Лапки используются внутри ёлочек (Что тебе снится, крейсер Аврора).   Для набора лапок можно использовать команды \verb|\glqq|  и \verb|\grqq|,а для ёлочек -- \verb|\flqq|  и \verb|\frqq|.   Они определены в пакете babel.   Но это не обязательно.   Например, лапок на клавиатуре нет, а скопировать их откуда-нибудь можно и компилятор их понимает.\section{Задачи к главе \thechapter}\begin{enumerate}[$\{$\thechapter.1$\}$]\begin{writeverbatim}{ZO}\section{Задачи и решения к главе~\ref{ch:Chast2}}\end{writeverbatim}%---------------------\itemZO{Zadacha21}{В табл.~\fref{tab:C2_parties} показаны ответы на важные вопросы трёх политических партий.   По этим ответам можно вычислить коэффициенты антикорреляции (КА) между любыми двумя партиями, $0 \le$КА$\le 1$.   Всегда ли можно нанести эти партии на плоскость в виде трёх точек, чтобы расстояние между любыми двумя партиями было пропорционально КА между ними? }\begin{writeverbatim}{ZO}\Paste{Zadacha21}\hs\EpsWrapD{P_ABC}{0.28}{r}{Три партии}{8}{0}{6}   Ответ.   Для построения треугольника нужно, чтобы выполнялось неравенство треугольника $a+b \ge c$, где($a,b,c$) -- любая выборка из трёх длин, см. рис. \fref{fig:P_ABC}.   Представим себе крайний случай -- у одной партии все нули, а у другой все единицы.   Расстояние между ними равно 1.   Тогда у третьей партии сумма коэффициентов будет тоже равна 1, то есть она располагаетсяна отрезке, соединяющем первые две партии.   Все остальные ситуации проще.\end{writeverbatim}\end{enumerate}\endinput% Программа (TikZ) для этого рисунка:\tikzsetnextfilename{P_ABC}\begin{tikzpicture}\coordinate(a) at (1,0);\coordinate(b) at (-1.3,0);\coordinate(c) at (0,1);\draw[very thick] (a) --node[below]{$a$} (b)--node[above left]{$b$} (c)--node[above right]{$c$} (a);\shade[ball color=blue] (a) circle(0.3) node[below=3mm]{ЛДПР};\shade[ball color=red]  (b) circle(0.4) node[below=4mm]{КПРФ};\shade[ball color=green](c) circle(0.5) node[above=5mm]{ЕдРо};\end{tikzpicture}%+++++++++++++++++% Файл Figs\P_ABC.eps  % рисунок, поставьте какой-нибудь свой%+++++++++++++++++% Файл Zadachi.tex до начала работы пустой%+++++++++++++++++% Файл Zadachi_Head.tex % Заголовок части с задачами и решениями\chapter{\label{ZiR_Open} Решения задач}\input{Zadachi}\endinput


6.3 Результат компиляции этих файлов





Примечания
* Я считаю лучшим русскоязычным учебником по Латеху книгу Чеботаева и Котельникова
"LaTeX по-русски&quot, см., напрмер, здесь: studlab.com/pdf/book/LaTeX-po-russki.pdf. Насколько я знаю, срок авторских прав на неё уже истек, и теперь ничто не мешает читателям скачать бесплатную электронную версию.

** Я сообщил об этом И. Котельникову, он обещал исправить.

(Продолжение может быть а может и не быть)
Подробнее..
Категории: Физика , Latex

Из песочницы GitHub Actions и LaTeX поднимаем, заливаем

22.08.2020 14:05:15 | Автор: admin
В этой статье мы настроим пайплайн в GitHub для автоматической сборки pdf-файлов и последующей выкладки в Releases. Также поднимаем небольшой сайт-визитку с ссылкой на самые свежие сборки.

Материал будет полезен новичкам и тем, кто хочет быстро поднять CI/CD для latex встренными средствами GitHub.

Вступление


Просматривая на днях репозиторий со своим CV (я делаю его в latex, благо, есть много шаблонов), я подумал, что было бы неплохо организовать некое единое место, где всегда лежит актуальная версия документа.

Основные требования были просты:

  1. Минимальными усилиями поднять сайт с релизами;
  2. Сделать обновления контента на сайте автоматическим.

В голове нарисовалось решение в виде пайплайна:

  1. Push коммита на GitHub;
  2. Сборка .tex-файлов в CI/CD;
  3. Отправка собранных pdf в GitHub releases;
  4. Обновление pdf-файлов на сайте-визитке.

В этой статье мы рассмотрим подробнее каждый шаг. В качестве сайта будет использоваться GitHub Pages. Для CI/CD будем использовать GitHub Actions.

Нам понадобится:

  • Аккаунт на GitHub;
  • Инструменты для компиляции LaTeX;
  • Любой текстовой редактор (я использую VIM, настроенный на latex);

Поехали!

Подключаем GitHub Actions


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

Заходим в Actions (подчеркнуто красным).


и находим там карточку Simple workflow, где нажимаем кнопку Set up this workflow


Перед нами откроется редактор с шаблоном workflow. На этом моменте стоит остановиться поподробнее.

GitHub Actions работает с Workflow, которые описываются в отдельных файлах. Каждый workflow состоит из:

  1. Имени (секция name: );
  2. Условия запуска (секция on: );
  3. Списка задач на выполнение (секция jobs: )

Каждая задача (job) тоже состоит из кусков поменьше, называемых step. Каждый step это атомарное действие (выполняемое полностью за раз). При этом step имеет свое имя (name: ) и список команд (run: ), а также может использовать уже готовый action (uses: ) от сторонних разработчиков.

Сторонние actions это самая мощная часть GitHub Actions. Они могут делать многие вещи: устанавливать JDK, запускать python-тесты в tox и многое другое. В данном мануале мы будем использовать xu-cheng/latex-action@v2 для компиляции latex (с ним не возникло проблем с кириллицей) и actions/upload-artifact@v2 для загрузки артефактов.

Вернемся к нашему редактору. Предложенный шаблон можно подправить, приведя его к виду:

name: Build and deploy latex sources to GitHub Pageson: pushjobs:build:# Базовая ОС, на которой будут исполняться команды. Оставим ubunturuns-on: ubuntu-lateststeps:# Необходимо использовать этот action, чтобы получить содержимое репо- uses: actions/checkout@v2# Компилируем документ- name: Build documentuses: xu-cheng/latex-action@v2with:# Переименуйте, если у вас другой файлroot_file: main.tex# Больше параметров в офф. документацииworking_directory: latex_sources/# Аргументы, к которыми запускать компилятор (latexmk)# -jobname=<name> дает возможность поменять имя выходного файлаargs: -jobname=my_doc -pdf -file-line-error -halt-on-error -interaction=nonstopmodecompiler: latexmk# Загружаем собранные pdf-файлы- name: Upload pdf documentuses: actions/upload-artifact@v2with:# Это значение используется как ключ в хранилищеname: my_doc# Путь до собранного pdf. Может содержать *, **# Здесь это <working_directory>/<jobname>.pdfpath: latex_sources/my_doc.pdf

Сохраните это в файл, название файла выберете любым (можно latex.yml). После того как закоммитите создание файла в веб-редакторы, на GitHub Actions должен должна пойти первая сборка, по результатам которой появится артефакт собранный pdf.


Ура! Теперь можно приступать к релизам.

Настраиваем автоматические релизы


Система релизов в GitHub имеет одну особенность: релиз всегда привязан к коммиту с тэгом. Поэтому у нас есть два варианта:

  1. Ставить тэги вручную на те коммиты, по которым мы хотим собирать и релизить pdf-файлы;
  2. Ставить теги в автоматическом режиме на все коммиты и релизить их.

Для меня второй вариант показался более удобным, т.к. я обычно делаю коммит и пуш именно тогда, когда работа завершена (либо логически, либо на сегодняшний день). Поэтому в дальнейшем я буду рассказывать про него.

Для создания релиза мы будем использовать действие actions/create-release@v1 и для загрузки pdf-файла в созданный релиз (да, он загружается отдельно) используем actions/upload-release-asset@v1.

Добавим новый job:

deploy:runs-on: ubuntu-latest# Деплой будет только на ветке master. Закомментируйте, если не надоif: github.ref == 'refs/heads/master'# Можно зависеть от любого другого job. Порядок выполнения будет подстраиваться.needs: [build]steps:# Это хак, чтобы дергать bash-команды и запоминанать их результат- name: Variables# id используется внутренне: по нему можно ссылаться на результаты из другого stepid: vars# echo в таком форматировании позволит впоследствии ссылаться на результаты через ${{ steps.<step_id>.outputs.<variable_name> }}# Вертикальная черта |  это специальный символ yaml. Означает, что дальше идет массив команд и их все надо выполнитьrun: |echo ::set-output name=date::$(date +'%Y-%m-%d')echo ::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)- name: Download artifactsuses: actions/download-artifact@v2with:# Тот самый ключ, который мы указывали в upload-artifactname: my_doc- name: Create Releaseuses: actions/create-release@v1id: create_releaseenv:# По офф.документации, надо указать GITHUB_TOKENGITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actionswith:# Берем результат из step с id=vars (см. выше).# Получим теги вида my_doc-<дата билда>-<первые 8 символов из sha коммита>tag_name: my_doc-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.sha8 }}# Имя, которое будет высвечиваться в релизеrelease_name: My Actions document (version ${{ steps.vars.outputs.date }})# Наш релиз не набросок и не пререлиз, так что оба в falsedraft: falseprerelease: false# Прикладываемые файлы надо заливать отдельным step- name: Upload pdf assetuses: actions/upload-release-asset@v1env:# Тоже требуется токенGITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}with:# Из предыдущего step с id=create_release генерится upload_url  по нему и надо заливатьupload_url: ${{ steps.create_release.outputs.upload_url }}# Не переходим в папку latex_sources, поскольку download-artifacts грузит в текущую директориюasset_path: ./my_doc.pdf# Имя, которое будет высвечиваться в релизеasset_name: my_asset_name.pdfasset_content_type: application/pdf

Добавляем в файл workflow, коммитим изменения. Идем в Actions и видим, что добавилась еще один шаг:


При этом в releases тоже появлся собранный pdf.

Осталось дело за малым залить на сайт.

Поднимаем GitHub Pages


GitHub предоставляет возможность для каждого проекта создавать веб-страницу и дает бесплатный хостинг на нее. Но совершенно не обязательно владеть JS/CSS/HTML, чтобы написать что-то стоящее! Из коробки сервис предлагает несколько симпатичных шаблонов, которые полностью решают вопрос с версткой. От вас потребуется только заполнить Markdown-документ, а система сделает все остальное.

Идем в раздел Settings репозитория и во вкладке Options (открывается первой по-умолчанию) листаем вниз до GitHub Pages.


Тут в качестве source выбираем ветку master, а в качестве папки /docs (можно и корень /, но я предпочитаю держать минимальное количество файлов в корне проекта). Нажимаем Save.

Кнопкой Theme Chooser открывается галерея шаблонов, где каждый можно потыкать, посмотреть и выбрать нажатием на зеленую кнопку Select theme.

После выбора темы нас бросит в веб-редактор, где предлагается отредактировать Markdown-файл, который потом станет сайтом. Здесь можно описать все, что душе угодно: от простого представления себя до целей документа и особенностей работы.

Как только вы будете довольны содержимым, закоммитьте изменения.

Где моя страница?


Ссылка на собранную страницу всегда хранится в Settings -> GitHub Pages. Её лучше прописать в Website репозитория (шестеренка возле поля About на главной странице), чтобы не потерять.

Загружаем свежайший релиз


Есть небольшая хитрость: на последний релиз и все его файлы всегда можно сослаться, заменив тег коммита в URL на latest. В нашем примере, чтобы получить файл my_asset_name.pdf из последнего релиза, нужно вставить ссылку https://github.com/<your_username>/<repo_name>/releases/latest/download/my_asset_name.pdf.

В моем случае это было: https://github.com/alekseik1/github_actions_latex_template/releases/latest/download/my_asset_name.pdf.

После этих действий GitHub Pages всегда ссылаются на последний релиз.

Итоги


Мы настроили GitHub Actions на автоматическую сборку pdf-файла, выкладывание в релиз и подняли сайт на GitHub Pages, содержащий самую свежую версию. Финальную версию проекта можно найти здесь.

Спасибо за внимание!
Подробнее..
Категории: Ci/cd , Github , Github actions , Latex , Github pages

Из песочницы Фетиш WYSIWYG или Как правильно скрещивать ужа с ежом

05.11.2020 12:07:06 | Автор: admin

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


Уяснив стартовые данные, я впал в лёгкое уныние. Больше всего в тот момент мне хотелось сослаться на обстоятельства непреодолимой силы, перегруженность, невменяемость, сезонное обострение ящура короче говоря, найти любой повод и на волю, в пампасы! Но сакраментальное ты ж программист! и осторожное буду должен уже прозвучали, вздохи химика становились все тяжелее, размеренно падая на и без того узкую тропку к отступлению, химиковы глаза за толстыми стёклами очков давали изрядную фору фирменному взгляду Кота-в-сапогах из Шрека...


Пути назад не было. Квест начался.


Химик пришел не с пустыми руками. Он принёс множество листиков с зачем-то уже напечатанным текстом и формулами, тщательно нарисованными шариковой ручкой в специально сделанных пропусках между абзацами. Впрочем, тут же выяснилось, что большая часть СНТ всё ещё пребывает в недрах могучего химикова ума, а листочки это так, наброски, черновики и вообще проба пера.


Ситуация вырисовывалась невесёлая. Химик весьма уверенно набирал текст в notepadе и даже, кажется, знал, как выделить строчку в Wordе курсивом. Я совершенно точно помнил формулы воды, этилового спирта и был убеждён, что лить воду в серную кислоту ни в коем случае нельзя. Или наоборот? Неважно, главное на этом пересечение наших познаний исчерпывалось. Вопрос вырисовывался один, но глобальный: как? Как организовать работу так, чтобы химик мог излить ещё не рождённый СНТ на бумагу то есть, в какой-то текстовый формат, а я мог бы разобраться в структуре документа и сверстать его надлежащим образом, вставив в нужные места все упомянутые выше красоты?


Word отпал, когда к концу следующего дня химик прислал первые наброски нашего с ним великого творения, в порядке здоровой инициативы набранные с помощью именно это редактора. По привычке он набирал в нём текст как в блокноте: абзацные отступы, состряпанные из ядрёной смеси пробелов и табуляций, ряды пустых абзацев, долженствующие перенести текст на следующую страницу, нумерованные вручную списки, колонки текста, выровненные все теми же многострадальными пробелами и переносами строк в самых неожиданных местах Химик блистал! К сожалению, он совсем забыл про поля, и когда я выставил их ширину в требуемые значения, всё это великолепие рассыпалось в совершенно невзрачные и не поддающиеся восстановлению ошмётки. What you see оказалось не совсем what you get, а говоря по правде совсем не.


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


Решение пришло после короткого гугления: Markdown! Прикинув, что возможности этого простого, как табуретка, языка разметки перекрывают потребности химика по оформлению текстовой части его работы на 99%, я подыскал внятное руководство и переправил его химику с предложением обсудить этот вариант по скайпу. На удивление, химик воспринял идею без особого сопротивления: как потом выяснилось, вольная борьба с Wordом изрядно поднадоела ему самому.


По обсуждении, план совместной работы над документом сводился к следующему:


  • Химик, используя подходящий Markdown-редактор, готовит текстовую часть документа, соблюдая его структуру, вводя разделы, подразделы и т.п.
  • Простые формулы вписываются непосредственно в Markdown-разметку, сложные и структурные рисуются от руки, сканы пересылаются мне; место в тексте для них маркируется.
  • Данные для таблиц, диаграмм и графиков присылаются мне в сыром виде (как оказалось, это были в основном CSV-файлы); место в тексте для них также маркируется.
  • Я подготавливаю сложную вёрстку (титульник, формулы, таблицы, диаграммы и графики, библиографию и т.д.) как компоненты составного документа LaTeX.
  • После подготовки и вычитки всех материалов я верстаю их в единый документ LaTeX, добавляю содержание, приложения и т.п.
  • Профит!

И работа пошла, пусть поначалу со скрипом и неровно, но пошла! После нескольких дней ошибок, химик на удивление неплохо приноровился к незатейливому синтаксису Markdown, благо, редактор не слишком отличался от его излюбленного блокнота. Для удобства, текст публикации был разбит на несколько md-файлов, по числу основных разделов. Во избежание случайной утраты данных проект был помещён под контроль VCS; правда, мне приходилось рулить проектом сразу на двух машинах: на своём и, в ипостаси альтер-эго химика посредством TeamViewer на его компьютере.


Предлагая к использованию Markdown, я планировал воспользоваться всеми любимым pandocом и просто-напросто преобразовать md-файлы в исходники LaTeX, но время поджимало, и компоновку итогового документа пришлось начать, не дожидаясь полного завершения работ химиком. И вот тут-то Оказалось, я здорово недооценил перфекционизм и энтузиазм моего соавтора: просматривая очередной коммит проекта, я заметил массовые и довольно объёмные изменения в md-файлах, которые были давно вычитаны, исправлены, преобразованы в LaTeX и щедро нафаршированы формулами, таблицами и прочими кулинарными ингредиентами. Как выяснилось, в порыве творческого экстаза химик в очередной раз перечитал уже набранные разделы, остался не весьма ими доволен и, ничтоже сумняшеся, тут же устранил недочёты. Всю ночь возился! горделиво заявил он по скайпу в ответ на мои робкие попытки узнать, что же произошло.


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


Из этих двух вариантов всё более хотелось выбрать третий: пампасы! Тем более, что химик явно недоумевал, почему я не разделяю восторгов по поводу улучшений и украшений, несомненно нашёптанных ему его органико-химической музой в, разумеется, лучшие творческие минуты его жизни, что не оставляло сомнений в том, что муза посетит его ещё не раз и процесс внесения правок и изменений приобретает мрачноватую перспективу стать перманентным и всеобъемлющим.


И вдруг! Покопавшись в пакетах LaTeX, я с удивлением обнаружил среди прочих пакет с многообещающим названием markdown. Ещё не веря в удачу, я начал читать описание Да! Этот пакет позволял включать Markdown-файлы в документ LaTeX as is, без сторонних утилит, без дополнительных правок или излишних телодвижений, при этом позволяя использовать в Markdown-разметке конструкции LaTeX!


Теперь мне оставалось только прописать в md-текстах химика включение иллюстраций по месту (в виде tex-разметки), залить эти изменения на его компьютер и строго-настрого запретить ему править или выкидывать вот эти вот непонятные закорючечки. Остальной химиков текст ему позволялось изменять как угодно, в любое время дня и ночи, на пару с музой или без содействия оной. Простая пересборка LaTeXом подтягивала в итоговый документ все изменения, никак не отражающиеся на уже проделанной работе. Система контроля версий довершала глубоко эшелонированную линию обороны от возможных деструктивных поползновений.


Публикация была готова не совсем в срок, но до дедлайна уложиться удалось.


Ф-ф-у-у-у-ух.


Повторюсь, это вполне реальная история. Да, есть ещё люди, которые используют Word (или LibreOffice Writer, или AbiWord, или ) как пишущую машинку, не заморачиваясь стилями, параметрами абзацев и тому подобными, совершенно бессмысленными с их точки зрения, штуками. А почему нет? Это же вовсеушипрожужжанный WYSIWYG, они же видят перед собой что-то, вполне себе читаемое. Да, при этом они могут быть вполне успешными профессионалами в своей области. Да, им непросто объяснить суть проблемы, а научить правильной вёрстке непросто вдвойне. И да, порой им приходится готовить публикации...


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


Удачи!

Подробнее..
Категории: Верстка , Markdown , Latex

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru