\documentstyle[12pt,stree,sprivate,russian,chemstr,carom]{article} \begin{document} \def\<#1>{$\langle$#1$\rangle$} %\def\UPSILON{\char'7} %\def\XyM{X\kern-.30em\smash{\raise.50ex\hbox{\UPSILON}}\kern-.30em{M}} %\def\XyMTeX{\XyM\kern-.1em\TeX} \def\ChemTeX{Chem\kern-0.1em\TeX} \def\verb{\sverb} \def\topfraction{.9} \def\bottomfraction{.9} \def\textfraction{.1} \def\0{\tt\symbol{92}} \def\1{\tt\symbol{123}} \def\2{\tt\symbol{125}} \def\4{\tt\symbol{36}} \def\5{\tt\symbol{95}} \author{Строков Игорь Иванович} \title{Еще один макропакет для набора структурных формул в системе \LaTeX} \maketitle \section{Введение} Если вы хотите готовить научные статьи или книги типографского качества, то выбор инструментов обычно невелик: это либо Word, либо \TeX\ --- язык и система набора документов, созданные на рубеже 70--80-х годов Д. Кнутом [1]. Если говорить кратко, то главное достоинство \TeX а --- скурпулезный учет всех мелочей, которые влияют на внешний вид документа и, как следствие, --- безупречное качество набора, практически недостижимое другими средствами (особенно если в тексте есть символы математики). С другой стороны, в \TeX е не очень удобно работать с графикой, хотя в него можно импортировать растровые изображения (обычно формата {\tt PCX}), при чем теряется независимость от печатающего устройства, или документы на языке PostScript. Последнее решение позволяет получать практически любые визуальные эффекты, однако в среде DOS/Windows до последнего времени было трудно найти программы, которые бы корректно понимали PostScript. В то же время \TeX\ сам является своеобразным языком программирования, который позволяет с помощью псевдографических шрифтов получать простые векторные диаграммы и рисунки. Наиболее известный вариант \TeX а, \LaTeX\ [2], практически установил стандарт на применение псевдографики. В большинстве случаев структурные формулы, встречающиеся в химических статьях, можно полностью набирать средствами \LaTeX а. Однако делать это непосредственно с помощью примитивных команд рисования линий и кругов, конечно, слишком неудобно. Специально для набора химических формул разными авторами созданы более и менее сложные пакеты макрокоманд. Макрос Рамека [3] достаточно прост и удобен, но формулы в нем получаются не такие, к каким привыкли химики-органики. Этого недостатка лишены более сложные макропакеты \ChemTeX\ Хааса--о'Кейна [4] и \XyMTeX\ Фуджиты [5]. Оба последних пакета устроены примерно одинаково: каждому характерному элементу рисунка (обычно такой элемент относится к связной системе циклов) в них отвечает отдельная макрокоманда, параметры которой позволяют менять вид заместителей и связей этого элемента. Возмем для примера более развитый и упорядоченный макрос Фуджиты. Например, 5,5-диметилциклогексен-2-он-1 $$\begin{picture}(800,0)\put(-100,-200){\cyclohexanev[b]{1D==O;5Sb==;5Sa==}} \end{picture}\quad\stree[b]{3[7]020\O4>6810}$$ в нем получается по команде \verb"\cyclohexanev[b]{1D==O;5Sb==;5Sa==}" (для сравнения справа нарисована та же структура, введенная с помощью нового пакета). В этом, как и в других случаях, мнемоника команды коррелирует с названием соединения, что может позволить опытному пользователю по виду команды представить себе, какая в ней зашифрована структура. С другой стороны, описание формул на уровне крупных структурных фрагментов влечет за собой ряд недостатков. Прежде всего, таких фрагментов, которые обычно рассматриваются как целое, в органической химии очень много, и охватить их полностью практически невозможно. Эта задача не решается и в пакетах \ChemTeX\ и \XyMTeX, при том, что полное описание каждого представляет собой довольно солидную книгу. Кроме того, в случаях, когда большая формула состоит из нескольких фрагментов, их объединение на одном рисунке может превратиться в утомительную задачу по вычислению координат стыкуемых узлов. В связи с этим оправданным кажется описание формул на более простом уровне --- с помощью отдельных связей, подобно тому, как это сделано у Рамека [3]. Разнообразие связей по сравнению с характерными фрагментами структур значительно меньше, поэтому набор формул в терминах связей должен быть более универсальным и простым в освоении. Из общих соображений можно предположить, что сравнительно примитивный уровень описания чреват потерей скорости и удобства набора, однако субъективный опыт автора говорит о том, что этого не происходит. Чтобы поддержать это утверждение, рассмотрим, как именно вводятся структурные формулы в предлагаемом вашему вниманию макропакете \treeTeX. По традиции программистов на \TeX е, новый пакет получил название, включающее общий логотип \TeX. Первая часть названия, ``tree'', отражает способ описания структурных формул в виде дерева связей. Весь \treeTeX\ реализован в виде одного небольшого файла {\tt stree.sty}. Как обычно, имя файла без расширения включается в аргумент команды \verb"\documentstyle". Например, первая строка в этом документе выглядит так: \begin{verbatim} \documentstyle[12pt,stree,russian]{article} \end{verbatim} \section{Основные правила} Для набора структурных формул в \treeTeX е используется единственная команда \verb"\stree{}". Описание формулы содержится в фигурных скобках и получается так: начав с какой-либо вершины (не важно, с какой), следут обойти всю структуру, двигаясь по связям и описывая как сами проходимые связи, так и метки вершин, если они встретятся по пути. Например, формула 1-гидрокси-4-метилпиридина$$\stree{{HO}20?242\Me?68N?10}$$ вводится как \verb"\stree{{HO} 2 0 >2 4 [2{CH$_3$}] >6 8N >10}". Начиная в данном примере обход с вершины HO, мы должны поставить в код ее метку: \verb"{HO}". Метка обязательно заключается в фигурные скобки, если в ней более одного символа. Следующий символ {\tt 2} означает: <<провести связь в направлении на 2 часа>> (по циферблату часов). При обходе формулы всегда есть текущая точка (вершина). Указывая направление связи, мы перемещаемся из текущей точки в данном направлении (на расстояние, равное длине связи) и попадаем в другую вершину. Таким образом, после символа {\tt 2} текущей становится вершина кольца (номер 1 по нумерации ИЮПАК). Символ {\tt 0} описывает следующую связь в направлении на 0 часов (вертикально вверх). Далее (если продолжать обход кольца по часовой стрелке) следует двойная связь на два часа. Если связь отличается от простой, то {\sl перед\/} ее направлением ставится один или несколько символов (так называемых {\em префиксов\/}), отражающих особенности связи. Двойную связь можно изображать по разному. В нашем случае желательно, чтобы второй штрих связи был внутри цикла, {\sl справа\/} от основного. Для достижения этого эффекта перед двойкой ставится префикс {\tt >} (правая угловая скобка). Следующая простая связь на четыре часа приводит к замещенной вершине кольца. Давайте вначале опишем заместитель, а потом продолжим обход кольца. Конструкция \verb"[2{CH$_3$}]" содержит описание заместителя и интерпретируется так: открывающая скобка {\tt [} запоминает текущую вершину; связь на два часа (символ {\tt 2}) приводит к вершине CH$_3$ (\verb"{CH$_3$}" --- это описание метки), после чего скобка {\tt ]} закрывается и возвращает нас к вершине кольца, от которой отходит заместитель. Последовательность символов \verb"{CH$_3$}" довольно неудобно набирать на клавиатуре. В то же время метильная группа (CH$_3$) встречается часто, поэтому для нее был предусмотрен более простой метод ввода с помощью команды \verb"\Me" так, что конструкция \verb"2\Me" эквивалентна \verb"[2{CH$_3$}]" (вместо цифры {\tt 2} здесь может стоять любое число, отвечающее направлению связи). После того, как заместитель задан, можно продолжить обход кольца. Остались три связи: на 6, 8 и 10 часов. Связи на 6 и 10 часов двойные и нарисованы внутри цикла, что указывается с помощью префикса {\tt >}. Связь на 8 часов приводит к вершине с меткой N, поэтому символ {\tt N} стоит сразу за символом {\tt 8}. В данном случае фигурные скобки вокруг {\tt N} ставить не обязательно, поскольку эта метка состоит из одного символа. В этом примере для наглядности группы символов, относящиеся к разным связям, мы разделили пробелами. Вообще говоря, ставить их не обязательно (команда \verb"\stree{{HO}20>242\Me>68N>10}" тоже является правильной), но вы можете использовать пробелы, чтобы визуально структурировать содержимое команды \verb"\stree". При расстановке пробелов действует только один запрет: их {\sl нельзя\/} ставить между направлением и меткой или направлением и командой. Например, в приведенном выше примере написать \verb"8 N" (а также \verb"2 {CH$_3$}" или \verb"2 \Me") было бы ошибкой. Есть также один случай, когда пробел нужен {\sl обязательно:\/} между цифрой {\tt 1}, если она обозначает направление на один час, и следующей за ней другой цифрой.\footnote{Строго говоря, если следующая цифра --- не {\tt 0} или {\tt 1}, то пробел и в этом случае необязателен.} \section{Формальное описание} Теперь попробуем суммировать и изложить более строго основные правила, рассмотренные на данном примере. Аргумент команды \verb"\stree" состоит из описаний отдельных связей. Чтобы описать связь, достаточно задать ее направление --- чаще всего это число часов от 0 до 11 на 12-часовом циферблате. {\sl Перед\/} направлением можно поместить один или несколько префиксов, которые модифицируют длину, кратность, внешний вид или само направление связи. {\sl После\/} направления может ставится метка вершины, к которой приводит связь, или команда (имеется в виду команда в терминах \TeX а --- то, что начинается с сигнального символа~\verb"\"). Команда --- это средство более краткого описания некоторых часто встречающихся структурных фрагментов. Метка или команда здесь рассматриваются как атрибут связи, и, поскольку они ставятся после направления, их называют также {\em суффиксами.\/} Суффикс, в отличие от префиксов, может быть только один, и, кроме того, перед суффиксом {\sl никогда\/} не ставится пробел. Описание связи в форме \<возможные префиксы>\<направление>\<возможный суффикс>\ отвечает тому, как если бы вы объясняли обход структуры словами: <<{\sl такая-то\/} связь на {\sl столько-то\/} часов приводит к {\sl такой-то\/} метке>> --- только вместо слов {\sl такой-то\/} и {\sl столько-то\/} ставятся условные символы. \def\is{$\longrightarrow$ } \def\ili{\vrule{} } Может возникнуть вопрос --- как отличить, например, суффикс текущей связи от направления или префикса следующей? Для визуального различения, как уже отмечалось, после описания каждой связи можно вставлять пробел (если вас не очень заботит избыточный объем текста). Машина, однако, не обращает внимания на пробелы, а действует в соответствии с правилами, которые далее приводятся в записи Бэкуса--Нора (стрелка \is\ обозначает <<определяется как>>, а вертикальная черта \ili\ значит <<или>>). Начнем с определения аргумента команды \verb"\stree" (который здесь обозначен как \<структура>): \begin{description}%\flushleft \item[] \<структура> \is \<пусто> \ili \<связь>\<структура> \ili\protect\\ \<структура>{\tt[}\<структура>{\tt]}\<структура> \end{description} % Это просто формальный способ сказать, что аргумент состоит из описаний отдельных связей и может содержать парные квадратные скобки, возможно вложенные. Далее определяется, какой вид имеет описание связи. \begin{description}\frenchspacing%\flushleft \item[] \<связь> \is \<возможные префиксы>\<направление>\<возможный суффикс> \<возможные пробелы> \item[] \<возможные префиксы> \is \<префикс> \<возможные префиксы> \ili \<пусто> \item[] \<префикс> \is {\tt / \ili , \ili = \ili > \ili < \ili ? \ili \_ \ili ' \ili ` \ili " \ili . \ili : \ili * \ili \verb"^"} \item[] \<возможный суффикс> \is \<команда> \ili \<метка> \ili \<пусто> \item[] \<метка> \is {\1}\<любая последовательность символов>{\2} \ili \<любой символ, если это не префикс> \item[] \<направление> \is \<направление в часах> \ili \<направление в смещениях> \item[] \<направление в часах> \is {\tt 0 \ili 1\<{\rm возможный пробел после единицы}> \ili 2 \ili 3 \ili 4 \ili 5 \ili 6 \ili 7 \ili 8 \ili 9 \ili 10 \ili 11 \ili 12} \item[] \<{\rm возможный пробел после единицы}> \is \<пробел>, если следующий символ в описании --- {\tt 0} или {\tt 1}, иначе --- \<пусто> \item[] \<направление в смещениях> \is \<плюс или минус> \<натуральное число> \<плюс или минус> \<натуральное число> \item[] \<плюс или минус> \is {\tt +} \ili {\tt -} \end{description} В этих правилах любой синтаксический элемент (конструкция в угловых скобках \< >) раскрывается в конечном итоге либо в конкретные символы, либо в элементы, которые не требуют, как кажется, дальнейшего объяснения (например \<любая последовательность символов>, \<пусто>, \<натуральное число>). Приведенные правила, однако, ничего не говорят о том, что значит тот или иной префикс или какой смысл имеет, например, конструкция \<направление в смещениях>. Семантика отдельных элементов команды \verb"\stree" систематически рассматривается в трех следующих разделах. \section{Префиксы} \begin{table}[tbh]\centering {\bf Таблица 1.} Префиксы.\par \medskip \begin{tabular}{c|c|c|c} префикс&название особенности&пример&категория\\ \hline\hline \tt /&косая&\stree{/2}&\\ \cline{1-3} \tt //&очень косая&\stree{//2}&префиксы\\ \cline{1-3} \tt ,&под 45$^\circ$&\stree{,2}&направлений\\ \cline{1-3} {\tt+} и {\tt-}&задают направление в смещениях&&\\ \hline\hline \tt =&центрированная двойная&\stree{=3}\\ \cline{1-3} \tt >&двойная справа&\stree{>3}&\\ \cline{1-3} \tt <&двойная слева&\stree{<3}&кратности\\ \cline{1-3} \tt ==&тройная &\stree{==3}&связей\\ \cline{1-3} \tt ">&делокализованная справа&\stree{">3}&\\ \cline{1-3} \tt "<&делокализованная слева&\stree{"<3}&\\ \hline\hline \tt \_&длинная ($5/3$ от обычной)&\stree{_3}&длины\\ \cline{1-3} \tt '&короткая ($1/3$ от обычной)&\stree{'3}&связей\\ \hline\hline \verb"~"&невидимая &\\ \cline{1-3} \verb"~~"&и связь, и метка невидимы&\\ \cline{1-3} \tt :&пунктирная&\stree{:3}&визуальные\\ \cline{1-3} \tt *&жирная&\stree{*3}&эффекты\\ \cline{1-3} \verb"^"&стрелка&\stree{^3}\\ \cline{1-3} \verb"^*"&клиновидная&\stree{^*3}\\ \hline\hline \tt .&очень короткая невидимая&\stree{C.2*}&для меток \end{tabular} \end{table} Выше мы уже познакомились с одним префиксом {\tt >}, который испоьзовался для задания двойных связей. Полный список префиксов приводится в табл. 1. Префиксы делятся на четыре категории по влиянию на направление, кратность, длину или внешний вид связи. Префиксы разных категорий можно комбинировать друг с другом: например, в результате \verb"\stree{_=:/4}" получится длинная двойная пунктирная косая связь на 4 часа: \stree{_=:/4}\ Рассмотрим далее более полезные случаи использования префиксов и их сочетаний. Префикс {\tt .} (точка) --- особенный. Он влияет и на длину, и на внешний вид связи и используется для того, чтобы ставить номера или другие метки при вершинах. Например, чтобы ввести этиленгликоль с нумерацией вершин (\stree[b]{{HO}.01 2.02 4.03 2{OH}.04}), нужно сказать: \verb"\stree{{HO} .01 2 .02 4 .03 2{OH} .04}" (все пробелы здесь необязательны). Конструкция {\tt .01} (и аналогичные ей {\tt .02}, {\tt .03}, {\tt .04}) в полном соответствии с формой \<возможные префиксы>\<направление>\<возможный суффикс> буквально означает следующее: провести {\sl короткую невидимую\/} связь {\sl на ноль часов\/} и поставить метку <<1>>. Однако здесь есть две особенности. Если префикс связи --- точка, то, во-первых, после такой связи текущая вершина не меняется (как если бы описание связи было взято в квадратные скобки), и, во-вторых, после направления {\sl обязательно\/} должна следовать метка. Более того, {\sl любой\/} символ (или группа символов, заключенная в фигурные скобки) после направления с префиксом {\tt .} воспринимается как метка. Поэтому в этом случае мы можем просто поставить после направления на 0 часов цифру 1, не опасаясь, что она может быть спутана с направлением на 1 час. Обратите внимание, что номера вершин набраны в меньшем размере, чем метки вершин и весь остальной текст. Размер и шрифт можно менять с помощью соответствующих команд, например \verb"\stree{{HO} .0{\tiny1} 2 .02 4 .0{\large3} 2{OH} .0{\LARGE4}}" дает такой результат: \stree{{HO} .0{\tiny1} 2 .02 4 .0{\large3} 2{OH} .0{\LARGE4}}. Чаще, однако, бывает нужно, чтобы все номера вершин (или другие метки при вершинах) были в одном стиле. Этот стиль задается командой \verb"\znakf". Исходно эта команда определена так: \verb"\def\znakf#1{\small #1}" --- то есть печатать метки размером \verb"\small". Определение \verb"\znakf" можно изменить (прямо в своем тексте), чтобы получить жедаемый вид меток по умолчанию: например, после \verb"\def\znakf#1{#1}" метки станут получаться обычного размера, а после \verb"\def\znakf#1{$#1$}" --- набираться в математической моде. \rpic{\stree{:1:3:5^*7**9*^11}} Прокомментируем также назначение других префиксов (исключая префиксы направлений, которые рассматриваются в следующем разделе). Пунктирные, очень жирные и клиновидные связи, очевидно, нужны для набора стереоформул. Например, приведенная в этом абзаце формула была введена как \verb"\stree{:1 :3 :5 *^7 **9 *^11}" (обход велся по часовой стрелке начиная с самой левой вершины). Этот пример не имеет практической ценности и только иллюстрирует особенности использования \verb"^" и {\tt *}. Так, в первом случае сочетание \verb"^*" обозначает связь {\sl расширяющуюся\/} (\stree{*^3}), поскольку предыдущая связь была узкой, а во втором --- {\sl сужающуюся\/} (\stree{**17*^3}), так как перед ней шла жирная связь. Хорошо, когда машина пытается проявить сообразительность, но иногда необходимо указать явно, в какую сторону должна расширяться клиновидная связь. Простой способ добиться желаемого --- задать псевдо-связь нулевой длины и подходящей толщины, тогда следующая клиновидная связь получится нужного вида. Например сужающаяся одиночная связь (\stree{**17*^3}) была сейчас введена как \verb"\stree{**17 *^3}". Для подобных случаев нужно запомнить, что связи нулевой длины отвечает псевдо-направление на 17 часов. Отметим заодно, что связь перед плоскостью вводится как {\sl очень\/} жирная (два префикса {\tt *}). Один префикс {\tt *} отвечает просто жирным связям, которые примерно в два раза \'уже очень жирных и вдвое толще обычных (опустим вопрос, для чего они могут пригодиться). Префикс {\tt '} (апостроф) позволяет вводить короткие связи, которые обычно обозначают свободные валентности во фрагментах. Например, формула \stree{'8'0 4'6 2N '0'4}\ была набрана как \verb"\stree{'8'0 4'6 2N '0'4}". После короткой связи, как и после короткой невидимой, текущая вершина не меняется. Просто невидимости можно добиться с помощью префикса \verb"~" (тильда). Невидимые связи удобно использовать для того, чтобы получить формулу, отдельные части которой не связаны между собой. Например, схему реакции $$\stree{{H$_2$C} =3{CH$_2$} ~6{CH$_2$} =9{H$_2$C}} \quad\longrightarrow\quad \stree{3690}$$ можно задать как \begin{verbatim} \stree{{H$_2$C} =3{CH$_2$} ~6{CH$_2$} =9{H$_2$C}} \quad\longrightarrow\quad \stree{3690} \end{verbatim} Невидимость также полезна, если требуется выровнять несколько формул разного размера. Пусть нужно напечатать рядом три формулы: $$ \stree{O =2 [~0] 4 [~6] 2 4{Cl}}\quad\stree{4 6\O 2 ~~0\O 4{Cl}}\quad\stree{4 ~~6\O 2 0\O 4{Cl}}$$ Если просто перечислить их: \verb"\stree{O =2 4 2 4{Cl}} \quad \stree{4 6\O 2 4{Cl}} \quad \stree{4 2 0\O 4{Cl}}", то главная цепь в этих формулах окажется на разных уровнях: $$ \stree{O=2424{Cl}}\quad\stree{46\O24{Cl}}\quad\stree{420\O4{Cl}} \quad,$$ что не очень красиво. Выход состоит в том, чтобы везде поставить невидимые заместители, расположенные в противоположном направлении от видимых: \verb"\stree{O =2 [~0] 4 [~6] 2 4{Cl}} \quad \stree{4 6\O 2 ~~0\O 4{Cl}} \quad \stree{4 ~~6\O 2 0\O 4{Cl}}". И те, и другие имеют одинаковый размер, поэтому формулы окажутся выровненными относительно главной цепи. Здесь следует кое-что объяснить. Во-первых, появилась новая команда \verb"\O", которая рисует карбонильную группу (первую структуру тоже можно было задать с ее помощью: \verb"\stree{8\O 4 2 4{Cl}}"). Во вторых, в конструкциях \verb"~~0\O" и \verb"~~6\O" стоят сразу две тильды: это делает невидимой не только связь, но и метку на ее конце (нетрудно догадаться, что с одной тильдой получился бы повисший в воздухе символ <>)\@. Наконец, хотя в первой формуле нет заместителей, смотрящих вверх или вниз, она тоже не центрирована относительно главной цепи --- мешают метки вершин, поэтому и здесь пришлось поставить две невидимые связи для того, чтобы скрыть объем меток. Таким образом, совместное использование префиксов позволяет получить много дополнительных полезных эффектов, обходясь сравнительно небольшим набором знаков. Ни один из них не является буквой или цифрой, что позволяет легко отличать префиксы от меток и направлений. Только знаки {\tt +} и {\tt -} выпадают из этой картины: они используются, чтобы задавать \<направление в смещениях>, смысл и назначение которого обсуждается в следующем разделе. \clearpage \subsection{Направления} \begin{figure}\centering \def\znakf#1{\tt #1} \begin{tabular}{cccc} \stree{[0.00][1.1 1][2.22][3.33][4.44][5.55][6.66][7.77][8.88][9.99]% [10.10{10}][11.11{1\rlap1}]}& \stree{[,2.,2{,2}][,5.,5{,5}][,8.,8{,8}][,11.,11{,11}]}& \stree{[:1][:2][:4][:5][:7][:8][:10][:11]% [/1./1{/1}][/2./2{/2}][/4./4{/4}][/5./5{/5}][/7./7{/7}][/8./8{/8}]% [/10./10{/10}][/11./11{/11}]}& \stree{[:1][:2][:4][:5][:7][:8][:10][:11]% [//1.//1{//1}][//2.//2{//2}][//4.//4{//4}][//5.//5{//5}][//7.//7{//7}]% [//8.//8{//8}][//10.//10{//10}][//11.//11{//11}]}\\ прямые&получасовые&косые&очень косые \end{tabular}\par\medskip {\bf Рисунок 1.} Направления связей (для сравнения рядом с косыми и очень косыми пунктиром показаны соответствующие прямые направления). \end{figure} \rpic{\stree{0,23,56,89,11}} Давайте систематически рассмотрим в этом разделе все разные способы задания направлений. Кроме двенадцати {\em прямых\/} направлений, отвечающих целому числу часов на циферблате, есть еще множество других, которые задаются как число часов с префиксами {\tt /} или {\tt ,} (см.\ рис.\ 1). Четыре направления под углом 45$^\circ$ к горизонту (на пол-второго, пол-пятого, пол-восьмого и пол-одинадцатого) задаются с помощью префикса {\tt ,} (запятая) перед числом {\tt 2}, {\tt 5}, {\tt 8} или {\tt 11} (считайте, что запятая здесь отвечает приставке {\sl пол-\/}). Такие направления (называемые {\em получасовыми\/}) можно использовать при задании восьмичленных циклов. Например, цикл в этом абзаце был введен как \verb"\stree{0 ,2 3 ,5 6 ,8 9 ,11}" в результате обхода по часовой стрелке, начиная с самой левой нижней вершины. Другие восемь направлений можно получить с помощью префикса {\tt /} (косая черта) перед одним из чисел {\tt 1}, {\tt 2}, {\tt 4}, {\tt 5}, {\tt 7}, {\tt 8}, {\tt 10} или {\tt 11} (см.\ рис.\ 1). Такие направления (назовем их {\em косыми\/}) используются, например, для ввода пятичленных циклов. Пятиугольник в химических формулах обычно рисуют так, что одна из его сторон получается строго вертикальной или горизонтальной. Если две связи, смежные такой стороне, сделать косыми, то пятиугольник получится довольно близким к правильному: $$ \begin{tabular}{cl|cl} \multicolumn{2}{c}{<<вертикальные>> формы}& \multicolumn{2}{c}{<<горизонтальные>> формы}\\&&&\\ \stree{/1 3/5810}&\verb"\stree{/1 3/5810}"& \stree{0/257/10}&\verb"\stree{0/257/10}"\\&&&\\ \stree{24/79/11}&\verb"\stree{24/79/11}"& \stree{1/46/811}&\verb"\stree{1/46/811}" \end{tabular}$$ % Пятичленное кольцо в формулах иногда изображают и так: {\bondlen=3.5mm\stree{0_36810}} (похоже на правильный шестиугольник с одним обрезанным углом). Здесь нет косых направлений, но одна связь (на месте обрезанного угла) примерно на $2/3$ длиннее других. Длинная связь получается с помощью префикса \verb"_" (подчерк), а вся формула вводится следующим образом: \verb"{\bondlen=3.5mm \stree{0 _3 6 8 10}}" (здесь присваивание \verb"\bondlen=3.5mm" позволяет получить формулу, размер которой примерно в два раза меньше обычного, специально для вставки в текст, а фигурные скобки локализуют эффект уменьшения). Рассмотрим теперь циклы из семи вершин. Для того, чтобы их рисунки получились сравнительно приличными, ранее рассмотренных направлений недостаточно: понадобятся восемь других, которые еще более, чем косые, отклоняются от соответствующих прямых направлений в сторону осей координат. Такие направления называются {\em очень косыми\/} и вводятся с помощью двух префиксов {\tt /} (см.\ рис.\ 1). С использованием очень косых связей получаются такие семичленные циклы: \begin{center}\tabcolsep=0.2em \begin{tabular}{clcl} \stree{//1 24//57911}&\verb"\stree{//1 24//57911}"\ & \stree{1//2468//1011}&\verb"\stree{1//2468//1011}"\\\\ \stree{1 35//7810//11}&\verb"\stree{1 35//7810//11}"\ & \stree{02//457//810}&\verb"\stree{02//457//810}" \end{tabular} \end{center} Таким образом, с помощью чисел 0--11 и префиксов {\tt ,} и {\tt /} можно задавать $12 + 4 + 8 + 8 = 32$ разных направления. В большинстве случаев (если учесть еще длинные связи) для описания формул этого достаточно, однако иногда может понадобиться другой, более общий способ. Согласно ему, направление задается не одним числом (как угол в часах), а двумя: смещением связи по вертикали и по горизонтали. Смещение измеряется в так называемых {\em квадратах,\/} где квадрат --- это условная единица, равная $1/6$ длины обычной связи.\footnote{Строго говоря, если она вертикальна или горизонтальна. Все другие связи чуть длиннее или чуть короче.} Каждое смещение задается как целое число с {\sl обязательным\/} знаком {\tt +} или {\tt -} (знак говорит о том, что следующее за ним число --- это смещение, а не направление в часах). Все направления, выражаемые в часах, можно задать с помощью смещений (см.\ табл. 2). Обратное же не верно: например, при наборе следующей формулы $$ \stree{202/4-5-6-6-1-2+2 02[+1+5[=01042]+1-7]/428+2-2} $$ без смещений обойтись нельзя: формула вводится как \begin{verbatim} \stree{202/4-5-6-6-1-2+2 02[+1+5[=01042]+1-7]/428+2-2} \end{verbatim} \begin{table} {\bf Таблица 2.} Соответствие смещений направлениям в часах.\par\medskip \leavevmode \vtop{\nointerlineskip\halign{\tt\hfil# \strut&#\vrule&\ \tt#\cr \multispan3 \hfil прямые\hfil\cr 0&&-0+6\cr 1&&+3+5\cr 2&&+5+3\cr 3&&+6-0\cr 4&&+5-3\cr 5&&+3-5\cr 6&&-0-6\cr 7&&-3-5\cr 8&&-5-3\cr 9&&-6-0\cr 10&&-5+3\cr 11&&-3+5\cr }}\quad \vtop{\nointerlineskip\halign{\tt\hfil# \strut&#\vrule&\ \tt#\cr \multispan3 полуторные\hidewidth\cr ,2&&+4+4\cr ,5&&+4-4\cr ,8&&-4-4\cr ,11&&-4+4\cr }}\quad \vtop{\nointerlineskip\halign{\tt\hfil# \strut&#\vrule&\ \tt#\cr \multispan3 \hfil косые\hfil\cr /1&&+2+6\cr /2&&+6+2\cr /4&&+6-2\cr /5&&+2-6\cr /7&&-2-6\cr /8&&-6-2\cr /10&&-6+2\cr /11&&-2+5\cr }}\quad \vtop{\nointerlineskip\halign{\tt\hfil//# \strut&#\vrule&\ \tt#\cr \multispan3 очень косые\hidewidth\cr 1&&+1+6\cr 2&&+6+1\cr 4&&+6-1\cr 5&&+1-6\cr 7&&-1-6\cr 8&&-6-1\cr 10&&-6+1\cr 11&&-1+6\cr }} \end{table} Рассмотрим подробнее процесс набора для этого случая. Прежде всего, всегда полезно иметь перед глазами рисунок набираемой формулы. Если она к тому же содержит связи необычной длины и/или направления, то лучше, если рисунок будет на бумаге в клетку, в масштабе 6 клеток на связь обычной длины. При проведении связей желательно, чтобы соотношение короткой и длинной проекций связи на оси координат составляло или $3/5$, что отвечает {\sl прямым\/} связям, или $2/6$ (косым), или $1/6$ (очень косым). Во-первых, такие связи можно задавать более кратким образом (как число часов), а во-вторых (что важнее) --- рисунок формулы, скорее всего, при этом получится строже (эти рассуждения больше относятся к случаю, когда общепринятого изображения формулы не существует, и можно рассмотреть разные варианты). Если же имеется красивый рисунок на клетчатой бумаге, то описать его в команде \verb"\stree" (при известном навыке) не составит труда. Давайте начнем с нижней метильной группы и примыкающего к ней пятичленного цикла (последний, как обычно, обходится по часовой стрелке). Первые три связи на этом пути (на 2, 0 и опять 2 часа) являются прямыми, следующая, на 4 часа --- косая. Двум следующим связям, заканчивающим цикл, отвечает последовательность {\tt -5-6-6-1} (если есть сомнения в том, как описать связь --- в часах или в смещениях, то можно справиться с табл.\ 2 или, что проще, запомнить соотношение проекций для направлений в часах). После пятичленного цикла опишем снаружи от него неправильный шестичленный цикл. Здесь последовательность {\tt -2+2 02} доводит до мостика, который соединяет два цикла, а описание этого мостика содержится в квадратных скобках. Оставшиеся символы {\tt /428+2-2} описывают конец пути до пятичленного цикла. Два символа {\tt 28} здесь служат для ввода метильной группы, которую можно было задать и более привычным способом, как {\tt [2]}. В данном примере, опять-таки для иллюстрации, были опущены все необязательные пробелы. {\sl Необходимый\/} пробел понадобился только в одном месте: {\tt -2+2 02[}, так как без него получилось бы {\tt -2+202[} --- две клетки вниз и 202 вправо --- очень длинная связь! Почти все направления в часах (кроме 10 и 11) --- однозначные числа, поэтому пробел нужен только там, где можно спутать пару чисел 1 и 0 или 1 и 1 с 10 и 11 соответственно. В отличие от часов, смещения не ограничены по величине, поэтому каждое число, которое начинается с {\tt -} или {\tt +}, должно заканчиваться справа какой-нибудь не-цифрой, например, пробелом. Но есть еще одно, более важное, отличие направления в смещениях --- его нельзя использовать перед командами, которые рисуют более одной связи. Последнее ограничение может показаться таинственным, пока вы не узнаете о внутреннем устройстве команд. \section{Метки вершин}\label{Labels} Однако перед тем, как перейти к командам, следует остановиться на суффиксах более простого вида --- на метках вершин, и отметить все особенности их использования. Повторим вначале наиболее важные правила. Если вершина, к которой приводит связь, имеет метку, то эта метка записывается {\sl сразу\/} после направления связи. Пробел между направлением и меткой (или командой) недопустим (заметим, что это правило не может войти в противоречие с правилами об обязательных пробелах между числом и следующей цифрой: ведь ни метка, ни команда никогда не начинаются с цифры). Если метка состоит более чем из одного символа, то она заключается в фигурные скобки. Скобки также обязательны, если метка является цифрой или одним из символов, используемых в качестве префикса.\footnote{Строго говоря, сюда следует отнести еще один случай: если метка закодирована с помощью команды. Например, вам может надоесть часто набирать какую-нибудь длинную метку, и вы напишете простую макрокоманду, скажем \0def\0бз\1C\4\56\4H\4\55\4\2\rm, чтобы вместо \tt C\4\56\4H\4\55\4\rm\ можно было везде писать \0бз\rm. При использовании внутри \0stree\rm\ команду \0бз\rm\ придется брать в фигурные скобки, чтобы она обрабатывалась как обычная метка, а не как команда.} Очень часто метки вершин состоят из одной буквы, например, C, N, O, H --- и в этом случае скобки не нужны, хотя, если их поставить, ошибки не будет. Когда ставится метка, то связи, которые ведут к ней и от нее, становятся короче, чтобы не произошло наложения связи на метку. Основная работа по рисованию формул как раз и заключается в том, чтобы правильно вычислять размеры меток и в соответствии с ними адаптировать координаты отрезков, изображающих связи. К сожалению, в \TeX е нет чего-нибудь, похожего на массивы, и запомнить можно размеры только одной метки, относящейся к текущей вершине. Поэтому, когда при обходе формулы вершина попадается еще раз, то ее метку следует задавать снова. Если, например, обход формулы $$\stree{{HO}3N3\6}$$ ведется от вершины OH к N и далее по часовой стрелке с возвратом к N, то метка азота должна появиться в описании дважды: \verb"\stree{{HO}3N 1 3 5 7 9 11N}". Если не поставить последний {\tt N}, то связь на 11 часов наложится на первую метку азота, ибо тот факт, что в этом месте стоит метка, давно забыт. Впрочем, с помощью квадратных скобок почти любую формулу можно обойти так, чтобы метки вершин встретились только однократно. В нашем случае, например, подействует такая конструкция: \verb"\stree{{HO}3N [5] 1 3 5 7 9}". То, что заключено в квадратных скобках, как бы проходит незамеченным: после закрывающей скобки вспоминается вершина с меткой N и размеры этой метки, так что следующая связь на 1 час рисуется правильно. Внимательный читатель может заметить, что многие формулы в наших примерах (например, предыдущая) начинаются прямо с описания метки, а не с направления связи, что противоречит формальному синтаксису команды \verb"\stree". Здесь срабатывает маленький трюк: перед аргументом этой команды до начала его обработки ставится число {\tt 17} --- то есть направление фиктивной связи нулевой длины. Если первым в \verb"\stree" стоит направление или префикс, то {\tt 17} не произведет никакого действия, а если метка, то {\tt 17}\<метка> нарисует эту метку в текущей точке. Отметим еще один случай нарушения формального синтаксиса на примере выравнивания длинных меток. Метки, в которых более одного символа, можно по разному располагать относительно геометрического центра вершины. По умолчанию действует такое правило: если связь имеет наклон {\sl влево\/} (смещение связи по горизонтали меньше нуля), то с центром вершины совмещается центр самого правого символа метки, иначе (если связь вертикальна или имеет наклон вправо) --- самого левого. Это дает правильный результат в большинстве случаев, но все же не всегда. {\samepage \rpic[$\!$пиррол]{\stree{~'8/>13/>58`{NH}10}} Например, в гетероцикле пиррола, если обходить его от самой левой вершины по часовой стрелке, метка NH по умолчанию окажется выровненной по H, а не по N, как должно быть. Изменить вид выравнивания метки на противоположный можно префиксом {\tt `} (обратный апостроф): \verb"\stree{/>1 3/>5 8`{NH} 10}". Здесь есть нарушение правил: префикс {\tt `} стоит не перед направлением, а {\sl после\/} него (перед меткой). В этом случае нарушение оправдано, поскольку префикс {\tt `}, в отличие от остальных, влияет не на связь, а на метку, и значит его логичнее ставить перед меткой. Конструкция \verb"`8{NH}", конечно, тоже правильна, но менее очевидна, чем \verb"8`{NH}". Кроме того, особый статус префикса {\tt `} позволяет применять его, если описание структуры начинается с метки (в этом случае по умолчанию метка выравнивается по правому символу). Заметим, что право стоять после направления связи распространяется только на префикс {\tt `} --- любой же другой в этом положении будет считаться началом описания следующей связи. \rpic{\stree{/>13/>58``{NH}10}} Но вернемся к формуле пиррола. Возможно, вам покажется, что центрированная метка NH (как в этом абзаце) выглядит лучше. Такой эффект достигается за счет {\sl двух\/} префиксов {\tt `}: \ldots\ \verb"8``{NH}"\ \ldots\ (в этом случае метка рассматривается как единое целое, и ее центр совмещается с центром вершины). На самом деле можно получить и более тонкие эффекты, если воспользоваться \TeX овскими боксами, кернами и клеем (дальнейшие объяснения в этом разделе расчитаны на то, что вы знакомы с этими понятиями). \rpic{\stree{/>1 3/>5 8``{\vtop{\baselineskip=0pt \hbox{N}\hbox{H}}}10}} На самом деле обе ранее приведенные формулы пиррола не очень хороши. Метка NH слишком широкая, и, вероятно, ее лучше расписать по вертикали, как здесь. Чтобы поставить N на H потребовалась следующая довольно длинная конструкция: \0stree\1/>1 3/>5 8``\1\0vtop\1\0baselineskip=0pt \0hbox\1N\2\0hbox\1H\2\2\2 10\2\rm.\par} Сделаем необходимые объяснения. Два апострофа перед меткой нужны для того, чтобы предотвратить центрирование по первому или последнему символу --- в данном случае ничего хорошего из этого бы не вышло.\footnote{Процесс выделения первого или последнего символа ({\sl токена\/}, если быть точным) несколько грубоват, поэтому если вы сами строите метку из боксов, то его лучше отключать. Вообще говоря, предусмотрено и <<автоматическое>> отключение, если в метке находится примитив \TeX а \0hbox\rm, или любая макрокоманда, при раскрытии которой получается \0hbox\rm\ (например, \0rlap\rm\ или \0llap\rm). Предполагается, что если вы ставите внутри метки \0hbox\rm\ или то, что в него раскрывается, то, значит, вы сами хотите управлять размещением метки. Этот метод угадывания мыслей небезупречен: так, \0hbox\rm\ обнаруживается только в том случае, если он находится на самом внешнем уровне вложенности. В нашем примере \0hbox\rm\ спрятан внутри \0vtop\rm, поэтому остается два варианта избежать выделения крайнего токена: задать перед \0vtop\rm\ пустой \0hbox\rm\ или, что проще, поставить два апострофа.} Примитив \TeX а \verb"\vtop" делает вертикальный бокс, выровненный по самому верхнему из составляющих его боксов, в нашем случае --- по \verb"\hbox{N}" (то есть базовые линии \verb"\hbox{N}" и всего \verb"\vtop" совпадут). Иными словами, высота метки, заключенной в бокс \verb"\vtop", совпадет с высотой \verb"\hbox{N}", а глубину метки составят глубина \verb"\hbox{N}" плюс глубина и высота \verb"\hbox{H}". При расположении метки ее глубина игнорируется, поэтому центр вершины как раз совпадет с центром символа N\@. Присваивание \verb"\baselineskip=0pt" здесь нужно для того, чтобы расстояние между N и H не получилось, как между строками в обычном тексте. Интересно, что практически тот же результат можно получить с помощью невидимой связи длиной три квадрата (\verb"\stree{/>1 3/>5 8N [~-0-3H] 10}"), но с одним различием: при смене шрифта расстояние между N и H может измениться. Вот теперь про метки сказано действительно все! \section{Команды} \begin{table}\centering {\bf Таблица 3.} Значения имеющихся команд.\par\bigskip \begin{tabular}{rl|rl|rl} \verb"\ph"&\stree{3\ph'9}&\verb"\tbu"&\stree{3\tbu}&{\tabcolsep=0pt \begin{tabular}{r}\verb"\O"\\\verb"\CO"\end{tabular}}&\stree{3\O'11'7}\\ &&&&\\ \hline &&&&\\ \verb"\pho"&\stree{3\pho'9}&\verb"\tbx"&\stree{3\tbx}&\verb"\OH"&\stree{3\OH}\\ &&&&\\ \hline &&&&\\ {\tabcolsep=0pt \begin{tabular}{r}\verb"\six"\\\verb"\6"\end{tabular}}&\stree{3\6'9}& \verb"\ip"&\stree{3\ip}&\verb"\COOH"&\stree{3\COOH}\\ &&&&\\ \hline &&&&\\ &&\verb"\Me"&\stree{3\Me}& \end{tabular} \end{table} Вместо метки в качестве суффикса может стоять команда. Напомним, что командой в \TeX е считается последовательность из сигнального символа \verb"\" и либо одной не-буквы, либо нескольких букв, после которых должна идти не-буква (например, команда \LaTeX а \verb"\\" относится к первому случаю, а \verb"\section" --- ко второму). В макросе \treeTeX\ особые команды могут использоваться {\sl внутри\/} общей команды \verb"\stree" для того, чтобы упростить ввод некоторых фрагментов (см.\ табл.\ 3). Все фрагменты в этой таблице, кроме трех циклических из первой колонки, являются одновалентными заместителями, поэтому соответствующие команды устроены так, что после них текущая вершина не меняется. Вообще-то, последнее верно и для циклических фрагментов, хотя их и нельзя считать одновалентными. Не совсем очевидно, например, что для получения цикла <<на ножке>> нужно вначале задать связь, а потом и команду в том же направлении (так, бифенил {\bondlen=3.5mm\stree{9\ph 33\ph}} вводится как \verb"\stree{9\ph 33\ph}"). С другой стороны, такая трактовка циклов дает некоторые удобства, ибо позволяет легко вводить структуры с конденсированными циклами и циклы с одним гетероатомом: $$ \begin{tabular}{cc} \stree{10\6 2\6}&\stree{N3\6 9\Me}\\ \verb"\stree{10\6 2\6}"&\verb"\stree{N3\6 9\Me}" \end{tabular} $$ Фрагмент, отвечающий команде, рисуется в направлении, которое стоит перед ней (все рисунки в таблице 3 получены для направления на 3 часа). Иногда от направления зависит и вид метки (например, если сказать \verb"\stree{9\OH}", то получится \stree{9\OH}, а если \verb"\stree{3\OH}" --- то \stree{3\OH}) или даже взаимная ориентация меток, как в случае с командой \verb"\COOH", при использовании которой кислород карбонильной группы всегда оказывается сверху (пример --- кислота $$\stree{10\COOH 2\COOH},$$ которая вводится как \verb"\stree{10\COOH 2\COOH}"). Определение команды \verb"\COOH" полезно рассмотреть полностью, если вы хотите узнать, что происходит внутри \treeTeX а: \begin{verbatim} \def\COOH#1{{% аргумент #1 = направление (в часах) \ang=#1 % запомнить направление \b\ang[C] % провести связь с меткой C на конце \ifnum\ang>6 % если больше шести часов (наклон влево), то \rot2 % поворот на два часа вправо по часовой стрелке, {\bt2\b\ang[O]} % вначале рисуем карбонильную группу =O, \rot8 % поворот на 8 часов вправо (= 4 влево), \OH\ang % и рисуем группу OH \else % а иначе делаем наоборот: \rot2 % поворот на два часа вправо, \OH\ang % вначале группа OH, \rot8 % затем поворот, {\bt2\b\ang[O]} % и потом =O \fi}} \def\OH#1{{\ifnum#1>6\b{#1}[HO]\else\b{#1}[OH]\fi}} \end{verbatim} % Три макрокоманды, использованные в данном примере, необходимо объяснить. Самая главная из них --- \verb"\b", которая собственно и рисует связи и имеет два параметра: первый, направление связи --- обязательный, а второй --- метка вершины, заключаемая в квадратные скобки --- может отсутствовать. В качестве первого параметра обычно выступает целая переменная \verb"\ang", означающая текущее направление связи. Использование переменной, а не абсолютных значений для этой цели позволяет сделать описание фрагмента зависящим от исходного направления, которое передается с первым аргументом команды. После присваивания \verb"\ang=#1" эта переменная далее только увеличивается или уменьшается, что соответствует вращению текущего направления на целое число часов. Эти операции обычно выполняются не явно, а с помощью команды \verb"\rot", которая гарантирует, что результирующее значение \verb"\ang" останется в пределах 11-ти. То, что связи фрагмента проводятся не в абсолютных, а относительных направлениях, объясняет, почему перед командой нельзя задавать направление в смещениях: его не так просто повернуть на целое число часов. Строго говоря, это ограничение не относится к фрагментам с одной связью (в этом случае единственная связь рисуется в исходном направлении, без всяких поворотов). %Например, можно получить такой %интересный результат: $\stree{-0-3\OH 3 -0+3\OH 3 -0-3\OH +9-0\Me}$, если %сказать \verb"\stree{-0-3\OH 3 -0+3\OH 3 -0-3\OH +9-0\Me}". В определении \verb"\COOH" осталась необъясненной еще команда \verb"\bt2", которая используется для рисования группы \stree[b]{=3O}\ и означает, что следующая связь должна быть двойной центрированной (это соответствует действию префикса {\tt =}). На самом деле можно влиять и на другие атрибуты связи (видимость, толщина, и т.\ д.) с помощью нескольких управляющих переменных. Сами эти переменные и смысл их значений здесь не приводятся: это слишком специальные сведения, и при необходимости их можно узнать, обратившись к файлу-источнику {\tt stree.sty}. Приведенные здесь определения команд \verb"\COOH" и \verb"\OH" заключены в дополнительные фигурные скобки, что обеспечивает вспоминание текущей вершины после того, как команда отработает. Отметим также, что внутри \verb"\COOH" используется более простая команда \verb"\OH". Логика последней достаточно проста и заключается только в выборе метки OH или HO в зависимости от направления связи. Набор команд для рисования фрагментов может показаться бедным и непредставительным. Действительно, это верно, но кажется, что этот список и не стоит расширять. Описание структур на уровне отдельных связей и так является достаточно лаконичным, чтобы применение макрокоманд могло дать заметные преимущества в краткости или простоте. Польза от макрокоманд остается максимальной, пока их немного, все они простые и часто используются. В этом случае команды легко удержать в голове и применять, почти не задумываясь. Сказанное выше не значит, однако, что создание новых команд (кроме уже имеющихся) для \verb"\stree" совсем лишено смысла. Следующий пример поясняет, о чем может идти речь. Пусть требуется нарисовать некий граф, вершины которого отмечены жирными точками:$$\def\*#1{\b{#1}[$\bullet$]} \stree{\*5\*[7\*]3\*1\*3\*5\*7\*9\*11\*}$$ Точке отвечает математический символ \verb"$\bullet$", и вы можете, конечно, честно начать набирать все это как \verb"{$\bullet$} 5{$\bullet$} [7{$\bullet$}" \ldots, однако проще сначала определить команду \verb"\*" для рисования жирной точки в данном направлении таким образом, \begin{verbatim} \def\*#1{\b{#1}[$\bullet$]} \end{verbatim} чтобы потом всю структуру набрать короче: \begin{verbatim} \stree{\*5\*[7\*]3\*1 \*3\*5\*7\*9\*11\*}. \end{verbatim} На самом деле команды-суффиксы могут иметь не один параметр (направление), а два: если сразу после команды стоит открывающая фигурная скобка, то все, что находится до закрывающей скобки, рассматривается как второй параметр. Покажем одно довольно неожиданное и далекое от химии использование этого факта. Если следующим образом % \begin{verbatim} \def\(#1,#2){\sx#1\sy#2\ab30[]} % связь со смещением (#1,#2) \def\dB#1[#2]{\(15,0)\(0,-6)\(-3,-3)\(-27,0)\(0,6)\(3,3) \(12,0)\bmode-1 \dmode2 \sy-5 \ab30[#2]\bmode-1 \(0,-4)} \end{verbatim} % определить команду \verb"\dB" для рисования прямоугольника с двумя срезанными углами и с надписью внутри, то потом можно будет легко вводить блок-схемы типа $$ \def\(#1,#2){\sx#1\sy#2\ab30[]} \def\dB#1[#2]{\(15,0)\(0,-6)\(-3,-3)\(-27,0)\(0,6)\(3,3)\(12,0) \bmode-1 \dmode2 \sy-5 \ab30[#2]\bmode-1 \(0,-4)} \stree{::-0-3 0\dB{база данных} ::-0-3 [-20-0::-0-3 0\dB{структуры}-0-3] +20-0::-0-3 0\dB{спектры}-0-3} $$ набирая их как химические формулы: \begin{verbatim} \stree{::-0-3 0\dB{база данных} ::-0-3 [-20-0::-0-3 0\dB{структуры}-0-3] +20-0::-0-3 0\dB{спектры}-0-3} \end{verbatim} Сделаем необходимые комментарии: переменные \verb"\sx" и \verb"\sy" содержат смещения, которые используются при проведении связи, если ее направление равно условному значению 30 часов. Присвоение \verb"\bmode-1" позволяет получить невидимую связь, а в результате \verb"\dmode2" метка вершины получается центрированной. Упоминанием такого необычного приклада команды \verb"\stree" мы закончили рассмотрение всех трех компонент (\<префикс>, \<направление>, \<суффикс>) в описании отдельных связей. Далее осталось совсем немного: отметить особенности \verb"\stree" в целом: способы выравнивания и использования в других конструкциях \LaTeX а. \section{Выравнивание} Команда \verb"\stree" (с помощью окружения \LaTeX а \verb"picture") производит \verb"\hbox", высота которого немного (на {\tt 1ex}) больше глубины. Чаще всего это срабатывает правильно, особенно если несколько структур являются частью выделенной математической формулы, как в следующем примере $$ \stree{9\6 3\OH}+\stree{9\OH 1\O 5\Me}\longrightarrow\ \stree{9\6 3O 3 1\O 5\Me}+\stree{{H$_2$O}}\ ,$$ который вводится как \begin{verbatim} $$ \stree{9\63\OH}+\stree{9\OH1\O5\Me}\longrightarrow \stree{9\63O31\O5\Me}+\stree{{H$_2$O}} $$ \end{verbatim} Все формулы в этом примере оказались вертикально выровнены по своим центрам. На самом деле способ выравнивания можно задать явно, если ввести одну из букв {\tt t}, {\tt b}, {\tt c} или {\tt u} в квадратных скобках сразу после команды \verb"\stree" (и перед ее обязательным аргументом). В соответствии с соглашениями \LaTeX а, {\tt [t]} означает выравнивание по верхушке, {\tt [b]} --- по дну, а {\tt [c]} --- по центру бокса. По умолчанию действует выравнивание по центру (поэтому {\tt [c]} задавать не обязательно). Другие способы (по верхушке и дну) обычно пригождаются при составлении таблиц. Параметр {\tt [u]} означает отсутствие выравнивания: команда \verb"\stree[u]{"\<описание>\verb"}" дает бокс нулевых размеров, точка привязки которого сопрадает с исходной вершиной в описании структуры. Это полезно для случая, когда \verb"\stree" сама является частью другого рисунка, отдельные элементы которого должны быть привязаны к координатам вершин структуры. Если известны координаты хотя бы одной вершины, то их можно легко вычислить и для всех остальных, учитывая то, что вершины расположены в узлах сетки с шагом 1 квадрат ($1/6$ расстояния \verb"\bondlen"). Параметр {\tt [u]} гарантирует знание места начальной вершины, а другие параметры --- не всегда, так как при выравнивании бокс, который дает \verb"\stree", включает в себя целиком метки вершин и вообще все символы, имеющиеся в формуле. Использование {\tt [u]}, однако, не всегда удобно, поскольку появляется необходимость самому следить за размерами формулы. Существует способ, избавленный от этого недостатка. Вместо одной команды \verb"\stree" с описанием внутри можно написать \verb"\begstr \tree{" \<описание> \verb"} \endstr", а перед \verb"\endstr" (или после \verb"\begstr") вставить любые команды \LaTeX а с учетом того, что координата (0,0) отвечает начальной вершине, а единица измерения \verb"\unitlength" совпадает с длиной связи \verb"\bondlen" (иными словами, равна 6 квадратов). В следующем примере такой способ использован для того, чтобы выделить пунктирным прямоугольником фрагмент структуры: $$ \begstr \tree{9\OH1//2[~/7{$R_1$}]4[0~2][6]/2539>760/108[-4-5/118~9{$F_1$}]//1011} \put(-2,-2){\dashbox{0.2}(4.8,3.8){}} \endstr $$ Это изображение вводится следующим образом: \begin{verbatim} \begstr \tree{9\OH1//2[~/7{$R_1$}]4[0~2][6]/2539>760/108 [-4-5/118~9{$F_1$}]//1011} \put(-2,-2){\dashbox{0.2}(4.8,3.8){}} \endstr \end{verbatim} \section{Другие возможности} Поскольку настоящее изложение связано с химией, отметим возможность ввода в \treeTeX е масс-спектров и спектров \CNMR. Например, спектр $$ \massp{220-18!187-33!135-26!133-25,121-100!14,2,107-38!43-35,41-41!} $$ получается в результате \begin{verbatim} \massp{220-18!187-33!135-26!133-25,121-100!14,2, 107-38!43-35,41-41!} \end{verbatim} Это просто последовательность чисел, разделенных знаками препинания. Если после числа стоит тире, то оно воспринимается как массовое число ($m/z$) пика, иначе --- как его интенсивность (в процентах к максимальному пику). Восклицательный знак отличается от запятой тем, что в первом случае над пиком на рисунке будет написано значение его $m/z$. Если после одного масового числа стоит несколько чисел, означающих интенсивности (в нашем примере --- {\tt 121-100!14,2,}), то имеется в виду последовательность пиков с возрастающими $m/z$. Это позволяет экономить место, не вводя массовое число, если оно на единицу больше предыдущего. Если последний знак во вводе --- запятая, то ее ставить не обязательно. Вид рисунка масс-спектра управляется четырьмя параметрами: \begin{itemize} \item \verb"\mzlen" --- расстояние между соседними линиями, $m/z$ которых отличается на 1 (по умолчанию \verb"\mzlen=0.6pt"), \item \verb"\imax" --- высота максимального пика в единицах \verb"\mzlen" (по умолчанию \verb"\imax=50"), \item \verb"\numfnt" --- шрифт, которым набираются все цифры на рисунке (по умолчанию \verb"\def\numfnt{\small}"), \item \verb"\msdir" --- направление, в котором рисовать пики спектра. \end{itemize} % Послендий параметр используется редко. По умолчанию \verb"\msdir=1", что означает обычное направление --- вверх; при любом другом значении пики будут направлены вниз. Иногда для визуального сравнения двух масс-спектров их удобно расположить зеркально относительно общей шкалы: $$ \begms \mass{39-11,0,21,51-5,7,15,64-5,35,7,77-10,5,91-4,74!27,104-6, 119-26,132-42,4,159-26,81!8,176-15,187-93!12,204-4,232-100!14} \put(-1,0){\line(1,0){250}}\msdir=-1 \mass{39-16,51-7,6,15,65-11,8,77-5,92-73!24,104-9,119-15, 132-21!159-26,100!14,176-16,187-83!14,204-3,232-70!}\vpos=1 \endms $$ Этот реальный пример сравнения экспериментального (сверху) и предсказанного спектров был введен следующим образом: % \begin{verbatim} \begms \mass{39-11,0,21,51-5,7,15,64-5,35,7,77-10,5,91-4,74!27,104-6, 119-26,132-42,4,159-26,81!8,176-15,187-93!12,204-4,232-100!14} \put(-1,0){\line(1,0){250}}\msdir=-1 \mass{39-16,51-7,6,15,65-11,8,77-5,92-73!24,104-9,119-15, 132-21!159-26,100!14,176-16,187-83!14,204-3,232-70!}\vpos=1 \endms \end{verbatim} % По аналогии с командой \verb"\stree", вместо \verb"\massp{" \<аргумент> \verb"}" можно писать \verb"\begms \mass{" \<аргумент> \verb"} \scale1{} \endms", а между \verb"\begms" и \verb"\endms" вставлять любые команды \LaTeX овского окружения {\tt picture}. В нашем примере вместо \verb"\scale1{}", которая рисует обычную шкалу с рисками и числами, мы провели просто горизонтальную линию (ее длина --- округленное в большую сторону значение наибольшего массового числа в спектре), а затем нарисовали еще один масс-спектр, который получился вверх ногами, потому что перед ним стояло \verb"\msdir=-1". Наконец, последнее присваивание \verb"\vpos=1" означает, что весь рисунок должен выравниваться по низу (то есть глубина бокса равна нулю). Конечно, при использовании самой команды \verb"\massp" выравниванием можно управлять обычным способом с помощью необязательного параметра в квадратных скобках ({\tt b}, {\tt c} или {\tt t}, по умолчанию {\tt c}), но на на немного более низком уровне, на который пришлось спуститься в последнем примере, действует переменная \verb"\vpos" (это же относится и к разложению \verb"\stree" на \verb"\begstr", \verb"\tree" и \verb"\endstr"). Она может принимать три значения: 0 --- выравнивание по центру (соответствует параметру {\tt [c]}), 1 --- по дну ({\tt [b]}), 2 --- по верхушке ({\tt [t]}) и 3 --- без выравнивания (действует только для структурных формул и отвечает параметру {\tt [u]}). В \treeTeX е можно также вводить очень упрощенные схематические рисунки спектров \CNMR\ наподобие следующего (высота пиков здесь отражет мультиплетности сигналов): $$ \cnmrs{2000}{1912s1645s354d1041s{\llap{$^b\searrow$}}% 901s138q1576s1703s575q912d1047d{$*$}566q1696s1956s571q953s395t} $$ Приведем соответствующий исходный текст: % \begin{verbatim} \cnmrs{2000}{1912s1645s354d1041s{\llap{$^b\searrow$}}% 901s138q1576s1703s575q912d1047d{$*$}% 566q1696s1956s571q953s395t} \end{verbatim} % Команда \verb"\cnmrs" имеет два обязательных параметра: первый --- длина шкалы (в десятых от м.\ д.),\ а второй --- описание спектра, в котором для каждого сигнала задается значение химического сдвига, умноженное на 10 (должно быть целое число) и мультиплетность (одна из букв {\tt s} --- синглет, {\tt d} --- дублет, {\tt t} --- триплет и {\tt q} --- квартет). После знака мультиплетности в фигурных скобках можно поставить метку пика (в нашем случае конструкция \verb"\llap{$^b\searrow$}" понадобилась для того, чтобы метка пришлась слева от синглета 104.1 м.\ д.\ и не наложилась на соседний дублет, помеченный звездочкой). Способы ввода рассмотренных двух видов спектров немного похожи (по сути дела, и здесь, и там --- последовательность чисел с разделителями), однако есть и отличия. Так, длинную команду \verb"\massp" можно в любом месте разбить на строки, а внутри \verb"\cnmrs" конец строки нежелателен, и его (как в приведенном случае) надо маскировать знаком комментария (символом \verb"%"). Кроме того, в \verb"\cnmrs" длина шкалы (и, значит, всего рисунка) всегда задается явно, но этого нельзя сделать при вводе масс-спектра. Его размер вычисляется по наибольшему массовому числу спектра. Если необходимо получить несколько рисунков масс-спектров одинакового размера, можно обмануть машину, указав при вводе пик нулевой интенсивности с нужным значением $m/z$. Например, закончив ввод масс-спектра выражением \verb"250-0}", вы получите шкалу длиной 250 $m/z$ (если, конечно, в спектре не было пика с б\'ольшим массовым числом). \section{Обсуждение результатов} Один из вопросов, который может возникнуть при знакомстве с настоящей работой, формулируется примерно так: зачем изучать какой-то <<птичий язык>> для ввода структурных формул, когда есть много удобных программ для наглядного редактирования, почти не требующих освоения? По сути дела, это старый спор о преимуществах и недостатках командного интерфейса по сравнению с графическим. Опытные программисты хорошо знают, что с помощью языка команд всегда можно работать быстрее и эффективнее. На самом деле, однако, противоречия между двумя способами работы не существует, и в идеале хорошо всегда иметь обе возможности (замечательный пример их удачного совмещения --- оболочка Norton Commander). При подготовке научных публикаций обычно приходится иметь дело в основном со словами и символами. Структурные же формулы в химических статьях, подобно математическим формулам, чаще тоже удобнее рассматривать просто как элемент текста. Если вводить их всегда с помощью химического редактора, то придется часто переключаться из одной программы в другую. Даже если предположить, что это происходит быстро и непринужденно (в реальности редко достижимый идеал), то изменение интерфейса с тектового на графический и обратно все равно потребует определенной психологической адаптации. В этом случае возможность ввести формулу прямо в тексте, не берясь за мышь и не превращаясь временно в чертежника, может сэкономить вам немало времени и нервной энергии. \begin{thebibliography} \frenchspacing \item Knuth, D. The \TeX book. Addison-Wesley, Reading (1984). Русский перевод: Дональд Е. Кнут. Все про \TeX. \item Lamport, L. \LaTeX: A Document Preparation System. Addison-Wesley, Reading (1984). По \LaTeX у вышло много книжек на русском языке. Вот часть из них: \item Ramek, M. In book: Clark, M. (ed.) \TeX: Applications, Uses, Methods. Ellis Horwood, London (1990), 277-- \item Haas, R. T.; O'Kane, K. C. Typesetting Chemical Equations Using \LaTeX. Comput. Chem., 11 (1987), \item Fujita, S. Typesetting Structural Formulas with the Text Formatter \TeX/LaTeX. Comput. Chem., 11 (1993), \end{thebibliography} \end{document}