Как писать книгу в LaTeXe по физике. Cтатья 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.1 Советы начинающему автору
Вот список основных советов начинающему автору большого текста. Большой текст — это текст, который очень утомительно листать, его можно править только командами поиска и замены.
Как выразились бы военные люди, каждый совет «написан кровью». Ну ладно, не кровью… Но затраченное время, нервы, головная боль, и т.д. Сначала кажется, что потом будет время всё поправить. А потом окажется. что работы по переделке книги под вкусы редакции — это очень времязатратное дело.
2.1.1 Узнайте формат страницы Вашей будущей книги и с самого начала внесите его в преамбулу. Это избавит Вас от мучительного переформатирования. С самого начала задайте в преамбуле конечный макет страницы (размеры колонтитулов, полей, и т.д.), а также размер и вид шрифта. Это тоже сэкономит вам время потом.
Например, формат моей книги 70×100 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.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>:
В конце каждой главы я помещаю список задач и список вопросов на экзамене. В конце книге размещены эти задачи с решениями, а также полный список экзаменационных вопросов.
Я также параллельно пишу вторую книгу — «решебник», в которой приведены решения задач из учебника.Это значит, что в процессе компиляции книги происходит добавление текста в «решебник».
Таким образом, одни и те же тексты должны появиться в двух совершенно разных местах. В дальнейшем для краткости будем обсуждать только задачи с решениями в конце книги. Я хочу, чтобы условие каждой задачи было напечатано дважды, в конце главы и в конце книги перед решением.
Но я категорически не хочу иметь две версии одного и того же текста в разных местах, потому что это источник бесконечного количества ошибок. И значит, компилятор должен сам дублировать фрагменты текста, копируя их в разные места разных книг.
Как я решаю эту задачу. В конце преамбулы у меня стоит команда:
\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.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.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}{\le