ベンゼン環と化学反応式

ベンゼン環を含む化学反応式や構造式を描きます。

まず,ベンゼン環を描く関数を作ります。引数として,KeTCindyの一般的な関数にある,name と,表示位置,タイプ,回転角をつけます。回転角は30度の倍数で指定します。引数は全部指定しなくてもいいように,同名で引数の異なる関数を作っておきます。

benzen(name,pt):=benzen(name,pt,1,1);

benzen(name,pt,type):=benzen(name,pt,type,1);

benzen(name,pt,type,rot):=(

regional(r,vt,vt1,vt2,vt3,th,opt);

if(type==1,opt=[],opt=["Cutend=-0.1"]);

r=sqrt(3)/3;

vt=apply(1..7,th=pi/3*#-rot*pi/6;

r*[cos(th),sin(th)]);

vt1=apply(vt,pt+#);

vt2=apply(vt,pt+0.8*#);

vt3=apply(vt,pt+1.5*#);

Listplot("ben"+name,vt1);

if(type==3,

Circledata("ben"+name,[pt,pt+[0.4,0]]);

,

Listplot("ben1"+name,vt1);

Listplot("ben2"+name,[vt2_1,vt2_2],opt);

Listplot("ben3"+name,[vt2_3,vt2_4],opt);

Listplot("ben4"+name,[vt2_5,vt2_6],opt);

);

apply(1..6,[vt1_#,vt3_#]);

);

まず,3つのタイプを描きわけましょう。

benzen("1",[1,1],1);

benzen("3",[3,1],2);

benzen("5",[5,1],3);

もうひとつ,全体をコピーして,Listplot("ben3"+name,[vt2_3,vt2_4],opt);の先頭に // をいれてコメント化し,二本線を2ヶ所にしたものもbenzen2() として作っておきます。

いろいろな構造式や反応式を描いてみましょう。

メチルオレンジ

Expr([[-1.6,1],"e","(\rm{CH}_3)_2\rm{N}"]);

p=benzen("1",[1,1],2,4);

Listplot("1",p_2);

Listplot("2",p_5);

Letter([[2,1],"e","N=N"]);

p2=benzen("2",[4,1],2,6);

Listplot("3",p2_6);

Listplot("4",p2_3);

Expr([p2_3_2,"e","\rm{SO}_{3}^{-}Na^{+}"]);

フタル酸

p=benzen("1",[1,1],3);

Listplot("1",p_1);

Listplot("2",p_2);

Letter([p_1_2,"e","COOH",p_2_2+[0.4,0],"n","COOH"]);

フェナントレン

benzen("1",[0,0],1,3);

p=benzen2("2",[1,0]);

benzen2("3",p_1_1+[0,sqrt(3)/3],1,-1);

2-ナフトール

benzen("1",[0,0],1,3);

p=benzen2("2",[1,0]);

Listplot("1",p_1);

Letter([p_1_2,"e","OH"]);

フェノールと臭素の反応

Fontsize("l");

p=benzen("1",[0,0],1,3);

Listplot("1",p_3);

Letter([p_3_2+[0.2,0],"n","OH"]);

Expr([[0.9,0.3],"e","+3\rm{Br}_2"]);

Arrowdata("1",[[2.5,0.3],[3.5,0.3]],[1,1,1,1]);

p=benzen("2",[4.5,0.3],1,3);

Listplot("2",p_2);

Listplot("3",p_3);

Listplot("4",p_4);

Listplot("5",p_6);

Letter([p_2_2,"e","Br",

p_3_2+[0.2,0],"n","OH",

p_4_2,"nw","Br",

p_6_2+[0.1,0],"s2","Br",

[5.8,0.3],"e","+3HBr"]);

元素記号入りの構造式

略記号でなく,元素記号入りの構造式を描いてみましょう。正六角形の頂点と枝の位置をbenzen() の中で求めているので,同じようにやります。

vt=apply(1..7,th=pi/3*#+pi/6;[cos(th),sin(th)]);

vt2=apply(vt,0.9*#);

vt3=apply(vt,2*#);

repeat(6,s,

Listplot("b"+s,[vt_s,vt_(s+1)],["Cutend=0.3"]);

Listplot("bb"+s,[vt_s,vt3_s],["Cutend=0.3"]);

);

Listplot("1",[vt2_1,vt2_2],["Cutend=0.25"]);

Listplot("2",[vt2_3,vt2_4],["Cutend=0.25"]);

Listplot("3",[vt2_5,vt2_6],["Cutend=0.25"]);

Fontsize("l");

repeat(6,s,

Letter([vt_s,"c","C",vt3_s,"c","H"]);

);

< 戻る >