Система описания химических формул для WEB.

Возможности, добавленные в версию 1.0

Описание возможностей, доступных в новых версиях CharChem

Версия 1.0 - Первая версия CharChem

CharChem - новая система, которая разработана для замены устаревшей easyChem. Естественно, в CharChem поддерживаются все функции прежней системы. Но добавились и новые возможности.

Скобки

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

K3[Fe(CN)6]

Описывать химические связи внутри скобок было невозможно. Но с версии 1.0 такая возможность появилась. Вот несколько примеров:

$ver(1.0)H3C(C=O)CH3
$ver(1.0)Cl/[\\<|Cl>]10/\Cl
$ver(1.0)--[O-/=\<`//`-`\\>-C<`|CH3><|CH3>-/=\<`//`-`\\>-O-C<`||O>]'n'--
$ver(1.0)$slope(45)HO`|@:Q()/<`|CH2OH>-O\<`/w<|OH>_(A180,w2)<_(y-.8)OH>`\ww>@()_(A60)O_(A-60)(@Q()_(A60)O<_(y1.4,N0){}>)'300-600'_(A-60)@Q()|OH
$ver(1.0)[H|N^+<`/H><_(A75,w+)H><\dH>]3^+_(x3.5,N0)[P<`||O><`/O`^-><_(A75,w+)O^-><_(A20,d+)O^->]^3-

Радикалы

Изначально существовала возможность описывать абстрактные молекулы, например {R}-OH: {R}-OH.
Этот же механизм использовался для описания радикалов. Например, {Me}2C=CH-{Ph} :

{Me}2C=CH-{Ph} <-> H3C\C<`/H3C>=CH-/=\`//`-`\\

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

Краткие описания связей

Рассмотрим несколько описаний, где используется горизонтальная химическая связь, которая определяется знаком минус:

\-/
\-/
\O-/
\O-/
\O-O/
\O-O/
_(A60)O_q6O_q6
_(A60)O_q6O_q6
\O--O/
\O--O/

Третья формула отличается от остальных тем, что горизонтальная связь является мягкой, как и в случае CH3-CH2-OH. Но в данном случае нужна обычная связь. Раньше вместо кратких описаний пришлось бы использовать более сложные конструкции, как в четвёртом столбце. Но теперь двойной минус позволяет указать, что связь не должна быть мягкой.

Другой проблемой кратких связей было использование суффиксов. Рассмотрим ряд конструкций. Сверху приводится описание, которое требовалось в версиях ниже 1.0. В нижнем ряду - новый вариант.

/w_(A30,w-) \d_(A-30,d-) $L(1.5)|vN_(A0,C+)H_(A-90,C-) -_p_(P,w+)_(P,w-)_p
/w\ww \d/dd $L(1.5)|vN--vvvH`|vv -_p_pw_pww_p
/w\ww \d/dd $L(1.5)|vN--vvvH`|vv -_p_pw_pww_p

Другими словами, если \w соответствует конструкции _(A30,w+), то двукратное употребление w позволяет изменить направление: \ww соответствует _(A30,w-).
Для координационной связи возможно тройное употребление суффикса v, что даёт стрелки на обоих концах связи. То есть -vvv соответствует _(A0,C+).

Кроме того в версии 1.0, суффиксы стали доступны для полиномиальных связей _p и _q.

Распределённые связи

До версии 1.0 можно было изобразить распределённую связь лишь при помощи конструкции _o. Это всегда окружность. Например:

/\</>|`/`\`|_o

Теперь стала доступна новая конструкция _s(). Она позволяет изобразить распределённую связь не только в виде круга. Кроме того, возможно использовать прерывистую линию при помощи параметра S:

_(x2)\<->`/_(x-2)`\/_s() /\</>|`/`\`|_s(S:) -\<->`/`-_s(S:) $slope(45)-\|`/`-`\`|/_s(#1;2;5;6;1)
_(x2)\<->`/_(x-2)`\/_s() /\</>|`/`\`|_s(S:) -\<->`/`-_s(S:) $slope(45)-\|`/`-`\`|/_s(#1;2;5;6;1)

Сложные стили связей

Для отображения ароматических связей можно использовать универсальное описание с параметром S|: (Style), где указан стиль двух линий. Одна сплошная, другая - прерывистая. _(A90,S|:)_(A30,S|:)_(A-30,S|:)_(A-90,S|:)

_(A90,S|:)_(A30,S|:)_(A-30,S|:)_(A-90,S|:)

Параметр S|: визуально напоминает две параллельных линии, проведённых сверху вниз.

Вот ещё несколько примеров:
_(y1.5,S:|:) _(y1.5,S||:) _(y1.5,SI|) _(y1.5,SI|:)
_(y1.5,S:|:) _(y1.5,S||:) _(y1.5,SI|) _(y1.5,SI|:)

Здесь заглавная латинская буква I означает жирную линию.

Изогнутые связи

В версии 1.0 можно использовать связи, изображаемые кривыми линиями. Для этого используются промежуточные точки. Изогнутая связь рисуется при помощи кубической кривой Безье. Поэтому для неё нужны две промежуточные точки. Для их описания используется конструкция _m(). В скобках можно использовать параметры для позиционирования точки: x, y, A, a, P. Например, описание H2C`|H2C`|H2C_m(x2)_m(y2)_(x-2)

H2C`|H2C`|H2C_m(x2)_m(y2)_(x-2) H2C`|H2C`|H2C_m(x2)_m(y2)_(x-2)_(x2,H){b}_(y-2,H){a}_(x-2,H) H2C`|H2C`|H2C_(x2,H,C){o}_(y2,H,C){o}_(x-2,H,C)
На первой картинке результат, полученный из описания.
На второй картинке показаны промежуточные точки a и b соответственно.
На третьей - схематические линии, показывающие порядок следования промежуточных точек.

Выравнивание двойных связей

Посмотрим на типичную формулу бензола, полученную из описания /\\|`//`\`|| :

/\\|`//`\`||

Мы видим, что у двойных связей внутренняя линия короче, чем внешняя. Это сделано для улучшения внешнего вида формулы. Причём, система автоматически определила, что в данном случае нужно применить выравнивание вправо (относительно направления связи).

Этим процессом можно управлять при помощи функции $dblAlign или при помощи параметров универсальных описаний связей.

$dblAlign(R)/\\|`//`\`|| $dblAlign(M)/\\|`//`\`|| $dblAlign(L)/\\|`//`\`|| /_(A30,N2r)|_(A150,N2m)`\_(A-90,N2L)
$dblAlign(R)/\\|`//`\`|| $dblAlign(M)/\\|`//`\`|| $dblAlign(L)/\\|`//`\`|| /_(A30,N2r)|_(A150,N2m)`\_(A-90,N2L)
Первая формула совпадает с автоматическим вариантом, т.к. в ней указано выравнивание вправо при помощи $dblAlign(R).
Вторая формула имеет выравнивание по центру. Так выглядели формулы в easyChem.
Для третьей формулы указано выравнивание влево.
А в четвёртой формуле мы видим все три вида выравнивания. Это достигается уже не функциями $dblAlign, а универсальными описаниями с параметрами N2r, N2m и N2L соответственно.

А далее можно видеть использование суффиксов r, m и L в параметре S (style).

_(A30,S:|r)_(A90,S:|r)_(A30,S:|r) _(A30,S:|m)_(A90,S:|m)_(A30,S:|m) _(A30,S:|L)_(A90,S:|L)_(A30,S:|L)
_(A30,S:|r)_(A90,S:|r)_(A30,S:|r) _(A30,S:|m)_(A90,S:|m)_(A30,S:|m) _(A30,S:|L)_(A90,S:|L)_(A30,S:|L)

Изотопы

В easyChem была введена функция $M, позволяющая указать атомную массу для изотопов.
Например, $M(14)C$M(14)C или $M(235)U$M(235)U

Теперь добавилась функция $nM, которая выводит ещё и атомный номер.
$nM(14)C$nM(14)C или $nM(235)U$nM(235)U
Причём, указывать атомный номер не нужно, т.к. системе он и так известен для каждого элемента.

Заряды

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

H3C\<|wNH3`^+o>/`|O|\O^-o

H3C\<|wNH3`^+o>/`|O|\O^-o

Гидраты, сольваты и аддукты

В ранних версиях знак * должен был отделяться пробелом от описания молекулы. Такое ограничение не позволяло описать гидраты в виде одного реагента, что иногда создавало некоторые проблемы.
Теперь знак * можно использовать без пробелов:

CuSO4*5H2O LiCl*4CH3OH K2O*Al2O3*'x'SiO2*'у'H2O
CuSO4*5H2O LiCl*4CH3OH K2O*Al2O3*'x'SiO2*'у'H2O

Выравнивание реагентов по высоте

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

2H\N<`/H>_(A0)H + $slope(45)H-O\S/O`/\O`\`/O`-H -> (NH4)2SO4

Но так происходит не всегда. Например, если немного повернуть первый реагент, то внешний вид станет хуже.

2H/N<`|H>\H + $slope(45)H-O\S/O`/\O`\`/O`-H -> (NH4)2SO4

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

2H/$C()$atomColor1(blue)N<`|H>\H + $slope(45)H-O\S/O`/\O`\`/O`-H -> (NH4)2SO4
2H/$C()N<`|H>\H + $slope(45)H-O\S/O`/\O`\`/O`-H -> (NH4)2SO4

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

2$C()$atomColor1(blue)H/N<`|$C()$atomColor1(blue)H>\H + $slope(45)H-O\S/O`/\O`\`/O`-H -> (NH4)2SO4
2$C()H/N<`|$C()H>\H + $slope(45)H-O\S/O`/\O`\`/O`-H -> (NH4)2SO4