diff options
Diffstat (limited to 'Master/texmf-dist/metapost')
-rw-r--r-- | Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf | 258 |
1 files changed, 135 insertions, 123 deletions
diff --git a/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf b/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf index b3461a03db1..60b82397391 100644 --- a/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf +++ b/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% mcf2graph ver 4.01 Copyright (c) 2013-2016 Akira Yamaji +% mcf2graph ver 4.02 Copyright (c) 2013-2016 Akira Yamaji % % Permission is hereby granted, free of charge, to any person obtaining a copy of this software % and associated documentation files (the "Software"), to deal in the Software without restriction, @@ -32,17 +32,17 @@ tracingstats:=1; message " This is mcf2graph ver 4.0 2016.10"; %------------------------------------------------------------------------------------------------- -newinternal nA,nB,nC,nD,nE,nF,cntA,cntB,cntP,minX,minY,def_num,def_int,tbl_cnt; -pair posB[],posA[]; -numeric lineB[],sB[],eB[],angB[],angA[],strA[],str_wd[],lenB[],ang_br[],stock_para[], +newinternal nA,nB,nC,nD,nE,nF,cntA,cntB,cntM,minX,minY,def_num,def_int,tbl_cnt; +pair posB[],posA[],posM[]; +numeric lineB[],sB[],eB[],angB[],angA[],strA[],str_wd[],lenB[],ang_br[],save_para[], tbl_char_wd[],tbl_char_ht[],tbl_char_dp[],tbl_atom[],tbl_subst[][],tbl_atom_wt[], - comMC[][],parMC[][],cntMC[]; -string info[],tbl_atom_str[],com_str[],var[],tag[],mp_log_name,aux_delimiter; + comD[][],parD[][],cntD[]; +string info[],tbl_atom_str[],strD[],var[],tag[],mp_log_name,aux_delimiter; picture atom_font[],chem_structure; %------------------------------------------------------------------------------------------------- -sw_numberA:=sw_numberB:=sw_mol_frame:=sw_auxout:=sw_solid:=sw_expand:=sw_start_vector:=0; -char_num:=str_cnt:=proc_end:=sw_font_frame:=sw_atom_frame:=sw_checklist:=0; -sw_MOLout:=sw_subst_off:=sw_bond_single:=sw_auxfix:=sw_clip:=0; +char_num:=str_cnt:=proc_end:=sw_numberA:=sw_numberB:=sw_mol_frame:=sw_auxout:=sw_solid:=0; +sw_expand:=sw_font_frame:=sw_atom_frame:=sw_checklist:=sw_MOLout:=sw_subst_off:=sw_bond_single:=0; +sw_auxfix:=sw_clip:=0; numberA_start:=numberB_start:=1; numberA_end:=numberB_end:=4095; aux_max:=20; aux_delimiter:=";"; var1:="jobname"; tag1:="F"; var2:="char_num"; tag2:="C"; for i=3 upto aux_max: var[i]:=tag[i]:=""; endfor @@ -85,8 +85,8 @@ max_bond_length#:=10mm; bond_len#:=8mm#; max_inf_num:=12; for i:=1 upto max_inf_num: info[i]:=":"; endfor %-------------------------------------------------------------------------------------------------- def_emb_start:=500; % 500 => 2499 for embedded definition (max 2000) -def_usr_start:=2500; % 2500 => 2999 for user definition (max 500) -def_int_start:=3000; % 3000 => 4000 for internal definition (max 1000) +def_usr_start:=2500; % 2500 => 2999 for user definition (max 500) +def_int_start:=3000; % 3000 => 4000 for internal definition (max 1000) %-------------------------------------------------------------------------------------------------- def def_com(expr n)(text tx)= nA:=n; forsuffixes list=tx:: list:=nA; nA:=nA+1; endfor enddef; def_com(-4000)(_term,_jp_atom,_jp_atom_abs,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_chg_line, @@ -97,7 +97,7 @@ def_com(1)(si,dl,dr,dm,tm,wf,wb,bd,bz,zf,zb,dt,no,ar,vf,vb,wv,nl,si_,wf_,wb_,bd_ %-------------------------------------------------------------------------------------------------- def parameter_list= sw_checklist,sw_numberA,sw_numberB,sw_mol_frame,sw_auxout,sw_solid,sw_expand,sw_MOLout, - sw_start_vector,sw_atom_frame,sw_font_frame,sw_subst_off,sw_bond_single,sw_clip, + sw_atom_frame,sw_font_frame,sw_subst_off,sw_bond_single,sw_clip, margin_left_right,margin_top_bottom,ratio_atom_bond,ratio_thickness_bond,ratio_char_bond, ratio_chain_ring,max_bond_width,ratio_bondgap_bond,ratio_zebra_black,ratio_zebragap_bond, ratio_wedge_bond,ratio_atomgap_atom,ratio_bond_width, @@ -107,24 +107,22 @@ enddef; %-------------------------------------------------------------------------------------------------- vardef pic_c(expr i,s)= substring(i,i+1) of s enddef; %-------------------------------------------------------------------------------------------------- -nA:=0; for list=parameter_list: stock_para[incr nA]:=list; endfor +nA:=0; for list=parameter_list: save_para[incr nA]:=list; endfor def store_par(text t)= - nA:=0; for list=t: if stock_para[incr nA]<>list: stock_para[nA]:=list; fi endfor enddef; + nA:=0; for list=t: if save_para[incr nA]<>list: save_para[nA]:=list; fi endfor enddef; def restore_par(text t)= nA:=0; - forsuffixes list=t: if list<>stock_para[incr nA]: list:=stock_para[nA]; fi endfor enddef; + forsuffixes list=t: if list<>save_para[incr nA]: list:=save_para[nA]; fi endfor enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def beginfont(text s)= store_par(parameter_list); save_wd#:=font_wd#; save_ht#:=font_ht#; - f_beginchar:=inf_num:=0; + f_beginchar:=inf_num:=cntM:=0; for list=s: info[incr inf_num]:=list; endfor enddef; %-------------------------------------------------------------------------------------------------- def endfont= - if (sw_font_frame=1)or(sw_font_frame=3): AUX(0,0)(draw_frame(w,h,(0,0),thickness_font_frame);) fi - if (sw_font_frame=2)or(sw_font_frame=3): - AUX(0,0)(draw_frame(w-2margin_left_right,h-2margin_top_bottom, - (margin_left_right,margin_top_bottom),thickness_font_frame);) fi - if sw_font_frame=4: AUX(0,0)(draw_corner(w,h,thickness_font_frame);) fi + if (sw_font_frame=1)or(sw_font_frame=3): EXT(draw_frame((0,0),w,h,thickness_font_frame);) fi + if (sw_font_frame=2)or(sw_font_frame=3): EXT(draw_frame(p0,wd,ht,thickness_font_frame);) fi + if sw_font_frame=4: EXT(draw_corner(w,h,thickness_font_frame);) fi if (sw_auxout=1)or(sw_checklist=1)or(sw_MOLout=1): proc_calc_out; fi char_num:=char_num+1; currentpicture:=chem_structure; chem_structure:=nullpicture; endchar; clearit; @@ -155,24 +153,27 @@ def set_def_MC= def */secondary n == (_postC,n) enddef; def /*secondary n == (_postD,n) enddef; def **secondary n == (_postE,n) enddef; def */*secondary n == (_postF,n) enddef; enddef; -%------------------------------------------------------------------------------------------------- +%================================================================================================= vardef '(text s)= ''(incr def_num)(s); def_num enddef; +%------------------------------------------------------------------------------------------------- def ''(expr k)(text s)= begingroup if unknown inside_def_MC:: set_def_MC fi - cntMC[k]:=0; + cntD[k]:=0; for list==s:: if known list:: - if pair list:: comMC[k][incr cntMC[k]]:=xpart(list); parMC[k][cntMC[k]]:=ypart(list); + if pair list:: comD[k][incr cntD[k]]:=xpart(list); parD[k][cntD[k]]:=ypart(list); elseif numeric list:: if list>=def_emb_start:: - for i==1 upto cntMC[list]:: - comMC[k][incr cntMC[k]]:=comMC[list][i]; parMC[k][cntMC[k]]:=parMC[list][i]; + for i==1 upto cntD[list]:: + comD[k][incr cntD[k]]:=comD[list][i]; parD[k][cntD[k]]:=parD[list][i]; endfor - else:: comMC[k][incr cntMC[k]]:=_mk_bond; parMC[k][cntMC[k]]:=list; fi - elseif string list:: com_str[incr str_cnt]:=list; - comMC[k][incr cntMC[k]]:=_set_atom; parMC[k][cntMC[k]]:=str_cnt; - if pic_c(0,list)=="{":: str_wd[str_cnt]:=1.7; else:: str_wd[str_cnt]:=1; fi fi fi + else:: comD[k][incr cntD[k]]:=_mk_bond; parD[k][cntD[k]]:=list; fi + elseif string list:: strD[incr str_cnt]:=list; + comD[k][incr cntD[k]]:=_set_atom; parD[k][cntD[k]]:=str_cnt; + if pic_c(0,list)=="{":: str_wd[str_cnt]:=1.6; else:: str_wd[str_cnt]:=1; fi + fi + fi endfor endgroup enddef; @@ -222,16 +223,16 @@ vardef $$(text t)(expr e) = elseif (e>=?3)and(e<=?20):: for list==t:: !?(list)(e-?3+3) endfor elseif e==Ph1:: !?(t)(6) PA(_dl,-2) PA(_dl,-4) elseif e==Ph2:: !?(t)(6) PA(_dl,-1) PA(_dl,-3) PA(_dl,-5) - elseif comMC[e][1]==_fuse:: - if comMC[e][2]<=6:: for list==t:: !!?(list)(parMC[e][1])(comMC[e][2]) endfor - elseif (comMC[e][2]>=11)and(comMC[e][2]<=15):: - for list==t:: !??(list)(parMC[e][1])(comMC[e][2]) endfor + elseif comD[e][1]==_fuse:: + if comD[e][2]<=6:: for list==t:: !!?(list)(parD[e][1])(comD[e][2]) endfor + elseif (comD[e][2]>=11)and(comD[e][2]<=15):: + for list==t:: !??(list)(parD[e][1])(comD[e][2]) endfor fi fi elseif color e:: color_list[incr cntC]:=e; for list==t:: PA(_set_adr,list) PA(_set_colorB,cntC) endfor fi fi - cntMC[def_int]:=nA; + cntD[def_int]:=nA; def_int %------- Retern value ------- enddef; %------------------------------------------------------------------------------------------------- @@ -262,37 +263,56 @@ vardef @@(text t)(expr s)= PA(_set_clr,0) elseif color s:: color_list[incr cntC]:=s; for list==t:: PA(_set_adr,list) PA(_set_colorA,cntC) endfor fi fi - cntMC[def_int]:=nA; + cntD[def_int]:=nA; def_int %------- Retern value ------- enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -def AUX(expr a,b)(text s)=s addto chem_structure also currentpicture shifted(a,b); clearit; enddef; -def MCf(text s)= MCd(1,1)(.5,.5)(s); enddef; % MC fill draw -def MCd(expr RW,RH)(expr FW,FH)(text s)= proc_drawing(RW,RH)(FW,FH)(s); enddef; +def EXT(text s)= + begingroup + save wd,ht,n,p; pair p[]; wd:=w-2margin_left_right; ht:=h-2margin_top_bottom; + p0:=(margin_left_right,margin_top_bottom); n:=cntM; for i=1 upto n: p[i]:=posM[i]; endfor + s addto chem_structure also currentpicture; clearit; + endgroup; +enddef; +%-------------------------------------------------------------------------------------------------- +def ext(text s)= + begingroup + save wd,ht,n,a,p; numeric a[]; pair p[]; wd:=mol_wd; ht:=mol_ht; + p0:=(minX,minY); n:=cntA; for i=1 upto n: p[i]:=posA[i]; a[i]:=ang_br[i]; endfor + s addto chem_structure also currentpicture shifted (sftX,sftY); clearit; + endgroup; +enddef; +%================================================================================================= +def MCf(text s)= MCd(1,1)(.5,.5)(s) enddef; % MC fill draw %------------------------------------------------------------------------------------------------- -def proc_drawing(expr RW,RH)(expr FW,FH)(text s)= +def MCd(expr RW,RH)(expr FW,FH)(text TX)= begingroup - save com,par,adrA,adrB,f_bra,envT,envB,lenT,lineT,strAT,stkA,stkB,stkL,stkM,bondL,temp_len, - temp_cntB,f_end,f_term,rotT,adrS,f_lineT,f_rotT,f_lenT,f_envT,PP,angT,tempB,glu,sftX,sftY, - xpos,ypos,str_len,max_x,max_y,par_s,par_e,score_u,hat,f_char,lenB,ps_adr,ps_com,op_com, - op_par,op_cnt,crR,colorA,colorB,PA,PAs,PP,PG; - %----------------------------------------------------------------------------------------------- - def PA(expr a,b)= comMC[def_int][incr nA]:=a; parMC[def_int][nA]:=b; enddef; - def PAs(text t)= for list==t:: PA(xpart(list),ypart(list)) endfor enddef; - def PP(expr a,b)= op_com[cntP][incr op_cnt[cntP]]:=a; op_par[cntP][op_cnt[cntP]]:=b; enddef; - def PG(expr a,b)= comMC[0][incr cntMC[0]]:=a; parMC[0][cntMC[0]]:=b; enddef; + save com,par,adrA,adrB,f_bra,envT,envB,lenT,lineT,strAT,stkA,stkB,stkL,stkM,cntP, + bondL,temp_len,temp_cntB,f_end,f_term,rotT,adrS,f_lineT,f_rotT,f_lenT,f_envT,angT,tempB, + glu,sftX,sftY,xpos,ypos,str_len,max_x,max_y,par_s,par_e,score_u,hat,f_char,lenB, + ps_adr,ps_com,op_com,op_par,op_cnt,crR,colorA,colorB; %----------------------------------------------------------------------------------------------- numeric stkB[],stkA[],stkL[],stkM[],f_char[],ps_adr[],ps_com[],colorA[],colorB[], op_com[][],op_par[][],op_cnt[]; %----------------------------------------------------------------------------------------------- + save ww,ap,am,hpt,pA,pB,pC,pT,Ls,Le,dx,j,u,pairA,pairT; + pair Ls,Le,pairA,pairT; + path pA,pB,pC,pT; + %----------------------------------------------------------------------------------------------- + save PA,PAs,PP,PG; + def PA(expr a,b)= comD[def_int][incr nA]:=a; parD[def_int][nA]:=b; enddef; + def PAs(text t)= for list==t:: PA(xpart(list),ypart(list)) endfor enddef; + def PP(expr a,b)= op_com[cntP][incr op_cnt[cntP]]:=a; op_par[cntP][op_cnt[cntP]]:=b; enddef; + def PG(expr a,b)= comD[0][incr cntD[0]]:=a; parD[0][cntD[0]]:=b; enddef; + %----------------------------------------------------------------------------------------------- if (sw_numberA>=1)or(sw_numberB>=1): ratio_atom_bond:=0.25; fi if (sw_expand=1)or(sw_MOLout=1): expand_set; fi def_num:=def_usr_start; def_int:=def_int_start; par_s=ASCII("{"); par_e=ASCII("}"); score_u=ASCII("_"); hat=ASCII("^"); - cntA:=cntB:=cntP:=cntC:=0; com_str[0]:=""; str_cnt:=2000; crR:=-ratio_chain_ring; - %----------------------------------------------------------------------------------------------- - ''(0)(s,(_term,0)); proc_bond_atom(1); if (cntP>0)and(sw_subst_off=0): ps_get(1); fi + cntA:=cntB:=cntP:=cntC:=0; strD[0]:=""; str_cnt:=2000; crR:=-ratio_chain_ring; + %=============================================================================================== + ''(0)(TX,(_term,0)); proc_bond_atom(1); if (cntP>0)and(sw_subst_off=0): ps_get(1); fi define_pixels(font_wd,font_ht,thickness_font_frame); char_use_check; if sw_solid=1: bond_len#:=font_wd#*ratio_bond_width; @@ -309,7 +329,8 @@ def proc_drawing(expr RW,RH)(expr FW,FH)(text s)= if bond_len#>max_bond_length#: bond_len#:=max_bond_length#; proc_size_setup; proc_skeleton; proc_scaling; fi fi - proc_char_setup(char_pen_wd); + proc_char_setup; + %----------------------------------------------------------------------------------------------- if f_beginchar=0: if sw_clip=1: font_wd#:=font_wd#*((mol_wd+2margin_left_right)/font_wd); font_ht#:=font_ht#*((mol_ht+2margin_top_bottom)/font_ht); fi @@ -325,15 +346,15 @@ def proc_drawing(expr RW,RH)(expr FW,FH)(text s)= if i<10: draw_atom(i,posA[i],0,decimal(nA),1); else: draw_atom(i,posA[i]+(-.2atom_wd,0),0,decimal(nA),1); fi elseif sw_numberB>=1: - else: draw_atom(i,posA[i],ang_br[i],com_str[strA[i]],str_wd[strA[i]]); fi + else: draw_atom(i,posA[i],ang_br[i],strD[strA[i]],str_wd[strA[i]]); fi endfor sftX:=margin_left_right-minX+(w-mol_wd-2margin_left_right)*FW; sftY:=margin_top_bottom-minY+(h-mol_ht-2margin_top_bottom)*FH; - if sw_mol_frame=1: AUX(sftX,sftY)(draw_frame(mol_wd,mol_ht,(minX,minY),0.2pt);) fi - if sw_start_vector=1: AUX(sftX,sftY)(start_vector) fi + posM[incr cntM]:=(minX+sftX,minY+sftY); + if sw_mol_frame=1: ext(draw_frame(p0,wd,ht,0.2pt);) fi addto chem_structure also currentpicture shifted (sftX,sftY); clearit; - endgroup + endgroup; % <=added ";" enddef; %------------------------------------------------------------------------------------------------- def ps_put(expr n,p)= @@ -346,17 +367,17 @@ def ps_put(expr n,p)= enddef; %------------------------------------------------------------------------------------------------- def ps_get(expr n)= - nA:=cntP; nB:=cntMC[0]; + nA:=cntP; nB:=cntD[0]; for i=n upto cntP: PG(_jp_atom_abs,ps_adr[i]) PG(_push,1) for j=1 upto op_cnt[i]: PG(op_com[i][j],op_par[i][j]) endfor - for j=1 upto cntMC[ps_com[i]]: PG(comMC[ps_com[i]][j],parMC[ps_com[i]][j]) endfor + for j=1 upto cntD[ps_com[i]]: PG(comD[ps_com[i]][j],parD[ps_com[i]][j]) endfor PG(_pop,1) PG(_term,0) endfor proc_bond_atom(nB+1); if cntP>nA: ps_get(nA+1); fi enddef; %------------------------------------------------------------------------------------------------- -def draw_frame(expr LX,LY,PS,PN)= +def draw_frame(expr PS,LX,LY,PN)= draw ((PN/2,PN/2)--(LX-PN/2,PN/2)--(LX-PN/2,LY-PN/2)--(PN/2,LY-PN/2)--cycle) shifted PS wpss PN; enddef; %------------------------------------------------------------------------------------------------- @@ -365,9 +386,9 @@ def draw_corner(expr LX,LY,PN)= drawdot (LX-PN/2,LY-PN/2) wpss PN; drawdot (PN/2,LY-PN/2) wpss PN; enddef; %------------------------------------------------------------------------------------------------- -def start_vector= draw (posA[1] shifted (-1mm,0))--(posA[1] shifted (-4mm,0)) - withpen penrazor rotated 90 scaled .8mm; - fill (posA[1] shifted (-2mm,-1mm))--posA[1]--(posA[1] shifted (-2mm,1mm))--cycle; +def draw_vector(expr POS,ROT,LEN)= + fill (-2mm,-1mm)--(0,0)--(-2mm,1mm)--(-2mm,.4mm)--(-LEN,.4mm)-- + (-LEN,-.4mm)--(-2mm,-.4mm)--cycle rotated ROT shifted POS; enddef; %------------------------------------------------------------------------------------------------- def proc_size_setup= @@ -384,10 +405,11 @@ enddef; %------------------------------------------------------------------------------------------------- def proc_scaling= minX:=minY:=4095.999; max_x:=max_y:=-4095.999; - for i=1 upto cntA: xpos:=xpart(posA[i]); ypos:=ypart(posA[i]); + for i=1 upto cntA: + xpos:=xpart(posA[i]); ypos:=ypart(posA[i]); if strA[i]<>0: str_len:=nC:=nD:=0; - for j=0 upto length(com_str[strA[i]])-1: - nA:=ASCII(pic_c(j,com_str[strA[i]])); + for j=0 upto length(strD[strA[i]])-1: + nA:=ASCII(pic_c(j,strD[strA[i]])); if (nA=score_u)or(nA=hat)or(nA=par_s)or(nA=par_e): if (nA=hat)and(nC<.5atom_wd): nC:=.5atom_wd; fi; if (nA=score_u)and(nD<.5atom_wd): nD:=.5atom_wd; fi; @@ -408,15 +430,17 @@ enddef; def char_use_check= for i=1 upto 128: f_char[i]:=0; endfor if (sw_numberA>0)or(sw_numberB>0): for j=ASCII("0") upto ASCII("9"): f_char[j]:=1; endfor - else: for i=1 upto cntA: if strA[i]<>0: for j=0 upto length(com_str[strA[i]])-1: - f_char[ASCII(pic_c(j,com_str[strA[i]]))]:=1; endfor fi endfor fi + else: for i=1 upto cntA: if strA[i]<>0: for j=0 upto length(strD[strA[i]])-1: + f_char[ASCII(pic_c(j,strD[strA[i]]))]:=1; endfor fi endfor fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def proc_bond_atom(expr n)= f_bra:=f_end:=f_term:=rotT:=adrS:=f_lineT:=f_rotT:=f_lenT:=f_envT:=envT:=envB:=strAT:=0; stkL[0]:=bondL:=crR; lenT:=crR; sB[0]:=0; eB[0]:=1; lineT:=si; for i=0 upto 5: stkA[i]:=stkB[i]:=0; endfor - for i=n upto cntMC[0]: com:=comMC[0][i]; par:=parMC[0][i]; + %----------------------------------------------------------------------------------------------- + for i=n upto cntD[0]: + com:=comD[0][i]; par:=parD[0][i]; if com=_push: if par=1: stkL[adrS]:=bondL; stkA[incr adrS]:=adrA:=cntA; stkB[adrS]:=adrB:=cntB; elseif par=0: temp_len:=bondL; fi @@ -433,10 +457,10 @@ def proc_bond_atom(expr n)= elseif com=_jp_bond: tempB:=getB(par); sB[cntB+1]:=sB[tempB]; f_bra:=1; elseif com=0or_jp_atom: termA; sB[cntB+1]:=getA(par); f_bra:=1; elseif com=_jp_atom_abs: sB[cntB+1]:=par; f_bra:=1; temp_cntB:=cntB; - elseif com=_chg_atom: strA[getA(adrT)]:=parMC[par][1]; - elseif com=_N: strA[getA(par)]:=parMC[N][1]; - elseif com=_O: strA[getA(par)]:=parMC[O][1]; - elseif com=_S: strA[getA(par)]:=parMC[S][1]; + elseif com=_chg_atom: strA[getA(adrT)]:=parD[par][1]; + elseif com=_N: strA[getA(par)]:=parD[N][1]; + elseif com=_O: strA[getA(par)]:=parD[O][1]; + elseif com=_S: strA[getA(par)]:=parD[S][1]; elseif com=_H: ps_put(getA(par),H); elseif com=_chg_len: if par=_ring_len: bondL:=ringL; elseif par=0: if lenT<>crR: bondL:=lenT; else: if bondL<0: bondL:=1; fi fi @@ -477,7 +501,9 @@ def proc_skeleton= envT:=envB:=f_lineT:=f_rotT:=f_lenT:=f_envT:=stkM[0]:=0; lineT:=si; angA[0]:=angB[0]:=ang_br[0]:=0; posA[0]:=posB[0]:=posB[1]:=(0,0); for i=0 upto 5: stkA[i]:=stkB[i]:=0; endfor - for i=1 upto cntMC[0]: com:=comMC[0][i]; par:=parMC[0][i]; + %---------------------------------------------------------------------------------------------- + for i=1 upto cntD[0]: + com:=comD[0][i]; par:=parD[0][i]; if com=_push: if par=1: stkM[adrS]:=envB; adrS:=adrS+1; stkA[adrS]:=adrA:=cntA; stkB[adrS]:=adrB:=cntB; elseif par=0: temp_len:=bondL; fi @@ -535,27 +561,24 @@ def glu_c(expr n)= if strA[n]<>0: nB:=angT mod 180; nC:=.5str_wd[strA[n]]*atom_ else :glu:=glu+((cosd(nB)*.5atom_wd)++.5atom_wd) fi fi enddef; vardef proc_env(expr n,m,a,b)= r:=(n mod 360); - if m>=def_emb_start: parMC[m][cntB-temp_cntB-1] else: + if m>=def_emb_start: parD[m][cntB-temp_cntB-1] else: if m=hz:if r=0:a elseif r<=90:b elseif r<=180:a elseif r<270:b else:a fi elseif m=vt:if r=0:b elseif r<90:a elseif r<=180:b elseif r<=271:a else:b fi elseif (m>=-180)and(m<=180): m fi fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -def draw_atom(expr n,p,r,s,w)= - begingroup - save dx,u,j,pairA,pairT,par_s,par_e,score_u,hat; pair pairA,pairT; - par_s=ASCII("{"); par_e=ASCII("}"); score_u=ASCII("_"); hat=ASCII("^"); - %--------------------------------------------------------------------------------------- +def draw_atom(expr n,p,r,s,WD)= if ((r mod 360)<=90+1)or((r mod 360)>=270-1): dx:=1; else: dx:=-1; fi - pairT:=p-(.5atom_wd*w*dx,.5atom_wd); u:=j:=0; - for i=0 upto length(s)-1: nB:=ASCII(pic_c(i,s)); + pairT:=p-(.5atom_wd*dx*WD,.5atom_wd); u:=j:=0; + for i=0 upto length(s)-1: + nB:=ASCII(pic_c(i,s)); if dx<0: if nB=par_s:k:=i+1;j:=1;forever:exitif pic_c(i+(incr j),s)="}";endfor fi if j>0: nB:=ASCII(pic_c(k+(decr j),s)); fi fi if nB=score_u: if u=0: u:=-.5; else:u:=0; fi; elseif nB=hat: if u=0: u:= .5; else:u:=0; fi; elseif (nB<>par_s)and(nB<>par_e): nA:=atom_wd*tbl_char_wd[nB]; pairA:=pairT+(.5*((dx-1)*nA),u*atom_wd); - if sw_atom_frame=1: draw_frame(nA,atom_wd,pairA,0.1pt); fi + if sw_atom_frame=1: draw_frame(pairA,nA,atom_wd,0.1pt); fi if (sw_numberA>=1)or(sw_numberB>=1): erase fill unitsquare xscaled nA yscaled atom_wd shifted pairA wpcs 0.01pt; fi addto currentpicture also atom_font[nB] @@ -563,15 +586,9 @@ def draw_atom(expr n,p,r,s,w)= pairT:=pairT+(nA*dx,0); fi endfor - endgroup enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def draw_bond(expr n,BP,EP,ANG,LN)= - begingroup - save ww,ap,am,hpt,pA,pB,pC,pT,Ls,Le; - pair Ls,Le; - path pA,pB,pC,pT; - %-------------------------------------------------------------------------------------------- nC:=length(posA[EP]-posA[BP]); if (nC>0)and(LN<>0): ww:=wedge_wd; hpt:=.5bond_pen_wd; ap:=ANG+90; am:=ANG-90; @@ -579,6 +596,7 @@ def draw_bond(expr n,BP,EP,ANG,LN)= else: clipping(strA[BP],strA[EP],posA[BP],posA[EP],nC); fi pickup pencircle scaled bond_pen_wd; if known colorB[n]: nB:=colorB[n]; fi + %--------------------------------------------------------------------------------------------- if (LN=si)or(sw_bond_single=1): draw pA Cp(nB); elseif LN=dl:draw pA Cp(nB); draw sfB(pC,bondgap,ap) Cp(nB); elseif LN=dr:draw pA Cp(nB); draw sfB(pC,bondgap,am) Cp(nB); @@ -610,7 +628,6 @@ def draw_bond(expr n,BP,EP,ANG,LN)= else: nB:=n; fi draw_atom(n,.5[posA[BP],posA[EP]],0,decimal(nB),1); fi fi - endgroup enddef; %------------------------------------------------------------------------------------------------- def draw_wv= nB:=3bond_pen_wd; nA:=nB/length(Le-Ls); @@ -632,7 +649,7 @@ def bz_put(expr PA,PB,PC,PD,CL)= nC:=length(Le-Ls); nA:=zebra_gap*i/nC; nD:=(zebra_gap*i+ratio_zebra_black*zebra_gap)/nC; fill nA[PB,PA]--nA[PD,PC]--nD[PD,PC]--nD[PB,PA]--cycle Cp(CL); endfor enddef; def cut_off(expr p,w,h,s)= - p intersectionpoint sqr(1.1w,1.1h) shifted (s-(.5(1.1w),.5(1.1h))); enddef; + p intersectionpoint sqr(w+.1h,1.1h) shifted (s-(.5(w+.1h),.5(1.1h))); enddef; def clipping(expr SA,SB,PA,PB,LEN)= pT:=PA--PB; nA:=0.6atom_wd/LEN; if (SA=0)and(SB=0): Ls:=PA; Le:=PB; pA:=pB:=pT; pC:=0.1[PA,PB]--0.1[PB,PA]; @@ -681,8 +698,6 @@ S_H:='(S,!,H); N_H:='(N,/H); C_HHH:='(/H,/H^60,60,H); def expand_set= save CH,NH,NO,OH,CHO,COOH,CN,SH; CH3:=C_HHH; NH:=N_H; NH2:=N_HH; NO2:=N_OO; OH:=O_H; CHO:=CO_H; COOH:=CO_OH; CN:=C_N; SH:=S_H; enddef; -%================================================================================================== -message "-- total "&decimal(def_num)&" embedded definition --"; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def char_size_set(expr a)(expr b)(expr c)(expr s)= for j=0 upto length(s)-1: nA:=ASCII(pic_c(j,s)); @@ -696,8 +711,8 @@ char_size_set(.7)( 1)( 0)(" ()0123456789nhj=*bdiltf"); char_size_set(.7)( 1)(.15)("pqg"); char_size_set(.7)(.8)( 0)("acekosuvxzwry"); char_size_set(.4)( 1)( 0)(".,:;'`"); -%------------------------------------------------------------------------------------------------ -def proc_char_setup(expr a)= +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def proc_char_setup= begingroup save Z,aW,aH,fW,hW,hW,hH,fP,hP,vL,hL,PO,POh,sH,FD; pair Z[]; @@ -727,7 +742,9 @@ def POh= (hP,.25aH)..Z19..(fW,.25aH)..Z20..cycle enddef; def sH expr n= shifted (0,n) enddef; def SP(expr m,n)expr p=subpath(m*length(p),n*length(p)) of p enddef; %================================================================================================== -pickup pencircle scaled a; fP:=a; hP:=.5a; +pickup pencircle scaled char_pen_wd; +fP:=char_pen_wd; hP:=.5char_pen_wd; +%------------------------------------------------------------------------------------------ FD(" ")(); FD(".")(drawdot Z19 wpcs fP); FD(",")(drawdot Z19 wpcs fP; draw (hW+.5fP,hP)..(hW+.3fP,-fP)..(hW-.5fP,hP-2fP)); @@ -818,26 +835,11 @@ vardef fixed_l(expr n)(expr s)= s&(substring(0,n-length(s)) of blank_str) enddef vardef fdr(expr n)(expr s)=fixed_r(n)(decimal(s)) enddef; def warning(expr s)= message "% "&decimal(char_num)&fdr(3)(incr warning_cnt)&")"&s&" !!!"; enddef; def B_check(expr s)(expr t)(expr n)= - if com_str[strA[s]]=t: if bond_cnt>n: - warning(fdr(4)(s)&" ["&com_str[strA[s]]&"] has "&fdr(3)(bond_cnt)&" bonds"); fi fi + if strD[strA[s]]=t: if bond_cnt>n: + warning(fdr(4)(s)&" ["&strD[strA[s]]&"] has "&fdr(3)(bond_cnt)&" bonds"); fi fi enddef; vardef stripP(expr a)=if length(a)=4: substring (1,3) of a else: a fi enddef; %================================================================================================== -def proc_get_info= - for j=1 upto inf_num: - nA:=0; for i=0 upto length(info[j]): if pic_c(i,info[j])=":": nA:=i; fi exitif nA>0; endfor - if nA>0: - s_tag:=substring (0,nA) of info[j]; - s_var:=substring (nA+1,length(info[j])) of info[j]; - if s_tag="NO": inf_NO:=s_var; elseif s_tag="MW": inf_MW:=s_var; - elseif s_tag="EN": inf_EN:=s_var; elseif s_tag="JN": inf_JN:=s_var; - elseif s_tag="FM": inf_FM:=s_var; elseif s_tag="CAS": inf_CAS:=s_var; - elseif s_tag="USE": inf_USE:=s_var; elseif s_tag="EXA": inf_EXA:=s_var; - elseif s_tag="EXB": inf_EXB:=s_var; fi - fi - endfor -enddef; -%================================================================================================== def STa(expr a,b)= tbl_atom_str[incr tbl_cnt]:=a; tbl_atom[tbl_cnt]:=0; tbl_atom_wt[tbl_cnt]:=b; enddef; @@ -865,6 +867,17 @@ STb("N{H_2_}")("N","H","H"); STb("S{O_3_}")("S","O","O","O"); STb("COOH")("C","O","O","H"); STb("C{H_3_}")("C","H","H","H"); STb("C{F_3_}")("C","F","F","F"); %================================================================================================== +def proc_get_info= + for j=1 upto inf_num: + nA:=0; for i=0 upto length(info[j]): if pic_c(i,info[j])=":": nA:=i; fi exitif nA>0; endfor + if nA>0: + s_tag:=substring (0,nA) of info[j]; + s_var:=substring (nA+1,length(info[j])) of info[j]; + if known scantokens("inf_"&s_tag): scantokens("inf_"&s_tag):=s_var; fi + fi + endfor +enddef; +%================================================================================================== def proc_calc_out= begingroup save warning_cnt,cal_MW,cal_MWp,knownA,cal_FM,bondC,tmp_wtp,bond_cnt,hide_H, @@ -874,6 +887,7 @@ def proc_calc_out= inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW; inf_NO:=inf_EN:=inf_JN:=inf_FM:=inf_CAS:=inf_USE:=inf_EXA:=inf_EXB:=inf_MW:=""; cal_MW_str:=cal_FM:=""; hide_H:=warning_cnt:=cal_MW:=cal_MWp:=0; + %------------------------------------------------------------------------------------------ proc_get_info; for i=1 upto tbl_cnt: sumA[i]:=0; endfor for i=1 upto cntA: knownA:=bond_cnt:=0; @@ -882,16 +896,16 @@ def proc_calc_out= elseif lineB[j]=0: bondC[j]:=0; else: bondC[j]:=1; fi if (sB[j]=i)or(eB[j]=i): bond_cnt:=bond_cnt+bondC[j]; fi endfor Bcnt[i]:=bond_cnt; - if com_str[strA[i]]="": com_str[strA[i]]:="C"; fi - if com_str[strA[i]]="C": if bond_cnt<4: hide_H:=hide_H+(4-bond_cnt); fi fi + if strD[strA[i]]="": strD[strA[i]]:="C"; fi + if strD[strA[i]]="C": if bond_cnt<4: hide_H:=hide_H+(4-bond_cnt); fi fi B_check(i)("C")(4); B_check(i)("H")(1); B_check(i)("O")(2); B_check(i)("F")(1); B_check(i)("{Cl}")(1); B_check(i)("Br}")(1); for j=1 upto tbl_cnt: - if com_str[strA[i]]=tbl_atom_str[j]: + if strD[strA[i]]=tbl_atom_str[j]: if tbl_atom[j]=0: sumA[j]:=sumA[j]+1; else: for k=1 upto tbl_atom[j]: sumA[tbl_subst[j][k]]:=sumA[tbl_subst[j][k]]+1; endfor fi knownA:=1; fi endfor - if knownA=0: warning(" Unknown Str("&com_str[strA[i]]&") is used "&decimal(i)); fi + if knownA=0: warning(" Unknown Str("&strD[strA[i]]&") is used "&decimal(i)); fi endfor sumA[2]:=sumA[2]+hide_H; for i=1 upto tbl_cnt: @@ -924,8 +938,7 @@ enddef; %================================================================================================== def proc_checklist_out= nA:=0; message "% Molecular name = "& inf_EN; - message "% There were "&fdr(3)(warning_cnt)& - " warnings / Expanded command count= "&decimal(cntMC[0]); + message "% warnings = "&fdr(3)(warning_cnt)&" / Expanded command = "&decimal(cntD[0]); message "% width * height = " & fdr(8)(mol_wd)&" * "&fdr(8)(mol_ht); message "% Shift width * height = "& fdr(8)(minX)&" * "&fdr(8)(minY); message "% Bond length = "&fdr(3)(bond_len)&" Atom size = "&fdr(3)(atom_wd); @@ -933,15 +946,14 @@ def proc_checklist_out= nA:=0; " Ring count="&fdr(3)(cntB-cntA+1)&" Hide H ="&fdr(3)(hide_H); message "%-----------------------------------< atom >< bond >-------"; for i=1 upto cntA: message "% "&fdr(3)(i)&" ("&fdr(10)(xpart(posA[i])/bond_len)&" ) ("& - fdr(10)(ypart(posA[i])/bond_len)&" ) "&fixed_l(8)(com_str[strA[i]])&" "&fdr(3)(Bcnt[i]); + fdr(10)(ypart(posA[i])/bond_len)&" ) "&fixed_l(8)(strD[strA[i]])&" "&fdr(3)(Bcnt[i]); endfor message "%Bond list---------------------------------------------------------"; for i=1 upto cntB: if lineB[i]<>0: message "% "&fdr(3)(incr nA)&" "&fdr(3)(sB[i])& " -> "&fdr(3)(eB[i])&" ("&fdr(3)(bondC[i]-si+1)&")"; fi endfor message "%Fomula / Molecular weight ---------------------------------------"; - if cal_MWp<=40: cal_MW_str:=fdr(10)(cal_MW); - else: cal_MW_str:=fdr(10)(cal_MWp)&" * 100"; fi + if cal_MWp<=40: cal_MW_str:=fdr(10)(cal_MW); else: cal_MW_str:=fdr(10)(cal_MWp)&" * 100"; fi for i=1 upto tbl_cnt: if sumA[i]>=1: message "% "&fixed_l(4)(stripP(tbl_atom_str[i]))&"("&fdr(9)(tbl_atom_wt[i])& @@ -960,7 +972,7 @@ def proc_MOLfile_out= printf ""; printf " -MCFtoMOL- "&fixed_l(20)(info[1]); printf ""; printf fdr(3)(cntA)&fdr(3)(cntB)&" 0 0 0 0 0 0 0 0999 V2000"; for i=1 upto cntA: printf fdr(10)(xpart(posA[i])/bond_len)& fdr(10)(ypart(posA[i])/bond_len)& - fdr(10)(0)&" "&fixed_l(2)(stripP(com_str[strA[i]]))&" 0 0 0 0"; endfor + fdr(10)(0)&" "&fixed_l(2)(stripP(strD[strA[i]]))&" 0 0 0 0"; endfor for i=1 upto cntB: if lineB[i]<>0: if (lineB[i]=dl)or(lineB[i]=dr)or(lineB[i]=dm): nA:=2; elseif lineB[i]=tm: nA:=3; |