texlive[42336] Master/texmf-dist: mcf2graph (23oct16)

commits+karl at tug.org commits+karl at tug.org
Mon Oct 24 00:04:40 CEST 2016


Revision: 42336
          http://tug.org/svn/texlive?view=revision&revision=42336
Author:   karl
Date:     2016-10-24 00:04:40 +0200 (Mon, 24 Oct 2016)
Log Message:
-----------
mcf2graph (23oct16)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/metapost/mcf2graph/CHANGELOG
    trunk/Master/texmf-dist/doc/metapost/mcf2graph/README
    trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_example.pdf
    trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_man_soc.mf
    trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_manual.pdf
    trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_manual.tex
    trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_mplib_exa.pdf
    trunk/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/CHANGELOG
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/mcf2graph/CHANGELOG	2016-10-23 22:04:26 UTC (rev 42335)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/CHANGELOG	2016-10-23 22:04:40 UTC (rev 42336)
@@ -1,6 +1,10 @@
 *******************************************************************************
- Changelog of mcf2graph software package        by Akira Yamaji 2016-10-19
+ Changelog of mcf2graph software package         by Akira Yamaji 2016-10-23
 *******************************************************************************
+[ver. 4.01  / 2016-10-23]
+  -many fixes for robustness
+  -update MCF syntax manual
+
 [ver. 4.00  / 2016-10-19]
   -change solid mode parameter
    1:solid ratio,2:solid length

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/README
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/mcf2graph/README	2016-10-23 22:04:26 UTC (rev 42335)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/README	2016-10-23 22:04:40 UTC (rev 42336)
@@ -1,7 +1,7 @@
 ********************************************************************************
  mcf2graph  : Convert Molecular Coding Format to graphics with METAFONT/METAPOST
  Author     : Akira Yamaji
- version    : 4.00 2016-10-19
+ version    : 4.01 2016-10-23
  E-mail     : mcf2graph at gmail.com
  Located at : http://www.ctan.org/pkg/mcf2graph
 ********************************************************************************

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_example.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_man_soc.mf
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_man_soc.mf	2016-10-23 22:04:26 UTC (rev 42335)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_man_soc.mf	2016-10-23 22:04:40 UTC (rev 42336)
@@ -419,11 +419,11 @@
 endfont
 %***********************************************************************
 beginfont("EN:substituent 4")
-  font_ht#:=15mm#;
+  font_ht#:=17mm#;
   sw_clip:=1;
   margin_top_bottom:=2mm;
-  sw_numberA:=1; numberA_end:=9;
-  MCf(<-30,!6,@(2~wf,4~zf,6^-30)/H)
+  sw_numberA:=1; numberA_end:=7;
+  MCf(<-30,!6,@(2~wf,4~zf,6^-30)/Me)
 endfont
 %***********************************************************************
 beginfont("EN:substituent 5")

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_manual.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_manual.tex
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_manual.tex	2016-10-23 22:04:26 UTC (rev 42335)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_manual.tex	2016-10-23 22:04:40 UTC (rev 42336)
@@ -1,5 +1,5 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%  Molecular Coding Format manual          by  Akira Yamaji 2016.10.19
+%  Molecular Coding Format manual          by  Akira Yamaji 2016.10.23
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \documentclass[a4paper]{article}
 %%%%\usepackage{graphicx}
@@ -449,7 +449,7 @@
   ~,^,` : change type,angle,length
 
   <-30,!6,
-  @(2~wf,4~zf,6^-30)/H
+  @(2~wf,4~zf,6^-30)/Me
 \end{verbatim}
 \MCFstructure
 %-----------------------------------------------------------------------------
@@ -1066,7 +1066,7 @@
 \end{verbatim}
 \paragraph{(Command line)}
 \begin{verbatim}
-  >mpost -s ahangle=0 FILENAME (molecular difinition file)
+  >mpost -s ahangle=0 FILENAME (molecular definition file)
 \end{verbatim}
 \paragraph{(Output)}
 \begin{verbatim}
@@ -1099,7 +1099,7 @@
 \end{verbatim}
 \paragraph{(Command line)}
 \begin{verbatim}
-  >mpost -s ahangle=0 -s ahlength=2 FILENAME (molecular difinition file)
+  >mpost -s ahangle=0 -s ahlength=2 FILENAME (molecular definition file)
 \end{verbatim}
 \paragraph{(Output)}
 \begin{verbatim}
@@ -1161,7 +1161,7 @@
 \end{verbatim}
 \paragraph{(Command line)}
 \begin{verbatim}
-  >mpost -s ahangle=3  FILENAME (molecular difinition file)
+  >mpost -s ahangle=3  FILENAME (molecular definition file)
 \end{verbatim}
 \paragraph{(Output)}
 \begin{verbatim}

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_mplib_exa.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf
===================================================================
--- trunk/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf	2016-10-23 22:04:26 UTC (rev 42335)
+++ trunk/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf	2016-10-23 22:04:40 UTC (rev 42336)
@@ -1,5 +1,5 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% mcf2graph ver 4.00     Copyright (c) 2013-2016   Akira Yamaji
+% mcf2graph ver 4.01     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,13 +32,12 @@
 tracingstats:=1;
 message " This is mcf2graph ver 4.0  2016.10";
 %-------------------------------------------------------------------------------------------------
-newinternal nA,nB,nC,nD,nE,nF,cntA,cntB,minX,minY,sftX,sftY;
+newinternal nA,nB,nC,nD,nE,nF,cntA,cntB,cntP,minX,minY,def_num,def_int,tbl_cnt;
 pair    posB[],posA[];
-numeric angB[],angA[],br_ang[],sB[],eB[],f_char[],char_w[],char_h[],char_d[],strA[],str_wd[],
-        lineB[],lenB[],ps_com[],ps_adr[],op_com[][],op_par[][],op_cnt[],
-        comMC[][],parMC[][],cntMC[],tblN[],tblB[][],tblWt[],colorA[],colorB[],stock_para[],
-        CH[],NH[],NO[],SO[],CCl[],CF[],CBr[],?[],![],Ph[];
-string  info[],tblA[],com_str[],var[],tag[],mp_log_name,aux_delimiter;
+numeric lineB[],sB[],eB[],angB[],angA[],strA[],str_wd[],lenB[],ang_br[],stock_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;
 picture atom_font[],chem_structure;
 %-------------------------------------------------------------------------------------------------
 sw_numberA:=sw_numberB:=sw_mol_frame:=sw_auxout:=sw_solid:=sw_expand:=sw_start_vector:=0;
@@ -48,7 +47,8 @@
 aux_delimiter:=";";  var1:="jobname";  tag1:="F";  var2:="char_num"; tag2:="C";
 for i=3 upto aux_max: var[i]:=tag[i]:=""; endfor
 %=================================================================================================
-if known green:  f_MP:=1;
+if (known green)and(known ahlength):
+  f_MP:=1;
   color color_list[];
   mp_log_name:=jobname&"-info.aux";
   if     ahlength=1: proc_end:=1;  fi                          % first molecular only
@@ -71,20 +71,23 @@
 fi
 ahangle:=45; ahlength:=4;
 clearit;  chem_structure:=currentpicture;
-%-------------------------------------------------------------------------------------------------
+%--------------------------------------------------------------------------------------------------
 let DIV= /; let MUL= *; let LT= <; let GT= >; let AND= &; let :: = : ; let == = =;
-primarydef a SUB b = a-b enddef;
+%--------------------------------------------------------------------------------------------------
 ?3:=?20:=Ph:=Ph1:=Ph2:=hz:=0; vt:=1;
-first_def_number:=500; user_def_number:=2500; ab_def_number:=3000;
 margin_left_right:=margin_top_bottom:=0.4mm;             ratio_bond_width:=0.1;
 ratio_chain_ring:= 0.66;      ratio_atom_bond:=0.36;     ratio_thickness_bond:=0.015;  
 ratio_char_bond:=1.5;         ratio_bondgap_bond:=0.15;  ratio_zebragap_bond:=0.12;
-ratio_zebra_black:=0.4;       ratio_wedge_bond:=0.12;    ratio_atomgap_atom:=.050;
+ratio_zebra_black:=0.4;       ratio_wedge_bond:=0.12;    ratio_atomgap_atom:=0.050;
 offset_thickness#:=0.2pt#;    offset_bond_gap#:=0.3pt#;  offset_zebra_gap#:=0.1pt#;
 offset_atom#:=0.8pt#;         offset_wedge#:=0.4pt#;     thickness_font_frame#:=0.2pt#;
 max_bond_length#:=10mm;       bond_len#:=8mm#;
-par_s=ASCII("{"); par_e=ASCII("}"); score_u=ASCII("_"); hat=ASCII("^");
 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 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,
  _dl,_N,_O,_S,_H,_tmp_line,_chg_len,_get_len,_ring_len,_tmp_len,_rot_ang,_set_ang,_adj_ang,_chg_env,
@@ -91,7 +94,7 @@
  _tmp_env,_set_colorA,_set_colorB,_postA,_postB,_postC,_postD,_postE,_postF,_set_psA,_stack_reset,
  _set_clr,_set_adr,_mk_bond,_set_atom,_arg_ang,_chg_atom,_tmp_rot,_fuse,_push,_pop,_size_a);
 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,
@@ -101,7 +104,9 @@
   bond_len#,offset_atom#,offset_wedge#,max_bond_length#,offset_zebra_gap#,offset_bond_gap#,
   thickness_font_frame#,offset_thickness#,numberA_start,numberA_end,numberB_start,numberB_end
 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
 def store_par(text t)=
   nA:=0; for list=t: if stock_para[incr nA]<>list: stock_para[nA]:=list; fi endfor enddef;
@@ -113,7 +118,7 @@
   f_beginchar:=inf_num:=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):
@@ -126,65 +131,6 @@
   restore_par(parameter_list); font_wd#:=save_wd#; font_ht#:=save_ht#;
   if proc_end=1: scantokens("bye"); fi
 enddef;
-%-------------------------------------------------------------------------------------------------
-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));
-    if f_char[nA]=1: char_w[nA]#:=atom_wd#*a; char_h[nA]#:=atom_wd#*b; char_d[nA]#:=atom_wd#*c;
-                     define_pixels(char_w[nA],char_h[nA],char_d[nA]);  fi
-  endfor
-enddef;
-%-------------------------------------------------------------------------------------------------
-def mol_size_setup=
-  if (bond_len#*ratio_atom_bond+offset_atom#)<.8bond_len#:
-        atom_wd#:=bond_len#*ratio_atom_bond+offset_atom#;
-  else: atom_wd#:=.8bond_len#; ratio_chain_ring:= .5; fi
-  wedge_wd#:=    bond_len#*ratio_wedge_bond+offset_wedge#;
-  zebra_gap#:=   bond_len#*ratio_zebragap_bond+offset_zebra_gap#;
-  bondgap#:=     bond_len#*ratio_bondgap_bond+offset_bond_gap#;
-  bond_pen_wd#:= bond_len#*ratio_thickness_bond+offset_thickness#;
-  char_pen_wd#:= bond_pen_wd#*ratio_char_bond;
-  define_pixels(bond_len,zebra_gap,wedge_wd,atom_wd,bondgap,bond_pen_wd,char_pen_wd);
-  char_size_set( 1)( 1)(  0)("CGHMNOQ");
-  char_size_set(.9)( 1)(  0)("ABDEFIJKLPRSTUVWXYZ-+/><m");
-  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)(".,:;'`");
-enddef;
-%-------------------------------------------------------------------------------------------------
-def mol_scaling=
-  begingroup
-  save xpos,ypos,str_len,max_x,max_y;
-  minX:=minY:= 4095.999; max_x:=max_y:=-4095.999;
-  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]]));
-        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;
-        else: str_len:=str_len+char_w[nA]; fi  
-      endfor
-      str_ang:=(br_ang[i] mod 360); nF:=str_len;
-      if     (str_ang<=91)or(str_ang>=269): nF:=0; else: str_len:=0; fi
-      if     (xpos-nF+.5atom_wd)<minX: minX:=xpos-nF+.5atom_wd;
-      elseif (xpos+str_len-.5atom_wd)>max_x: max_x:=xpos+str_len-.5atom_wd; fi
-      if     (ypos-nD-.5atom_wd)<minY: minY:=ypos-nD-.5atom_wd;
-      elseif (ypos+nC+.5atom_wd)>max_y: max_y:=ypos+nC+.5atom_wd; fi
-      else: if xpos<minX: minX:=xpos; elseif xpos>max_x: max_x:=xpos; fi
-            if ypos<minY: minY:=ypos; elseif ypos>max_y: max_y:=ypos; fi fi
-  endfor
-  mol_wd:=max_x-minX; mol_ht:=max_y-minY;
-  endgroup
-enddef;
-%-------------------------------------------------------------------------------------------------
-for i=1 upto 128: f_char[i]:=0; endfor  asc0:=ASCII("0"); asc9:=ASCII("9");
-def char_use_check=
-  for i=1 upto 128: if f_char[i]<>0: f_char[i]:=0; fi endfor
-    if (sw_numberA>=1)or(sw_numberB>=1): for j=asc0 upto asc9: 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
-enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def set_def_MC=
   save /,*,//,/*,*/,**,~,~~,^,^^,`,'`,{,},<,>,>>,:>,&,&#,:,=,\,\\,*\,\*,@,$,#,|,||,
@@ -210,8 +156,7 @@
   def **secondary n == (_postE,n) enddef; def */*secondary n == (_postF,n) enddef;
 enddef;
 %-------------------------------------------------------------------------------------------------
-def PM(expr a,b,c)= comMC[a][incr cntMC[a]]:=b; parMC[a][cntMC[a]]:=c; enddef;
-vardef '(text s)= ''(incr mc_num)(s); mc_num 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
@@ -218,12 +163,15 @@
   cntMC[k]:=0;
   for list==s::
     if known list::
-      if pair list:: PM(k,xpart(list),ypart(list))
+      if pair list:: comMC[k][incr cntMC[k]]:=xpart(list); parMC[k][cntMC[k]]:=ypart(list);
       elseif numeric list::
-        if list>=first_def_number::
-          for i==1 upto cntMC[list]:: PM(k,comMC[list][i],parMC[list][i]) endfor 
-        else:: PM(k,_mk_bond,list) fi
-      elseif string list:: com_str[incr str_cnt]:=list;  PM(k,_set_atom,str_cnt)
+        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];
+            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
   endfor
   endgroup
@@ -230,154 +178,143 @@
 enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def !?(expr a)(expr b) =
-  PB(_jp_bond,a) PB(_get_len,a) PB(_push,0)
-  PB(_chg_len,_ring_len) for i==1 upto b-2:: PB(_mk_bond,360 DIV b) endfor  PB(_pop,0)
-  if a>=1:: PB(_cyc_eB,0) elseif a>=-999:: PB(_cyc_eB,a-b+2) else:: PB(_cyc_eB,a) fi
+  PA(_jp_bond,a) PA(_get_len,a) PA(_push,0)
+  PA(_chg_len,_ring_len) for i==1 upto b-2:: PA(_mk_bond,360 DIV b) endfor  PA(_pop,0)
+  if a>=1:: PA(_cyc_eB,0) elseif a>=-999:: PA(_cyc_eB,a-b+2) else:: PA(_cyc_eB,a) fi
 enddef;
 %-------------------------------------------------------------------------------------------------
 def !!?(expr a)(expr b)(expr c) =
-  PB(_jp_bond,xpart(a)) PB(_push,0)
-  if     b==6:: PB(_chg_len,0) for i==1 upto c-1:: PB(_mk_bond,60) endfor
-  elseif b==5:: if     c==2:: PB(_chg_len,1.25) PB(_mk_bond,80)
-                elseif c==3:: PB(_chg_len,1.1)  PB(_mk_bond,78) PB(_mk_bond,72) fi
-  elseif b==4:: PB(_chg_len,1.225) PB(_mk_bond,105) fi
-  PB(_pop,0) if ypart(a)<=0:: PB(_cyc_eB,ypart(a)-c+1) else:: PB(_cyc_eB,ypart(a)) fi
+  PA(_jp_bond,xpart(a)) PA(_push,0)
+  if     b==6:: PA(_chg_len,0) for i==1 upto c-1:: PA(_mk_bond,60) endfor
+  elseif b==5:: if     c==2:: PA(_chg_len,1.25) PA(_mk_bond,80)
+                elseif c==3:: PA(_chg_len,1.1)  PA(_mk_bond,78) PA(_mk_bond,72) fi
+  elseif b==4:: PA(_chg_len,1.225) PA(_mk_bond,105) fi
+  PA(_pop,0) if ypart(a)<=0:: PA(_cyc_eB,ypart(a)-c+1) else:: PA(_cyc_eB,ypart(a)) fi
 enddef;
 %-------------------------------------------------------------------------------------------------
-def fuse_large(expr a)(expr b)(expr c) =
+def !??(expr a)(expr b)(expr c) =
   if      b==5::
-    PB(_jp_bond,a) PB(_push,0) PB(_chg_len,c DIV 10) PB(_mk_bond,72-((c-9) MUL 1.5))
-    PB(_mk_bond,72+(c-9)) PB(_mk_bond,72+(c-9)) PB(_pop,0)
-    if a>=1:: PB(_cyc_eB,0) else:: PB(_cyc_eB,list) fi
+    PA(_jp_bond,a) PA(_push,0) PA(_chg_len,c DIV 10) PA(_mk_bond,72-((c-9) MUL 1.5))
+    PA(_mk_bond,72+(c-9)) PA(_mk_bond,72+(c-9)) PA(_pop,0)
+    if a>=1:: PA(_cyc_eB,0) else:: PA(_cyc_eB,list) fi
   elseif b==6::
-    PB(_jp_bond,a) PB(_push,0) PB(_chg_len,c DIV 10) PB(_mk_bond,60-(c-8))
-    PB(_mk_bond,60+((c-8) DIV 2)) PB(_mk_bond,60+((c-8) DIV 2)) PB(_mk_bond,60+((c-8) DIV 2))
-    PB(_pop,0) if a>=1:: PB(_cyc_eB,0) else:: PB(_cyc_eB,list) fi
+    PA(_jp_bond,a) PA(_push,0) PA(_chg_len,c DIV 10) PA(_mk_bond,60-(c-8))
+    PA(_mk_bond,60+((c-8) DIV 2)) PA(_mk_bond,60+((c-8) DIV 2)) PA(_mk_bond,60+((c-8) DIV 2))
+    PA(_pop,0) if a>=1:: PA(_cyc_eB,0) else:: PA(_cyc_eB,list) fi
   elseif b==7::
-    PB(_jp_bond,a) PB(_push,0) PB(_chg_len,c DIV 10) PB(_mk_bond,(360 DIV 7)-(c-8))
-    PB(_mk_bond,360 DIV 7+((c-8) DIV 2.5)) PB(_mk_bond,360 DIV 7+((c-8) DIV 2.5))
-    PB(_mk_bond,360 DIV 7+((c-8) DIV 2.5)) PB(_mk_bond,360 DIV 7+((c-8) DIV 2.5))
-    PB(_pop,0) if a>=1:: PB(_cyc_eB,0) else:: PB(_cyc_eB,list) fi
+    PA(_jp_bond,a) PA(_push,0) PA(_chg_len,c DIV 10) PA(_mk_bond,(360 DIV 7)-(c-8))
+    PA(_mk_bond,360 DIV 7+((c-8) DIV 2.5)) PA(_mk_bond,360 DIV 7+((c-8) DIV 2.5))
+    PA(_mk_bond,360 DIV 7+((c-8) DIV 2.5)) PA(_mk_bond,360 DIV 7+((c-8) DIV 2.5))
+    PA(_pop,0) if a>=1:: PA(_cyc_eB,0) else:: PA(_cyc_eB,list) fi
   elseif b==8::
-    PB(_jp_bond,a) PB(_push,0) PB(_chg_len,c DIV 10) PB(_mk_bond,45-(c-8))
-    PB(_mk_bond,45+((c-8) DIV 3)) PB(_mk_bond,45+((c-8) DIV 3)) PB(_mk_bond,45+((c-8) DIV 3))
-    PB(_mk_bond,45+((c-8) DIV 3)) PB(_mk_bond,45+((c-8) DIV 3))
-    PB(_pop,0) if a>=1:: PB(_cyc_eB,0) else:: PB(_cyc_eB,list) fi
+    PA(_jp_bond,a) PA(_push,0) PA(_chg_len,c DIV 10) PA(_mk_bond,45-(c-8))
+    PA(_mk_bond,45+((c-8) DIV 3)) PA(_mk_bond,45+((c-8) DIV 3)) PA(_mk_bond,45+((c-8) DIV 3))
+    PA(_mk_bond,45+((c-8) DIV 3)) PA(_mk_bond,45+((c-8) DIV 3))
+    PA(_pop,0) if a>=1:: PA(_cyc_eB,0) else:: PA(_cyc_eB,list) fi
   fi
 enddef;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-def PB(expr a,b)= cntBS:=cntBS+1; comMC[ab_num][cntBS]:=a; parMC[ab_num][cntBS]:=b; enddef;
-def $$(text t)(expr e) =
-   begingroup  save cntBS; cntBS:=0; ab_num:=ab_num+1;
+%==================================================================================================
+vardef $$(text t)(expr e) =
+  nA:=0; def_int:=def_int+1;
   if known e:: if numeric e::
-    if (e>=si)and(e<=bd_):: if e==dl:: for list==t:: PB(_dl,list) endfor
-                           else:: for list==t:: PB(_set_adr,list) PB(_set_line,e) endfor fi
+    if (e>=si)and(e<=bd_):: if e==dl:: for list==t:: PA(_dl,list) endfor
+                            else:: for list==t:: PA(_set_adr,list) PA(_set_line,e) endfor fi
     elseif (e>=?3)and(e<=?20):: for list==t:: !?(list)(e-?3+3) endfor
-    elseif e==Ph1:: !?(t)(6) PB(_dl,-2) PB(_dl,-4)
-    elseif e==Ph2:: !?(t)(6) PB(_dl,-1) PB(_dl,-3) PB(_dl,-5)
+    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:: fuse_large(list)(parMC[e][1])(comMC[e][2]) endfor
+        for list==t:: !??(list)(parMC[e][1])(comMC[e][2]) endfor
       fi
     fi
   elseif color e:: color_list[incr cntC]:=e;
-    for list==t:: PB(_set_adr,list) PB(_set_colorB,cntC) endfor fi fi
-  cntMC[ab_num]:=cntBS;
-  ab_num    %--- Retern value -------
-  endgroup
+    for list==t:: PA(_set_adr,list) PA(_set_colorB,cntC) endfor
+  fi fi
+  cntMC[def_int]:=nA;
+  def_int    %------- Retern value -------
 enddef;
 %-------------------------------------------------------------------------------------------------
-def PA(expr a,b)= cntAS:=cntAS+1; comMC[ab_num][cntAS]:=a; parMC[ab_num][cntAS]:=b; enddef;
-def PAs(text t)= for list==t:: PA(xpart(list),ypart(list)) endfor enddef;
-def @@(text t)(expr s)=
-  begingroup
-    save cntAS,xs,ys; cntAS:=0; ab_num:=ab_num+1;
-    if known s:: if numeric s::
-      if (s>=H)and(s<=U)::
-         for list==t::
-            if     s==N:: PA(_N,list) elseif s==O:: PA(_O,list) elseif s==S:: PA(_S,list)
-            else::        PA(_set_adr,list) PA(_chg_atom,s) fi  endfor
-      elseif s==NH::  for list==t:: if numeric  list:: PAs((_N,list),~~no,'`_size_a,(_H,list))
-                                   elseif pair list:: PAs(list) fi  endfor
-      elseif s==SOO:: for list==t:: PAs((_S,list),(_set_adr,list),
-                                    ^^35,~~dm,(_set_psA,O),^^-35,~~dm,(_set_psA,O))  endfor
-      elseif s==SO::  for list==t::
-                        if  numeric list:: PAs((_S,list),(_set_adr,list),~~dm,(_set_psA,O))
-                        elseif pair list:: PAs(list) fi  endfor
-      fi
-    elseif pair s::  xs:=xpart(s); ys:=ypart(s); PA(_set_clr,1)
-      for list==t::
-        if numeric list::
-          if     xs==_postA::            elseif xs==_postB:: PAs(~~dm)
-          elseif xs==_postC:: PAs(~~wf)  elseif xs==_postD:: PAs(~~zf)
-          elseif xs==_postE:: PAs(~~nl)  elseif xs==_postF:: PAs(~~no) fi
-          PA(_set_adr,list)  PA(_set_psA,ys)
-        elseif pair list:: PAs(list) fi
-      endfor
-      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[ab_num]:=cntAS;
-    ab_num  %--- Retern value -------
-  endgroup
+vardef @@(text t)(expr s)=
+  nA:=0; def_int:=def_int+1;
+  if known s:: if numeric s::
+    if (s>=H)and(s<=U)::
+       for list==t::
+          if     s==N:: PA(_N,list) elseif s==O:: PA(_O,list) elseif s==S:: PA(_S,list)
+          else::        PA(_set_adr,list) PA(_chg_atom,s) fi  endfor
+    elseif s==NH::  for list==t:: if numeric  list:: PAs((_N,list),~~no,'`_size_a,(_H,list))
+                                 elseif pair list:: PAs(list) fi  endfor
+    elseif s==SOO:: for list==t:: PAs((_S,list),(_set_adr,list),
+                                  ^^35,~~dm,(_set_psA,O),^^-35,~~dm,(_set_psA,O))  endfor
+    elseif s==SO::  for list==t::
+                      if  numeric list:: PAs((_S,list),(_set_adr,list),~~dm,(_set_psA,O))
+                      elseif pair list:: PAs(list) fi  endfor
+    fi
+  elseif pair s::  nE:=xpart(s); nF:=ypart(s); PA(_set_clr,1)
+    for list==t::
+      if numeric list::
+        if     nE==_postA::            elseif nE==_postB:: PAs(~~dm)
+        elseif nE==_postC:: PAs(~~wf)  elseif nE==_postD:: PAs(~~zf)
+        elseif nE==_postE:: PAs(~~nl)  elseif nE==_postF:: PAs(~~no) fi
+        PA(_set_adr,list)  PA(_set_psA,nF)
+      elseif pair list:: PAs(list) fi
+    endfor
+    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;
+  def_int  %------- Retern value -------
 enddef;
-%-------------------------------------------------------------------------------------------------
-def PP(expr a,b)= op_com[cntP][incr op_cnt[cntP]]:=a; op_par[cntP][op_cnt[cntP]]:=b; enddef;
-def ps_put(expr n,p)=
-  ps_adr[incr cntP]:=n; ps_com[cntP]:=p; op_cnt[cntP]:=0;
-  if lineT<>0:  PP(_tmp_line,lineT) fi   if rotT<>0:   PP(_rot_ang,rotT) fi
-  if lenT<>crR: PP(_chg_len,lenT) fi     if envT<>hz:  PP(_chg_env,envT) fi
-  if lineT=nl:  PP(_tmp_len,0) elseif lineT=no: PP(_adj_ang,0) fi PP(_mk_bond,0)
-  if f_lineT=0: lineT:=si; fi  if f_lenT=0: lenT:=crR; fi 
-  if f_rotT=0:  rotT:=0;   fi  if f_envT=0: envT:=hz;  fi
-enddef;
-%-------------------------------------------------------------------------------------------------
-def PG(expr a,b)= comMC[0][incr cntMC[0]]:=a; parMC[0][cntMC[0]]:=b; enddef;
-def ps_get(expr n)=
-  cntC:=cntMC[0]; cntPS:=cntP;
-  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 
-    PG(_pop,1) PG(_term,0)
-  endfor
-  proc_bond_atom(cntC+1); if cntP>cntPS: ps_get(cntPS+1); fi
-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 MCd(expr RW,RH)(expr FW,FH)(text s)=
-  mc_num:=user_def_number; ab_num:=ab_def_number; crR:=-ratio_chain_ring;
-  cntA:=cntB:=cntPS:=cntC:=cntP:=0; com_str[0]:=""; str_cnt:=2000;
+def proc_drawing(expr RW,RH)(expr FW,FH)(text s)=
+  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;
+  %-----------------------------------------------------------------------------------------------
+  numeric stkB[],stkA[],stkL[],stkM[],f_char[],ps_adr[],ps_com[],colorA[],colorB[],
+          op_com[][],op_par[][],op_cnt[];
+  %-----------------------------------------------------------------------------------------------
   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
-  ''(0)(s,(_term,0)); proc_bond_atom(1); cntA_skeleton:=cntA; cntB_skeleton:=cntB;
-  if cntP>0: ps_get(1); 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
   define_pixels(font_wd,font_ht,thickness_font_frame);
   char_use_check;
   if     sw_solid=1: bond_len#:=font_wd#*ratio_bond_width;
-                     mol_size_setup; proc_skeleton; mol_scaling;
-  elseif sw_solid=2: mol_size_setup; proc_skeleton; mol_scaling;
+                     proc_size_setup; proc_skeleton; proc_scaling;
+  elseif sw_solid=2: proc_size_setup; proc_skeleton; proc_scaling;
   else:
-    bond_len#:=3mm#; mol_size_setup;
-    for i=1 upto 6: proc_skeleton; mol_scaling;
+    bond_len#:=3mm#; proc_size_setup;
+    for i=1 upto 6: proc_skeleton; proc_scaling;
       if (mol_ht/mol_wd)>(font_ht/font_wd): factor:=(font_ht*RH-2margin_top_bottom)/mol_ht;
       else:                                 factor:=(font_wd*RW-2margin_left_right)/mol_wd;  fi
       exitif factor=1;
-      bond_len#:=bond_len#*factor; mol_size_setup;
+      bond_len#:=bond_len#*factor; proc_size_setup;
     endfor
     if bond_len#>max_bond_length#:
-       bond_len#:=max_bond_length#; mol_size_setup; proc_skeleton; mol_scaling;  fi
+       bond_len#:=max_bond_length#; proc_size_setup; proc_skeleton; proc_scaling;  fi
   fi
-  char_font_setup(char_pen_wd);
-  if sw_subst_off=1: cntA:=cntA_skeleton; cntB:=cntB_skeleton; fi
-  %----------------------------------------------------------------------------------------
+  proc_char_setup(char_pen_wd);
   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
-     beginchar(char_num,font_wd#,font_ht#,0); f_beginchar:=1;  fi
+     beginchar(char_num,font_wd#,font_ht#,0); f_beginchar:=1;
+  fi
   for i=1 upto cntB: if lineB[i]<si_ : draw_bond(i,sB[i],eB[i],angB[i],lineB[i]); fi endfor
   for i=1 upto cntB: if lineB[i]>=si_: draw_bond(i,sB[i],eB[i],angB[i],lineB[i]); fi endfor
   for i=1 upto cntA:
@@ -388,7 +325,7 @@
        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],br_ang[i],com_str[strA[i]],str_wd[strA[i]]);  fi
+    else:  draw_atom(i,posA[i],ang_br[i],com_str[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;
@@ -396,26 +333,87 @@
   if sw_start_vector=1: AUX(sftX,sftY)(start_vector) fi
   addto chem_structure also currentpicture shifted (sftX,sftY);
   clearit;
+  endgroup
 enddef;
-%------------------------------------------------------------------------------------------------
+%-------------------------------------------------------------------------------------------------
+def ps_put(expr n,p)=
+  ps_adr[incr cntP]:=n; ps_com[cntP]:=p; op_cnt[cntP]:=0;
+  if lineT<>0:  PP(_tmp_line,lineT) fi   if rotT<>0:   PP(_rot_ang,rotT) fi
+  if lenT<>crR: PP(_chg_len,lenT) fi     if envT<>hz:  PP(_chg_env,envT) fi
+  if lineT=nl:  PP(_tmp_len,0) elseif lineT=no: PP(_adj_ang,0) fi PP(_mk_bond,0)
+  if f_lineT=0: lineT:=si; fi  if f_lenT=0: lenT:=crR; fi 
+  if f_rotT=0:  rotT:=0;   fi  if f_envT=0: envT:=hz;  fi
+enddef;
+%-------------------------------------------------------------------------------------------------
+def ps_get(expr n)=
+  nA:=cntP; nB:=cntMC[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 
+    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)=
   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;
+%-------------------------------------------------------------------------------------------------
 def draw_corner(expr LX,LY,PN)=
   drawdot (PN/2,PN/2) wpss PN;       drawdot (LX-PN/2,PN/2) wpss 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;
 enddef;
+%-------------------------------------------------------------------------------------------------
+def proc_size_setup=
+  if (bond_len#*ratio_atom_bond+offset_atom#)<.8bond_len#:
+        atom_wd#:=bond_len#*ratio_atom_bond+offset_atom#;
+  else: atom_wd#:=.8bond_len#; ratio_chain_ring:= .5; fi
+  wedge_wd#:=    bond_len#*ratio_wedge_bond+offset_wedge#;
+  zebra_gap#:=   bond_len#*ratio_zebragap_bond+offset_zebra_gap#;
+  bondgap#:=     bond_len#*ratio_bondgap_bond+offset_bond_gap#;
+  bond_pen_wd#:= bond_len#*ratio_thickness_bond+offset_thickness#;
+  char_pen_wd#:= bond_pen_wd#*ratio_char_bond;
+  define_pixels(bond_len,zebra_gap,wedge_wd,atom_wd,bondgap,bond_pen_wd,char_pen_wd);
+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]);
+    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]]));
+        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;
+        else: str_len:=str_len+atom_wd*tbl_char_wd[nA]; fi  
+      endfor
+      str_ang:=(ang_br[i] mod 360); nF:=str_len;
+      if     (str_ang<=91)or(str_ang>=269): nF:=0; else: str_len:=0; fi
+      if     (xpos-nF+.5atom_wd)<minX: minX:=xpos-nF+.5atom_wd;
+      elseif (xpos+str_len-.5atom_wd)>max_x: max_x:=xpos+str_len-.5atom_wd; fi
+      if     (ypos-nD-.5atom_wd)<minY: minY:=ypos-nD-.5atom_wd;
+      elseif (ypos+nC+.5atom_wd)>max_y: max_y:=ypos+nC+.5atom_wd; fi
+      else: if xpos<minX: minX:=xpos; elseif xpos>max_x: max_x:=xpos; fi
+            if ypos<minY: minY:=ypos; elseif ypos>max_y: max_y:=ypos; fi fi
+  endfor
+  mol_wd:=max_x-minX; mol_ht:=max_y-minY;
+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
+enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def proc_bond_atom(expr n)=
-  begingroup
-  save com,par,adrA,adrB,f_bra,f_end,f_term,rotT,adrS,f_lineT,f_rotT,f_lenT,f_envT,envT,env,
-       lenT,strAT,stkA,stkB,stkL,bondL,temp_len,lineT;
-  numeric stkB[],stkA[],stkL[];
-  f_bra:=f_end:=f_term:=rotT:=adrS:=f_lineT:=f_rotT:=f_lenT:=f_envT:=envT:=env:=strAT:=0;
+  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];
@@ -452,7 +450,7 @@
   elseif com=_cyc:        f_end:=getA(par); add_atom;
   elseif com=_cyc_eB:  f_end:=eB[getB(par)]; add_atom;
   elseif com=_cyc_sB:  f_end:=sB[getB(par)]; add_atom;
-  elseif com=_chg_env: env:=par;
+  elseif com=_chg_env: envB:=par;
   elseif com=_tmp_env: envT:=par;
   elseif com=_set_clr:
      if par=1: if lineT<>si: f_lineT:=1; fi if rotT<>0:  f_rotT:=1; fi
@@ -464,7 +462,6 @@
   elseif com=_set_colorB: colorB[getB(adrT)]:=par;
   fi
   endfor
-  endgroup
 enddef;
 %-------------------------------------------------------------------------------------------------
 def add_atom=
@@ -476,26 +473,22 @@
 enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def proc_skeleton=
-  begingroup
-  save com,par,adrA,adrB,cntA,cntB,angT,adrS,env,envT,rotT,lineT,
-       f_end,f_bra,rotT,f_term,f_lineT,f_rotT,f_lenT,f_envT,stkA,stkB,stkM;
-  numeric stkB[],stkA[],stkM[];
   adrA:=adrB:=cntA:=cntB:=angT:=adrS:=f_end:=f_bra:=rotT:=f_term:=0;
-  envT:=env:=f_lineT:=f_rotT:=f_lenT:=f_envT:=stkM[0]:=0; lineT:=si;
-  angA[0]:=angB[0]:=br_ang[0]:=0; posA[0]:=posB[0]:=posB[1]:=(0,0);
+  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];
-  if com=_push: if par=1: stkM[adrS]:=env; adrS:=adrS+1; stkA[adrS]:=adrA:=cntA;
+  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
-  elseif com=_pop:     if par=1: adrA:=stkA[decr adrS]; adrB:=stkB[adrS]; env:=stkM[adrS];
+  elseif com=_pop:     if par=1: adrA:=stkA[decr adrS]; adrB:=stkB[adrS]; envB:=stkM[adrS];
                        elseif par=0: temp_len:=bondL; fi
   elseif com=_jp_bond:     tempB:=getB(par); posB[cntB+1]:=posA[sB[tempB]];
                            angT:=angB[tempB]-180; f_bra:=1; rotT:=0;
   elseif com=0or_jp_atom:  termB; adrT:=getA(par); posB[cntB+1]:=posA[adrT];
-                           angT:=br_ang[adrT]; f_bra:=1; rotT:=0;
+                           angT:=ang_br[adrT]; f_bra:=1; rotT:=0;
   elseif com=_jp_atom_abs: adrT:=par; posB[cntB+1]:=posA[adrT];
-                           angT:=br_ang[adrT]; f_bra:=1; rotT:=0; temp_cntB:=cntB;
+                           angT:=ang_br[adrT]; f_bra:=1; rotT:=0; temp_cntB:=cntB;
   elseif com=_adj_ang:     if (angT<40)or(angT>320): angT:=0; elseif angT<140: angT:=90;
                            elseif angT<220: angT:=180; else: angT:=270; fi
   elseif com=_mk_bond:     if (par=0)and(rotT<>0):par:=rotT; rotT:=0; fi add_bond(par);
@@ -502,7 +495,7 @@
   elseif com=_rot_ang:     angT:=(angT+par) mod 360;
   elseif com=_tmp_rot:     rotT:=par;
   elseif (com>=_postA)and(com<=_postF): rotT:=0;
-  elseif com=_chg_env: env:=par;
+  elseif com=_chg_env: envB:=par;
   elseif com=_tmp_env: envT:=par;
   elseif com=_set_clr: f_clr:=par; if par=0: lineT:=si; lenT:=crR; rotT:=envT:=0; fi
   elseif com=_cyc:     f_end:=1; proc_cyc(getA(par));
@@ -512,9 +505,21 @@
   elseif com=_stack_reset:   stkA[adrS+1]:=0;
   fi
   endfor
-  endgroup
 enddef;
 %-------------------------------------------------------------------------------------------------
+def add_bond(expr m)=
+  cntB:=cntB+1; if m=_arg_ang: nA:=proc_env(angT,envB,60,-60); else: nA:=m; fi
+  if f_bra=0: adrT:=cntA:=cntA+1; posA[cntA]:=posB[cntB]; angA[cntA]:=angT;
+               if nA>=0: ang_br[cntA]:=angT+nA/2-90; else: ang_br[cntA]:=angT+nA/2+90; fi
+  else: f_bra:=0; fi
+  angB[cntB]:=angT:=(angT+nA) mod 360;
+  if f_end=0: if lenB[cntB]=_size_a: posB[cntB+1]:=sfB(posB[cntB],atom_wd,angT);
+             else: nA:=lenB[cntB];glu:=0; if nA<0: nA:=-nA; glu_c(adrT);glu_c(cntA+1); fi
+             posB[cntB+1]:=sfB(posB[cntB],nA*bond_len+glu,angT); fi
+             posA[cntA+1]:=posB[cntB+1]; f_term:=0;
+  else: f_end:=0; f_term:=1; fi
+enddef;
+%==================================================================================================
 vardef getA(expr n)=
  if n>=0: stkA[adrS+1]+n elseif n>=-999: cntA+n+1 else: stkA[adrS]+n+4095 fi enddef;
 vardef getB(expr n)=
@@ -523,37 +528,24 @@
 def termA= if f_term=0: if f_bra=0: strA[incr cntA]:=strAT; strAT:=0;
            if f_MP=1: colorA[cntA]:=0; fi else: f_bra:=0; fi f_term:=1; fi enddef;
 def termB=
-  if f_term=0: if f_bra=0: br_ang[incr cntA]:=angT; else: f_bra:=0; fi f_term:=1; fi enddef;
+  if f_term=0: if f_bra=0: ang_br[incr cntA]:=angT; else: f_bra:=0; fi f_term:=1; fi enddef;
 def proc_cyc(expr n)= add_bond(angle(posA[n]-posB[cntB+1])-angT);  enddef;
 def glu_c(expr n)=  if strA[n]<>0: nB:=angT mod 180; nC:=.5str_wd[strA[n]]*atom_wd;
                     if (nB<45)or(nB>135):glu:=glu+((sind(nB)*nC)++nC);
                     else                :glu:=glu+((cosd(nB)*.5atom_wd)++.5atom_wd) fi fi
 enddef;
-%-------------------------------------------------------------------------------------------------
-def add_bond(expr m)=
-  cntB:=cntB+1; if m=_arg_ang: nA:=proc_env(angT,env,60,-60); else: nA:=m; fi
-  if f_bra=0: adrT:=cntA:=cntA+1; posA[cntA]:=posB[cntB]; angA[cntA]:=angT;
-               if nA>=0: br_ang[cntA]:=angT+nA/2-90; else: br_ang[cntA]:=angT+nA/2+90; fi
-  else: f_bra:=0; fi
-  angB[cntB]:=angT:=(angT+nA) mod 360;
-  if f_end=0: if lenB[cntB]=_size_a: posB[cntB+1]:=sfB(posB[cntB],atom_wd,angT);
-             else: nA:=lenB[cntB];glu:=0; if nA<0: nA:=-nA; glu_c(adrT);glu_c(cntA+1); fi
-             posB[cntB+1]:=sfB(posB[cntB],nA*bond_len+glu,angT); fi
-             posA[cntA+1]:=posB[cntB+1]; f_term:=0;
-  else: f_end:=0; f_term:=1; fi
-enddef;
-%-------------------------------------------------------------------------------------------------
 vardef proc_env(expr n,m,a,b)=  r:=(n mod 360);
-  if m>=first_def_number: parMC[m][cntB-temp_cntB-1] else:
+  if m>=def_emb_start: parMC[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 pic_c(expr i,s)= substring(i,i+1) of s enddef;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def draw_atom(expr n,p,r,s,w)=
   begingroup
-  save dx,u,j,pairA,pairT; pair pairA,pairT;
+  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("^");
+  %---------------------------------------------------------------------------------------
   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));
@@ -562,50 +554,24 @@
     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:=char_w[nB]; pairA:=pairT+(.5*((dx-1)*nA),u*atom_wd);
+      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_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] shifted (pairA-(0,char_d[nB])) Cp(colorA[n]);
-      pairT:=pairT+(nA*dx,0); fi endfor
+      addto currentpicture also atom_font[nB]
+         shifted (pairA-(0,atom_wd*tbl_char_dp[nB])) Cp(colorA[n]);
+      pairT:=pairT+(nA*dx,0);
+    fi
+  endfor
   endgroup
 enddef;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-def wpcs expr n= withpen pencircle scaled n enddef;
-def wpss expr n= withpen pensquare scaled n enddef;
-def sqr(expr WD,HT)= ((0,0)--(WD,0)--(WD,HT)--(0,HT)--cycle) enddef;
-def sfB(expr p,l,r)= p shifted ((l,0) rotated r) enddef;
-def wz_put(expr PA,PB,PD,CL)=  nC:=length(Le-Ls);
-  for i=0 upto nC/zebra_gap: 
-    nA:=zebra_gap*i/nC; nD:=(zebra_gap*i+ratio_zebra_black*zebra_gap)/nC;
-    if nD>((nC-zebra_gap)/nC): nD:=1; fi
-    fill nA[PB,PA]--nA[PD,PA]--nD[PD,PA]--nD[PB,PA]--cycle Cp(CL); endfor  enddef;
-def bz_put(expr PA,PB,PC,PD,CL)=  nC:=length(Le-Ls);
-  for i=0 upto nC/zebra_gap: 
-    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;
-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];
-  elseif SA=0: Ls:=PA; Le:=cut_off(pT,atom_wd*str_wd[SB],atom_wd,PB); 
-     pA:=Ls--Le; pB:=Ls--nA[PB,PA]; pC:=0.1[PA,PB]--Le;
-  elseif SB=0: Ls:= cut_off(pT,atom_wd*str_wd[SA],atom_wd,PA); Le:=PB;
-     pA:=Ls--Le; pB:=nA[PA,PB]--Le; pC:=Ls--(0.1)[PB,PA];
-  else: Ls:=cut_off(pT,atom_wd*str_wd[SA],atom_wd,PA);
-        Le:=cut_off(pT,atom_wd*str_wd[SB],atom_wd,PB);
-        pB:=nA[PA,PB]--nA[PB,PA]; pC:=pA:=Ls--Le; fi
-enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-def draw_wv=  nB:=3bond_pen_wd; nA:=nB/length(Le-Ls);
-  draw Le for i=1 upto 1/nA: if odd(i): ..controls(((i-.5)*nA)[sfB(Le,nB,ap),sfB(Ls,nB,ap)])
-  else: ..controls(((i-.5)*nA)[sfB(Le,nB,am),sfB(Ls,nB,am)]) fi ..(i*nA)[Le,Ls] endfor ..Ls;
-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;
+  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;
@@ -628,14 +594,14 @@
     elseif LN=wv:draw_wv;
     elseif LN=vf:draw pA Cp(nB);draw sfB(Le,bondgap,ANG-150)--Le--sfB(Le,bondgap,ANG+150) Cp(nB);
     elseif LN=vb:draw pA Cp(nB);draw sfB(Ls,bondgap,ANG-30)--Ls--sfB(Ls,bondgap,ANG+30) Cp(nB);
-    elseif LN=si_:erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs .75bondgap; draw pA Cp(nB);
+    elseif LN=si_:erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs 0.8bondgap; draw pA Cp(nB);
     elseif LN=wf_:erase fill sfB(0.15[Ls,Le],.5ww,ap)--sfB(0.15[Ls,Le],.5ww,am)--
-                             sfB(0.85[Ls,Le],1.25ww,am)--sfB(0.85[Ls,Le],1.25ww,ap)--cycle;
+                             sfB(0.85[Ls,Le],1.3ww,am)--sfB(0.85[Ls,Le],1.3ww,ap)--cycle;
                   fill Ls--sfB(Le,ww,am)--sfB(Le,ww,ap)--cycle;
-    elseif LN=wb_:erase fill sfB(0.15[Ls,Le],1.25ww,ap)--sfB(0.15[Ls,Le],1.25ww,am)--
+    elseif LN=wb_:erase fill sfB(0.15[Ls,Le],1.3ww,ap)--sfB(0.15[Ls,Le],1.3ww,am)--
                              sfB(0.85[Ls,Le],.5ww,am)--sfB(0.85[Ls,Le],.5ww,ap)--cycle;
                   fill sfB(Ls,ww,am)--Le--sfB(Ls,ww,ap)--cycle;
-    elseif LN=bd_:erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs 1.5bondgap;
+    elseif LN=bd_:erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs 1.6bondgap;
                   draw pA withpen penrazor rotated ap scaled bondgap Cp(nB);
     fi
     if (sw_numberB>=1)and(n>=numberB_start)and(n<=numberB_end):
@@ -647,23 +613,40 @@
   endgroup
 enddef;
 %-------------------------------------------------------------------------------------------------
-vardef fit_zero(expr n)=if n<=9: "00" elseif n<=99: "0" fi enddef;
-%-------------------------------------------------------------------------------------------------
-def auxtag_out=
-  for i=1 upto aux_max: exitif tag[i]=""; if i=1: printf tag[1] else: &aux_delimiter&tag[i] fi
-  endfor
+def draw_wv=  nB:=3bond_pen_wd; nA:=nB/length(Le-Ls);
+  draw Le for i=1 upto 1/nA: if odd(i): ..controls(((i-.5)*nA)[sfB(Le,nB,ap),sfB(Ls,nB,ap)])
+  else: ..controls(((i-.5)*nA)[sfB(Le,nB,am),sfB(Ls,nB,am)]) fi ..(i*nA)[Le,Ls] endfor ..Ls;
 enddef;
-%-------------------------------------------------------------------------------------------------
-def auxfile_out=
-  for i=1 upto aux_max:  exitif tag[i]="";
-    if i=1: printf "" else: &aux_delimiter fi if sw_auxfix=0: &tag[i]&":" fi &
-    if     string  scantokens(var[i]): scantokens(var[i])
-    elseif numeric scantokens(var[i]): decimal(scantokens(var[i])) fi
-  endfor
-  if sw_auxfix=0: for i=1 upto inf_num: &aux_delimiter&info[i] endfor; fi
+%------------------------------------------------------------------------------------------------
+def wpcs expr n= withpen pencircle scaled n enddef;
+def wpss expr n= withpen pensquare scaled n enddef;
+def sqr(expr WD,HT)= ((0,0)--(WD,0)--(WD,HT)--(0,HT)--cycle) enddef;
+def sfB(expr p,l,r)= p shifted ((l,0) rotated r) enddef;
+def wz_put(expr PA,PB,PD,CL)=  nC:=length(Le-Ls);
+  for i=0 upto nC/zebra_gap: 
+    nA:=zebra_gap*i/nC; nD:=(zebra_gap*i+ratio_zebra_black*zebra_gap)/nC;
+    if nD>((nC-zebra_gap)/nC): nD:=1; fi
+    fill nA[PB,PA]--nA[PD,PA]--nD[PD,PA]--nD[PB,PA]--cycle Cp(CL); endfor  enddef;
+def bz_put(expr PA,PB,PC,PD,CL)=  nC:=length(Le-Ls);
+  for i=0 upto nC/zebra_gap: 
+    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;
+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];
+  elseif SA=0: Ls:=PA; Le:=cut_off(pT,atom_wd*str_wd[SB],atom_wd,PB); 
+     pA:=Ls--Le; pB:=Ls--nA[PB,PA]; pC:=0.1[PA,PB]--Le;
+  elseif SB=0: Ls:= cut_off(pT,atom_wd*str_wd[SA],atom_wd,PA); Le:=PB;
+     pA:=Ls--Le; pB:=nA[PA,PB]--Le; pC:=Ls--(0.1)[PB,PA];
+  else: Ls:=cut_off(pT,atom_wd*str_wd[SA],atom_wd,PA);
+        Le:=cut_off(pT,atom_wd*str_wd[SB],atom_wd,PB);
+        pB:=nA[PA,PB]--nA[PB,PA]; pC:=pA:=Ls--Le; fi
 enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-mc_num:=first_def_number;
+def_num:=def_emb_start;
+%-------------------------------------------------------------------------------------------------
 lr:='(60 for i==1 upto 10:: ,-60,60 endfor); rl:='(-60,lr);
 def ring expr n= <((-180 DIV n)-90),(_chg_len,0),
   for i==2 upto n:: ,(360 DIV n) endfor,(_cyc_sB,1-n) enddef;
@@ -674,7 +657,7 @@
 Me:='(); Et:=!; Pr:='(!2); Bu:='(!3);
 for i=4,5,6:   for j=2 upto i-2: ?[i][j]:='((_fuse,i),(j,0)); endfor endfor
 for i=5,6,7,8: for j=11 upto 15: ?[i][j]:='((_fuse,i),(j,0)); endfor endfor
-%-------------------------------------------------------------------------------------------------
+%=================================================================================================
 H :='("H");C:='("C");N:='("N");O:='("O");F:='("F");S:='("S");P:='("P");I:='("I");
 Si:='("{Si}");Al:='("{Al}");Mg:='("{Mg}");Zn:='("{Zn}");As:='("{As}");Cu:='("{Cu}");
 Ag:='("{Ag}");Au:='("{Au}");Sn:='("{Sn}");Cl:='("{Cl}");Br:='("{Br}");Li:='("{Li}");
@@ -691,7 +674,7 @@
 NHtBu:='(NH,!,tBu);NHH:='(N,/H,!,H); NHMe:='(NH,!); NHEt:='(NH,!,Et);
 CF2:='(/F,60,F); CCl2:='(/Cl,60,Cl); CBr2:='(/Br,60,Br); CF3:='(/F,/F^60,60,F);
 CCl3:='(/Cl,/Cl^60,60,Cl);CBr3:='(/Br,/Br^60,60,Br);O_H:='(O,!,H);CO_H:='(//O,!,H);
-%------------------------------------------------------------------------------------------------
+%==================================================================================================
 CO_OH:='(//O,!,O,!,H); C_N:='(!~tm,N); N_HH:='(N,/H,60,H); N_OO:='(N,//O,60~dm,O);
 S_H:='(S,!,H); N_H:='(N,/H); C_HHH:='(/H,/H^60,60,H);
 %--------------------------------------------------------------------------------------------------
@@ -698,116 +681,141 @@
 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;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-def SP(expr a,b)expr p=subpath(a*length(p),b*length(p)) of p enddef;
-def vL= withpen penrazor scaled fP enddef;
-def hL= withpen penrazor rotated 90 scaled fP enddef;
-def sH expr a= shifted (0,a) enddef;
-def PO= z10..(.8aW,fH)..tension 1.5..(.2aW,fH)..z09..(.2aW,hP)..tension 1.5..(.8aW,hP)..cycle
+%==================================================================================================
+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));
+    tbl_char_wd[nA]:=a; tbl_char_ht[nA]:=b; tbl_char_dp[nA]:=c;
+  endfor
 enddef;
-def POh= (hP,.25aH)..z19..(fW,.25aH)..(hW,hH)..cycle enddef;
+%---------------------------------------------------------------
+char_size_set( 1)( 1)(  0)("CGHMNOQ");
+char_size_set(.9)( 1)(  0)("ABDEFIJKLPRSTUVWXYZ-+/><m");
+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)=
+begingroup
+save Z,aW,aH,fW,hW,hW,hH,fP,hP,vL,hL,PO,POh,sH,FD;
+pair Z[];
+%---------------------------------------------------------------
 def FD(expr c)(text s)=
-if f_char[ASCII(c)]=1:
-  aW:=char_w[ASCII(c)]*(1-ratio_atomgap_atom*2);
-  aH:=char_h[ASCII(c)]*(1-ratio_atomgap_atom*2);
-  fW:=aW-hP; hW:=.5aW; fH:=aH-hP; hH:=.5aH;
-  z01=( 0,hP); z02=(hP, 0); z03=(hP,hP); z05=(aW,hP); z07=(fW, 0); z08=( 0,hH); z09=(hP,hH);
-  z10=(fW,hH); z12=( 0,fH); z13=(hP,fH); z14=(hW,fH); z16=(aW,fH); z18=(hP,aH); z19=(hW,hP);
-  s;
-  atom_font[ASCII(c)]:=
+  if f_char[ASCII(c)]=1:
+    aW#:=atom_wd#*tbl_char_wd[ASCII(c)]*(1-ratio_atomgap_atom*2);
+    aH#:=atom_wd#*tbl_char_ht[ASCII(c)]*(1-ratio_atomgap_atom*2);
+    define_pixels(aW,aH);
+    fW:=aW-hP; hW:=.5aW; fH:=aH-hP; hH:=.5aH;
+    Z01:=( 0,hP); Z02:=(hP, 0); Z03:=(hP,hP); Z04:=(aW,hP); Z05:=(fW, 0); Z08:=( 0,hH);
+    Z09:=(hP,hH); Z10:=(fW,hH); Z12:=( 0,fH); Z13:=(hP,fH); Z14:=(hW,fH); Z16:=(aW,fH);
+    Z18:=(hP,aH); Z19:=(hW,hP); Z20:=(hW,hH); Z06:=(hW,aH); Z07:=(hW, 0); Z11:=(hW,aW);
+    Z15:=(fW,aH); Z17:=(aW,hH);
+    s;
+    atom_font[ASCII(c)]:=
     currentpicture shifted (ratio_atomgap_atom*atom_wd,ratio_atomgap_atom*atom_wd);
-  clearxy; save x,y; clearit;
-fi
+    clearit;
+  fi
 enddef;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-def char_font_setup(expr a)= pickup pencircle scaled a; fP:=a; hP:=.5a;
+%-----------------------------------------------------------------------------------------
+def vL= withpen penrazor scaled fP enddef;
+def hL= withpen penrazor rotated 90 scaled fP enddef;
+def PO=
+  Z10..(.8aW,fH)..tension 1.5..(.2aW,fH)..Z09..(.2aW,hP)..tension 1.5..(.8aW,hP)..cycle enddef;
+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;
 FD(" ")();
-FD(".")(drawdot z19 wpcs fP);
-FD(",")(drawdot z19 wpcs fP; draw (hW+.5fP,hP)..(hW+.3fP,-fP)..(hW-.5fP,hP-2fP));
-FD("'")(drawdot z14 wpcs fP; draw (hW+.5fP,fH)..(hW+.3fP,fH-fP)..(hW-.5fP,fH-2fP));
+FD(".")(drawdot Z19 wpcs fP);
+FD(",")(drawdot Z19 wpcs fP; draw (hW+.5fP,hP)..(hW+.3fP,-fP)..(hW-.5fP,hP-2fP));
+FD("'")(drawdot Z14 wpcs fP; draw (hW+.5fP,fH)..(hW+.3fP,fH-fP)..(hW-.5fP,fH-2fP));
 FD("`")(drawdot (hW,fH-2fP) wpcs fP;draw (hW-.5fP,fH-2fP)..(hW-.3fP,fH-fP)..(hW+.5fP,fH));
 FD(":")(drawdot (hW,.2aH) wpcs fP; drawdot (hW,.8aH) wpcs fP); 
 FD(";")(drawdot (hW,.2aH) wpcs fP; drawdot (hW,.8aH) wpcs fP;draw (hW+hP,.2aH)..(hW-hP,.2aH-2fP));
-FD("(")(draw z19...z09...z14);
-FD(")")(draw z19...z10...z14);
-FD(">")(cutdraw z01--(aW,hH)--z12);
-FD("<")(cutdraw z16--z08--z05);
-FD("0")(draw z09...z14...z10...z19...cycle);
-FD("1")(draw (hW, 0)--(hW,aH)--(hW-hP,fH)--(hW-hP,aH-2.5hP) vL);
-FD("2")(cutdraw SP(0,.71)(hP,1.3hP)--(fW,.55aH)..z14..(hP,.5aH)..(hW,.27aH); draw z05--z01 hL);
-FD("3")(cutdraw SP(0,.77)POh; cutdraw SP(.23,.95)POh sH .5aH-hP; draw (.3aW,hH)--(hW,hH) hL);
+FD("(")(draw Z19...Z09...Z14);
+FD(")")(draw Z19...Z10...Z14);
+FD(">")(cutdraw Z01--Z17--Z12);
+FD("<")(cutdraw Z16--Z08--Z04);
+FD("0")(draw Z09...Z14...Z10...Z19...cycle);
+FD("1")(draw Z07--Z06--(hW-hP,fH)--(hW-hP,aH-2.5hP) vL);
+FD("2")(cutdraw SP(0,.71)(hP,1.3hP)--(fW,.55aH)..Z14..(hP,.5aH)..(hW,.27aH); draw Z04--Z01 hL);
+FD("3")(cutdraw SP(0,.77)POh; cutdraw SP(.23,.95)POh sH .5aH-hP; draw (.3aW,hH)--Z20 hL);
 FD("4")(draw (0,.3aH)--(aW,.3aH) hL; draw (.7aW,0)--(.7aW,aH)--(1.2hP,.3aH+hP) vL);
-FD("5")(draw z12--z16 hL; draw z13--(hP,.49aH) vL;
+FD("5")(draw Z12--Z16 hL; draw Z13--(hP,.49aH) vL;
         cutdraw (.5hP,.15aH)..(.65aW,1.3hP)..(fW,.3aH)..(hW,.6aH)..(.6hP,.53aH));
-FD("6")(draw z19..(fW,.5fW)..(hW,fW)..(hP,.5fW)..cycle; cutdraw (hP,.4aH)--(hW,aH));
-FD("7")(draw (0,.fH)--(aW,fH) hL; draw (aW-1.2hP,aH-fP)--(.4aW,0) vL scaled 1.2);
-FD("8")(draw POh; draw (hP,.75aH)...z14...(fW,.75aH)...(hW,hH)...cycle;);
-FD("9")(draw z19..(fW,.5fW)..(hW,fW)..(hP,.5fW)..cycle sH .32aH; cutdraw (fW,.6aH)--(hW, 0));
-FD("A")(draw z02--(hW,aH)--z07 vL scaled 1.14; draw .33[z02,(hW,aH)]--.33[z07,(hW,aH)]);
-FD("B")(draw z13--z14{right}..(.9fH,.75aH)..{left}(.5aW,hH)--z09--(.5aW,hH){right}..
-            (.9fH,.25aH)..{left}z19--z03; draw z02--z18 vL);
+FD("6")(draw Z19..(fW,.5fW)..(hW,fW)..(hP,.5fW)..cycle; cutdraw (hP,.4aH)--Z06);
+FD("7")(draw (0,.fH)--Z16 hL; draw (aW-1.2hP,aH-fP)--(.4aW,0) vL scaled 1.2);
+FD("8")(draw POh; draw (hP,.75aH)...Z14...(fW,.75aH)...Z20...cycle;);
+FD("9")(draw Z19..(fW,.5fW)..(hW,fW)..(hP,.5fW)..cycle sH .32aH; cutdraw (fW,.6aH)--Z07);
+FD("A")(draw Z02--Z06--Z05 vL scaled 1.14; draw .33[Z02,Z06]--.33[Z05,Z06]);
+FD("B")(draw Z13--Z14{right}..(.9fH,.75aH)..{left}(.5aW,hH)--Z09--(.5aW,hH){right}..
+            (.9fH,.25aH)..{left}Z19--Z03; draw Z02--Z18 vL);
 FD("C")(cutdraw SP(.05,.95)PO); 
-FD("D")(draw z13--z14..z10..z19--z03; draw z02--z18 vL);
-FD("E")(draw z05--z01 hL;draw z12--z16 hL;draw z08--(aW,hH) hL;draw z02--z18 vL);
-FD("F")(draw z12--z16 hL; draw (0,.45aH)--(fW,.45aH) hL; draw z02--z13 vL);
-FD("G")(cutdraw SP(.06,.97)PO; draw bot (hW,hH)-- bot (aW,hH) hL);
-FD("H")(draw z02--z18 vL; draw z09--z10; draw z07--(fW,aH) vL);
-FD("I")(draw z19--z14 vL; draw (hW-fP,hP)--(hW+fP,hP) hL; draw (hW-fP,fH)--(hW+fP,fH) hL);
-FD("J")(cutdraw z09..(hP,.4aH){down}..{right}z19{right}..{up}(fW,.4aH)..(fW,aH));
-FD("K")(cutdraw z02--z18; cutdraw .5[.45[z02,z18],z16]--z07; cutdraw .45[z02,z18]--z16);
-FD("L")(draw z05--z01 hL; draw z02--z18 vL);
-FD("M")(draw z02--z18 vL; draw z18--z19--(fW,aH) vL scaled 1.14; draw (fW,aH)--z07 vL);
-FD("N")(draw z02--z18 vL; draw z07--(fW,aH) vL;draw (1.4hP,aH)--(aW-1.4hP,0) vL scaled 1.4);
+FD("D")(draw Z13--Z14..Z10..Z19--Z03; draw Z02--Z18 vL);
+FD("E")(draw Z04--Z01 hL;draw Z12--Z16 hL;draw Z08--Z17 hL;draw Z02--Z18 vL);
+FD("F")(draw Z12--Z16 hL; draw (0,.45aH)--(fW,.45aH) hL; draw Z02--Z13 vL);
+FD("G")(cutdraw SP(.06,.97)PO; draw bot Z20-- bot Z17 hL);
+FD("H")(draw Z02--Z18 vL; draw Z09--Z10; draw Z05--Z15 vL);
+FD("I")(draw Z19--Z14 vL; draw (hW-fP,hP)--(hW+fP,hP) hL; draw (hW-fP,fH)--(hW+fP,fH) hL);
+FD("J")(cutdraw Z09..(hP,.4aH){down}..{right}Z19{right}..{up}(fW,.4aH)..Z15);
+FD("K")(cutdraw Z02--Z18; cutdraw .5[.45[Z02,Z18],Z16]--Z05; cutdraw .45[Z02,Z18]--Z16);
+FD("L")(draw Z04--Z01 hL; draw Z02--Z18 vL);
+FD("M")(draw Z02--Z18 vL; draw Z18--Z19--Z15 vL scaled 1.14; draw Z15--Z05 vL);
+FD("N")(draw Z02--Z18 vL; draw Z05--Z15 vL;draw (1.4hP,aH)--(aW-1.4hP,0) vL scaled 1.4);
 FD("O")(draw PO);
-FD("P")(draw z02--z18 vL; draw z13--(.3aW,fH){right}..(fW,.7aH)..{left}(.3aW,.44aH)..(hP,.44aH))
-FD("Q")(draw PO; draw (.6aW,.4aH)--z07);
-FD("R")(draw z02--z18 vL; draw z13--(.3aW,fH){right}..(fW,.7aH)..{left}(.3aW,.44aH)..(hP,.44aH);
-        cutdraw z07{up}..{left}(hW,.44aH));
+FD("P")(draw Z02--Z18 vL; draw Z13--(.3aW,fH){right}..(fW,.7aH)..{left}(.3aW,.44aH)..(hP,.44aH))
+FD("Q")(draw PO; draw (.6aW,.4aH)--Z05);
+FD("R")(draw Z02--Z18 vL; draw Z13--(.3aW,fH){right}..(fW,.7aH)..{left}(.3aW,.44aH)..(hP,.44aH);
+        cutdraw Z05{up}..{left}(hW,.44aH));
 FD("S")(cutdraw SP(.05,.45)PO; cutdraw SP(.55,.95)PO; draw (fW,.3aH){up}..{up}(hP,.7aH));
-FD("T")(draw z12--z16 hL;draw .5[z12,z16]--(hW, 0) vL);
-FD("U")(cutdraw z18..z09{down}..{right}z19{right}..{up}z10..(fW,aH));
-FD("V")(draw z18--(hW, 0) vL scaled 1.2; draw (hW, 0)--(fW,aH) vL scaled 1.2);
-FD("W")(draw z18--(.25aW,0)--(hW,aH)--(.75aW,0)--(fW,aH) vL scaled 1.08);
-FD("X")(draw z18..z07 vL scaled 1.4; draw z02..(fW,aH) vL scaled 1.4);
-FD("Y")(draw z18--(hW,hH)--(fW,aH) vL scaled 1.2; draw (hW,hH)--(hW, 0) vL);
-FD("Z")(draw z12--z16 hL;draw (1.4hP,fP)--(aW-1.4hP,aH-fP) vL scaled 1.4;draw z01--z05 hL);
-FD("-")(draw z09--z10 hL);
+FD("T")(draw Z12--Z16 hL;draw .5[Z12,Z16]--Z07 vL);
+FD("U")(cutdraw Z18..Z09{down}..{right}Z19{right}..{up}Z10..Z15);
+FD("V")(draw Z18--Z07--Z15 vL scaled 1.2);
+FD("W")(draw Z18--(.25aW,0)--Z06--(.75aW,0)--Z15 vL scaled 1.08);
+FD("X")(draw Z18..Z05 vL scaled 1.4; draw Z02..Z15 vL scaled 1.4);
+FD("Y")(draw Z18--Z20--Z15 vL scaled 1.2; draw Z20--Z07 vL);
+FD("Z")(draw Z12--Z16 hL;draw (1.4hP,fP)--(aW-1.4hP,aH-fP) vL scaled 1.4;draw Z01--Z04 hL);
+FD("-")(draw Z09--Z10 hL);
 FD("=")(draw (hP,.3aH)--(fW,.3aH) hL;draw (hP,.6aH)--(fW,.6aH) hL);
-FD("/")(draw (fW,fH)..z01);
-FD("+")(draw z19--z14 vL; draw z09--z10 hL);
-FD("a")(draw z19..z10..z14..z09..cycle; draw z07--(fW,aH) vL);
-FD("b")(draw z19..z10..(hW,aW)..z09..cycle; draw z02--(hP,1.2aH) vL);
-FD("c")(cutdraw SP(.06,.94)z10..z14..z09..z19..cycle);
-FD("d")(draw z19..z10..(hW,aW)..z09..cycle; draw z07--(fW,1.2aH) vL);
-FD("e")(cutdraw SP(0,.92)z10..z14..z09..z19..cycle; draw z10--z09);
-FD("f")(cutdraw (.5aW,0)--(.5aW,.75aH){up}..(.75aW,fH)..{down}(fW,.8aH); draw z08--(aW,hH) hL);
-FD("g")(draw z19..z10..(hW,aW)..z09..cycle sH .3aH; cutdraw (fW,aH)--(fW,hP)..(hW,0)..(.1aW,fP));
-FD("h")(draw z02..(hP,.3aH){up}..(hW,.7fH)..{down}(fW,.3aH)..z07; draw (hP,.3aH)--z18 vL);
-FD("i")(draw (hW, 0)--(hW,.63aH) vL; draw z14 wpcs 1.4fP);
-FD("j")(draw z19--(hW,.63aH) vL; draw z19..(.25aW,-hP)..z01; draw z14 wpcs 1.4fP);
-FD("k")(draw z02--z18 vL; cutdraw .5[.45[z02,z18],z16]--z07; cutdraw .45[z02,z18]--z16);
-FD("l")(draw (hW, 0)--(hW,aH) vL; draw z14--z13 hL; draw z19--(fW,hP) hL);
-FD("m")(cutdraw z02..(hP,.3aH){up}..(.28aW,.7fH)..{down}(hW,.3aH)..(hW, 0);
-        cutdraw (hW,.3aH){up}..(.7aW,.7aH-hP)..{down}(fW,.3aH)..z07; draw (hP,.3aH)--(hP,.7aH) vL);
-FD("n")(cutdraw z02..(hP,.3aH){up}..(hW,.7fH)..{down}(fW,.3aH)..z07; draw (hP,.3aH)--(hP,.7aH) vL);
-FD("o")(draw z19..z10..z14..z09..cycle);
-FD("p")(draw z19..z10..(hW,aW)..z09..cycle sH .3aH; draw (hP,0)--z18 vL);
-FD("q")(draw z19..z10..(hW,aW)..z09..cycle sH .3aH; draw (fW,0)--(fW,aH) vL);
-FD("r")(cutdraw SP(.35,.72)z19..z10..z14..z09..cycle sH -fP; draw z02--z18 vL);
+FD("/")(draw (fW,fH)..Z01);
+FD("+")(draw Z19--Z14 vL; draw Z09--Z10 hL);
+FD("a")(draw Z19..Z10..Z14..Z09..cycle; draw Z05--Z15 vL);
+FD("b")(draw Z19..Z10..Z11..Z09..cycle; draw Z02--(hP,1.2aH) vL);
+FD("c")(cutdraw SP(.06,.94)Z10..Z14..Z09..Z19..cycle);
+FD("d")(draw Z19..Z10..Z11..Z09..cycle; draw Z05--(fW,1.2aH) vL);
+FD("e")(cutdraw SP(0,.92)Z10..Z14..Z09..Z19..cycle; draw Z10--Z09);
+FD("f")(cutdraw (.5aW,0)--(.5aW,.75aH){up}..(.75aW,fH)..{down}(fW,.8aH); draw Z08--Z17 hL);
+FD("g")(draw Z19..Z10..Z11..Z09..cycle sH .3aH; cutdraw Z15--(fW,hP)..(hW,0)..(.1aW,fP));
+FD("h")(draw Z02..(hP,.3aH){up}..(hW,.7fH)..{down}(fW,.3aH)..Z05; draw (hP,.3aH)--Z18 vL);
+FD("i")(draw Z07--(hW,.63aH) vL; draw Z14 wpcs 1.4fP);
+FD("j")(draw Z19--(hW,.63aH) vL; draw Z19..(.25aW,-hP)..Z01; draw Z14 wpcs 1.4fP);
+FD("k")(draw Z02--Z18 vL; cutdraw .5[.45[Z02,Z18],Z16]--Z05; cutdraw .45[Z02,Z18]--Z16);
+FD("l")(draw Z07--Z06 vL; draw Z14--Z13 hL; draw Z19--(fW,hP) hL);
+FD("m")(cutdraw Z02..(hP,.3aH){up}..(.28aW,.7fH)..{down}(hW,.3aH)..Z07;
+        cutdraw (hW,.3aH){up}..(.7aW,.7aH-hP)..{down}(fW,.3aH)..Z05; draw (hP,.3aH)--(hP,.7aH) vL);
+FD("n")(cutdraw Z02..(hP,.3aH){up}..(hW,.7fH)..{down}(fW,.3aH)..Z05; draw (hP,.3aH)--(hP,.7aH) vL);
+FD("o")(draw Z19..Z10..Z14..Z09..cycle);
+FD("p")(draw Z19..Z10..Z11..Z09..cycle sH .3aH; draw (hP,0)--Z18 vL);
+FD("q")(draw Z19..Z10..Z11..Z09..cycle sH .3aH; draw (fW,0)--Z15 vL);
+FD("r")(cutdraw SP(.35,.72)Z19..Z10..Z14..Z09..cycle sH -fP; draw Z02--Z18 vL);
 FD("s")(cutdraw SP(.05,.45)PO; cutdraw SP(.55,.95)PO; draw (fW,.3aH){up}..{up}(hP,.7aH));
-FD("t")(draw (hW, 0)--(hW,aH) vL; draw (0,.66aH)--(aW,.66aH) hL);
-FD("u")(cutdraw z18..(hP,.55aH){down}..z19..(fW,.55aH){up}..(fW,aH); draw (fW,aH)--z07 vL);
-FD("v")(draw z18--(hW, 0)--(fW,aH) vL);
-FD("w")(draw z18--(.25aW,0)--(hW,aH)--(.75aW,0)--(fW,aH) vL);
-FD("x")(draw z18--z07 vL scaled 1.4; draw (fW,aH)--z02 vL scaled 1.4);
-FD("y")(draw z18--(hW,hH) vL scaled 1.4; draw (fW,aH)--z02 vL scaled 1.4);
-FD("z")(draw z12--z16 hL;draw (1.4hP,fP)--(aW-1.4hP,aH-fP) vL scaled 1.4; draw z01--z05 hL);
+FD("t")(draw Z07--Z06 vL; draw (0,.66aH)--(aW,.66aH) hL);
+FD("u")(cutdraw Z18..(hP,.55aH){down}..Z19..(fW,.55aH){up}..Z15; draw Z15--Z05 vL);
+FD("v")(draw Z18--Z07--Z15 vL);
+FD("w")(draw Z18--(.25aW,0)--Z06--(.75aW,0)--Z15 vL);
+FD("x")(draw Z18--Z05 vL scaled 1.4; draw Z15--Z02 vL scaled 1.4);
+FD("y")(draw Z18--Z20 vL scaled 1.4; draw Z15--Z02 vL scaled 1.4);
+FD("z")(draw Z12--Z16 hL;draw (1.4hP,fP)--(aW-1.4hP,aH-fP) vL scaled 1.4; draw Z01--Z04 hL);
+endgroup
 enddef;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def blank_str:= "            " enddef;
-def fixed_r(expr n)(expr s)= (substring(0,n-length(s)) of blank_str)&s enddef;
-def fixed_l(expr n)(expr s)= s&(substring(0,n-length(s)) of blank_str) enddef;
-def fdr(expr n)(expr s)=fixed_r(n)(decimal(s)) enddef;
+vardef fixed_r(expr n)(expr s)= (substring(0,n-length(s)) of blank_str)&s enddef;
+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:
@@ -814,7 +822,7 @@
     warning(fdr(4)(s)&" ["&com_str[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
@@ -829,16 +837,21 @@
     fi
   endfor
 enddef;
-%--------------------------------------------------------------------------------------------------
-def STa(expr a,b)= tblA[incr awt_tbl_cnt]:=a; tblN[awt_tbl_cnt]:=0; tblWt[awt_tbl_cnt]:=b; enddef;
-def STb(expr a)(text s)=  tblA[incr awt_tbl_cnt]:=a; tblN[awt_tbl_cnt]:=0;
-  for list=s: tblN[awt_tbl_cnt]:=tblN[awt_tbl_cnt]+1;
-    for j=1 upto awt_tbl_cnt: if list=tblA[j]: tblB[awt_tbl_cnt][tblN[awt_tbl_cnt]]:=j; fi endfor
+%==================================================================================================
+def STa(expr a,b)=
+  tbl_atom_str[incr tbl_cnt]:=a; tbl_atom[tbl_cnt]:=0; tbl_atom_wt[tbl_cnt]:=b;
+enddef;
+%----------------------------------------------------------------------------------
+def STb(expr a)(text s)=
+  tbl_atom_str[incr tbl_cnt]:=a; tbl_atom[tbl_cnt]:=0;
+  for list=s: tbl_atom[tbl_cnt]:=tbl_atom[tbl_cnt]+1;
+    for j=1 upto tbl_cnt:
+      if list=tbl_atom_str[j]: tbl_subst[tbl_cnt][tbl_atom[tbl_cnt]]:=j; fi
+    endfor
   endfor
 enddef;
-%--------------------------------------------------------------------------------------------------
-awt_tbl_cnt:=0;
-def set_atom_wt_tbl=
+%==================================================================================================
+tbl_cnt:=0;
 STa("C",12.0107); STa("H",1.00794);  STa("{Al}",26.9815); STa("{As}",74.9236); STa("B",10.811);
 STa("{Br}",79.904); STa("{Ca}",40.078); STa("{Cl}",35.453); STa("{Cu}",63.546); STa("D",2.012);
 STa("F",18.9984); STa("{Fe}",55.845); STa("{Hg}",200.59); STa("I",126.90447); STa("K",39.0983);
@@ -851,8 +864,7 @@
 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");
-enddef;
-%===================================================================================================
+%==================================================================================================
 def proc_calc_out=
   begingroup
   save warning_cnt,cal_MW,cal_MWp,knownA,cal_FM,bondC,tmp_wtp,bond_cnt,hide_H,
@@ -862,9 +874,8 @@
          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;
-  if awt_tbl_cnt=0: set_atom_wt_tbl fi
   proc_get_info;
-  for i=1 upto awt_tbl_cnt: sumA[i]:=0; endfor
+  for i=1 upto tbl_cnt: sumA[i]:=0; endfor
   for i=1 upto cntA: knownA:=bond_cnt:=0;
     for j=1 upto cntB: if     (lineB[j]=dl)or(lineB[j]=dr)or(lineB[j]=dm): bondC[j]:=2;
                        elseif (lineB[j]=tm): bondC[j]:=3; elseif lineB[j]=nl: bondC[j]:=0;
@@ -875,29 +886,43 @@
     if com_str[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 awt_tbl_cnt:
-      if com_str[strA[i]]=tblA[j]:
-        if tblN[j]=0: sumA[j]:=sumA[j]+1;
-        else: for k=1 upto tblN[j]: sumA[tblB[j][k]]:=sumA[tblB[j][k]]+1; endfor fi
+    for j=1 upto tbl_cnt:
+      if com_str[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
   endfor
   sumA[2]:=sumA[2]+hide_H;
-  for i=1 upto awt_tbl_cnt:
+  for i=1 upto tbl_cnt:
     if sumA[i]>=1:
-      tmp_wtp:=(tblWt[i]/100)*sumA[i];
-      if (tmp_wtp<=40)and(cal_MWp<=40): cal_MW:=cal_MW+(tblWt[i]*sumA[i]);
+      tmp_wtp:=(tbl_atom_wt[i]/100)*sumA[i];
+      if (tmp_wtp<=40)and(cal_MWp<=40): cal_MW:=cal_MW+(tbl_atom_wt[i]*sumA[i]);
       else: cal_MWp:=cal_MWp+tmp_wtp; fi
-      cal_FM:=cal_FM&stripP(tblA[i]) if sumA[i]>=2: &decimal(sumA[i]) fi;
+      cal_FM:=cal_FM&stripP(tbl_atom_str[i]) if sumA[i]>=2: &decimal(sumA[i]) fi;
     fi
   endfor
-  if sw_auxout=1:    auxfile_out;   fi
-  if sw_checklist=1: checklist_out; fi
-  if sw_MOLout=1:    MOLfileout;    fi
+  if sw_auxout=1:    proc_auxfile_out;   fi
+  if sw_checklist=1: proc_checklist_out; fi
+  if sw_MOLout=1:    proc_MOLfile_out;    fi
   endgroup
 enddef;
 %==================================================================================================
-def checklist_out=  nA:=0;
+def auxtag_out=
+  for i=1 upto aux_max: exitif tag[i]=""; if i=1: printf tag[1] else: &aux_delimiter&tag[i] fi
+  endfor
+enddef;
+%==================================================================================================
+def proc_auxfile_out=
+  for i=1 upto aux_max:  exitif tag[i]="";
+    if i=1: printf "" else: &aux_delimiter fi if sw_auxfix=0: &tag[i]&":" fi &
+    if     string  scantokens(var[i]): scantokens(var[i])
+    elseif numeric scantokens(var[i]): decimal(scantokens(var[i])) fi
+  endfor
+  if sw_auxfix=0: for i=1 upto inf_num: &aux_delimiter&info[i] endfor; fi
+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]);
@@ -917,10 +942,11 @@
   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
-  for i=1 upto awt_tbl_cnt:
+  for i=1 upto tbl_cnt:
     if sumA[i]>=1:
-       message "% "&fixed_l(4)(stripP(tblA[i]))&"("&fdr(9)(tblWt[i])&") * "&fdr(6)(sumA[i])&" = "
-       if tmp_wtp<=40: &fdr(12)(tblWt[i]*sumA[i]); else: &fdr(12)(tmp_wtp)&" * 100"; fi fi
+       message "% "&fixed_l(4)(stripP(tbl_atom_str[i]))&"("&fdr(9)(tbl_atom_wt[i])&
+               ") * "&fdr(6)(sumA[i])&" = "
+       if tmp_wtp<=40: &fdr(12)(tbl_atom_wt[i]*sumA[i]); else: &fdr(12)(tmp_wtp)&" * 100"; fi fi
   endfor
   message "% Weight  Calc: " &cal_MW_str &" / Input: "
     if inf_MW<>"": &inf_MW &" / weight gap= " &decimal(cal_MW-scantokens(inf_MW)) fi;
@@ -928,8 +954,8 @@
     if inf_FM<>"": &inf_FM&" / "&  if inf_FM=cal_FM: "MACTCH" else: "NOT MACTCH" fi fi;
   message "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%";
 enddef;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-def MOLfileout=
+%==================================================================================================
+def proc_MOLfile_out=
   mp_log_name:=jobname&"-"&fit_zero(char_num)&decimal(char_num)&"-"&inf_EN&".mol";
   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";
@@ -944,4 +970,6 @@
     printf fdr(3)(sB[i])&fdr(3)(eB[i])&fdr(3)(nA)&fdr(3)(nB)&"     0  0"; fi endfor
   printf "M  END";
 enddef;
+%-------------------------------------------------------------------------------------------------
+vardef fit_zero(expr n)=if n<=9: "00" elseif n<=99: "0" fi enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



More information about the tex-live-commits mailing list