texlive[57116] Master/texmf-dist: mcf2graph (12dec20)

commits+karl at tug.org commits+karl at tug.org
Sat Dec 12 23:12:12 CET 2020


Revision: 57116
          http://tug.org/svn/texlive?view=revision&revision=57116
Author:   karl
Date:     2020-12-12 23:12:12 +0100 (Sat, 12 Dec 2020)
Log Message:
-----------
mcf2graph (12dec20)

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_exa_soc.mf
    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/doc/metapost/mcf2graph/mcf_mplib_exa.tex
    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	2020-12-12 00:47:53 UTC (rev 57115)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/CHANGELOG	2020-12-12 22:12:12 UTC (rev 57116)
@@ -1,6 +1,10 @@
 *******************************************************************************
- Changelog of mcf2graph software package          by Akira Yamaji 2020-11-03
+ Changelog of mcf2graph software package          by Akira Yamaji 2020-12-12
 *******************************************************************************
+[ver. 4.54  / 2022-12-12]
+  -fix bug in report output
+  -update MCF manual,example
+
 [ver. 4.53  / 2020-11-03]
   -improve inline definition
   -update MCF manual(add index),example

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/README
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/mcf2graph/README	2020-12-12 00:47:53 UTC (rev 57115)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/README	2020-12-12 22:12:12 UTC (rev 57116)
@@ -1,7 +1,7 @@
 ********************************************************************************
  mcf2graph  : Convert Molecular Coding Format to graphics with METAFONT/METAPOST
  Author     : Akira Yamaji
- version    : 4.53 2020-11-03
+ version    : 4.54 2020-12-12
  E-mail     : mcf2graph at gmail.com
  Located at : http://www.ctan.org/pkg/mcf2graph
 ********************************************************************************

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_exa_soc.mf
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_exa_soc.mf	2020-12-12 00:47:53 UTC (rev 57115)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_exa_soc.mf	2020-12-12 22:12:12 UTC (rev 57116)
@@ -1,7 +1,9 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Molecular Coding Format for mcf_example.tex   by Akira Yamaji  2020.11.03
+% Molecular Coding Format for mcf_example.tex   by Akira Yamaji  2020.12.12
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-input mcf2graph.mf;   %%% it must be version 4.53 or later
+input mcf2graph.mf;   %%% it must be version 4.54 or later
+message "mcf_exa_soc 2020.12.12";
+message "";
 %-------------------------------------------------------------------------
 fsize:=(33mm,24mm);
 max_blength:=4.5mm;
@@ -50,14 +52,14 @@
 endfont
 %***************************************************************************
 beginfont("EN:Oxine-Copper","MW:351.852")
-  MC(Ph,4:N,5=Ph,-4:\,O,-60,<90,Cu,-90,O,60,|,Ph,5=Ph,10:N,||,
+  MC(Ph,4:N,5=Ph,-4:\,O,-60,<90,Cu,-90,O,60,
+       |,Ph,5=Ph,10:N,||,
      4:@,12~vf:#,23:@,12~vf:#)
 endfont
 %***************************************************************************
 beginfont("EN:Tetraconazole","MW:372.145")
   MC(<-6,
-    ?5,{2,5}=dl,{1,2,4}:N,4:\,!3,O,!,/F^35,/F^-35,!,CF2,
-      7:\,|,Ph,{4,6}:/Cl)
+    ?5,{2,5}=dl,{1,2,4}:N,4:\,!3,O,!,/F^35,/F^-35,!,CF2,7:\,|,Ph,{4,6}:/Cl)
 endfont
 %***************************************************************************
 beginfont("EN:Endosulfan","MW:406.904");
@@ -130,7 +132,7 @@
     4:*\^15,NH,!,//O,!,*/NH2,!,Ph)
 endfont
 %***************************************************************************
-beginfont("EN:Cefalonium","MW:458.5107")
+beginfont("EN:Cefalonium","MW:459.5107")
   MC(<45,?4,-3=?6,-4=dl,2:N,8:S,
     3^45:/*H,1://O^15,5:/*COOH,
     4:*\^15,NH,!,//O,!2,?5,{-1,-3}=dl,-4:S,
@@ -144,7 +146,7 @@
     6:\,!,S,!,?5,{-3,-5}=dl,-1:S,-2:/_,{-3,-4}:N)
 endfont
 %***************************************************************************
-beginfont("EN:Cefquinome","MW:627.6903")
+beginfont("EN:Cefquinome","MW:529.6")
   MC(<45,?4,-3=?6,-4=dl,2:N,8:S,
     3^45:/*H,1://O^15,5:/*COOH,
     4:*\^15,NH,!,//O,!,//'(N,!,O,!),!,?5,{-2,-5}=dl,-3:S,-1:N,-2:/NH2,
@@ -222,8 +224,8 @@
 %***************************************************************************
 beginfont("EN:Spiramycin","MW:843.1")
   MC(<-90,|=1,60,60,-60,60,60,-60,60,60,-60,60,60,60,-60,60,-60,1:#,=|,
-    {12,14}=dl,2:O,1:/*_,5:/*OH,3://O,10:/*_,6:/*O!>vt,
-    -6:\*,O,!~wb,?6`.7,-5:O,-3:/*N!_,-4:*/_,
+    {12,14}=dl,2:O,{1,10^-30}:/*_,5:/*OH,3://O,6:/*O!>vt,
+    -6:\*^-30,O,!~wb,?6`.7,-5:O,-3:/*N!_,-4:*/_,
     7:\*,O,0~wb,?6`.7,-5:O,-2:*/N!_,-1:/*OH,-4:*/_,
       -3:\*`1,O,60~wb`1.5,?6`.7,-5:O,{-2^35,-3}:*/OH,{-2^-35,-4}:/*_,
     8:\*,!,!!,O)

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	2020-12-12 00:47:53 UTC (rev 57115)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_man_soc.mf	2020-12-12 22:12:12 UTC (rev 57116)
@@ -1,7 +1,8 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Molecular Coding Format file for mcf_manual.tex  by Akira.Yamaji 2020.11.03
+% Molecular Coding Format file for mcf_manual.tex  by Akira.Yamaji 2020.12.12
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-input mcf2graph.mf;   %% it must be version 4.53 or later
+input mcf2graph.mf;   %% it must be version 4.54 or later
+message "mcf_man_soc 2020.12.12"; message "";
 %------------------------------------------------------------------------
 sw_mframe:=0;
 sw_expand:=0;

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	2020-12-12 00:47:53 UTC (rev 57115)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_manual.tex	2020-12-12 22:12:12 UTC (rev 57116)
@@ -1,5 +1,5 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%  Molecular Coding Format manual                by  Akira Yamaji 2020.11.03
+%  Molecular Coding Format manual                by  Akira Yamaji 2020.12.12
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \documentclass[a4paper]{article}
 %%%%\documentclass[a4paper,twoside]{article}
@@ -593,10 +593,9 @@
 %-----------------------------------------------------------------------------
 \subsubsection{Multi rotate angle}
 \begin{verbatim}
-  >'(90,-90,...) :rotate 90,-90,...
+  >'(90,-90,...) : rotate 90,-90,...
 
-  <30,!6,
-  6>'(90,-90,90,-90,90):/!5
+  <30,!6,6>'(90,-90,90,-90,90):/!5
 \end{verbatim}
 \MCFgraph
 %-----------------------------------------------------------------------------
@@ -1549,7 +1548,7 @@
 \begin{verbatim}
 ------------------------------------------------------------------
  Molecular name = Nicotine
- Warnings =   0 / Expanded command = 40
+ Warnings =   0 / Command count= 40
  Width * Height =   49.57332 *   41.37605
  Shift width * height  =          0 *   -9.07253
  Bond length = 12.75589   Atom size   = 5.38914

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

Modified: trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_mplib_exa.tex
===================================================================
--- trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_mplib_exa.tex	2020-12-12 00:47:53 UTC (rev 57115)
+++ trunk/Master/texmf-dist/doc/metapost/mcf2graph/mcf_mplib_exa.tex	2020-12-12 22:12:12 UTC (rev 57116)
@@ -1,7 +1,7 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Example of  MCF typest with LuaLaTeX(luamplib)     by A.Yamaji    2020.11.03
+% Example of  MCF typest with LuaLaTeX(luamplib)     by A.Yamaji    2020.12.12
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% mcf2graph.mf it must be version 4.53 or later
+%%% mcf2graph.mf it must be version 4.54 or later
 \documentclass{article}
 %------------------------------------------------------------------------------
 \usepackage{luamplib}%

Modified: trunk/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf
===================================================================
--- trunk/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf	2020-12-12 00:47:53 UTC (rev 57115)
+++ trunk/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf	2020-12-12 22:12:12 UTC (rev 57116)
@@ -1,5 +1,5 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% mcf2graph ver 4.53     Copyright (c) 2013-2020   Akira Yamaji
+% mcf2graph ver 4.54     Copyright (c) 2013-2020   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,
@@ -38,20 +38,25 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 tracingstats:=1;
 message "---------------------------------------------";
-message "This is mcf2graph ver 4.53  2020.11";
+message "This is mcf2graph ver 4.54  2020.12";
 message "---------------------------------------------";
 %-------------------------------------------------------------------------------------------------
-newinternal com,par,nA,nB,nC,nD,nE,nF,nP;
+newinternal cntA,cntB,cntM,minX,minY,sftX,sftY,com,par,nA,nB,nC,nD,nE,nF,nN,nP,nU,nP,nL,nR,nS,nW,
+            xpos,ypos;
 numeric save_num[],comD[][],parD[][],adrD[][],cntD[],tbl_atom[],tbl_group[][],f_char[],
         tbl_atom_wt[],tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[],andA[],and_rot[],chargeA[],
-        com_group[][],par_group[][],cnt_group[],colorA[],colorB[];
-string  save_str[],tbl_atom_str[],strD[],tag[],mpc_name[],out_file_name,out_file_aux,
-        out_file_rep,out_file_mpc,aux_delimiter,atomfont,save_atomfont,save_defaultfont;
-pair    save_pair[],msize,mposition,fsize,fmargin,save_mposition,posBs,posBe;
-picture mol_stru[],save_picture,temp_picture;
+        com_group[][],par_group[][],cnt_group[],colorA[],colorB[],sumA[],bondC[],hideH[],
+        lineB[],sB[],eB[],angB[],angA[],lenB[],angX[],numS[],wdM[],htM[],wdA[],dxA[];
+string  info[],save_str[],tbl_atom_str[],strD[],tag[],mpc_name[],out_file_name,out_file_aux,
+        out_file_rep,out_file_mpc,aux_delimiter,atomfont,save_atomfont,save_defaultfont,temp_c,
+        s_tag,s_var,cal_FM,cal_MW,cal_MW_str,cal_MI,cal_MI_str,
+        inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW;
+pair    save_pair[],posA[],posM[][],msize,mposition,fsize,fmargin,save_mposition,posBs,posBe,
+        temp_p;
+picture mol_stru[],atom_picture,save_picture,temp_picture;
 path    arrow_path,dottedline_path,line_path,arrow_head;
 %-------------------------------------------------------------------------------------------------
-char_num:=str_cnt:=proc_end:=mangle:=sw_label_emu:=sw_calc:=sw_ext_all:=0;
+char_num:=str_cnt:=tbl_cnt:=proc_end:=mangle:=sw_label_emu:=sw_calc:=sw_ext_all:=0;
 sw_numberA:=sw_numberB:=sw_aux_out:=sw_expand:=sw_fframe:=sw_mframe:=sw_aframe:=sw_trimming:=0;
 sw_rep_out:=sw_mol_out:=sw_group_off:=sw_single:=sw_arrow:=0;
 numberA_start:=numberB_start:=1; numberA_end:=numberB_end:=4095;
@@ -181,12 +186,13 @@
 ext_defaultline:=0.5bp;
 lonepairdiam:=lonepairspace:=circlediam:=circlepen:=0;
 %==================================================================================================
-parts_emb_start:=500;      % 500  => 2499   for embedded parts (max 2000)
-parts_usr_start:=2500;     % 2500 => 2999   for user     parts (max 500)
-parts_int_start:=3000;     % 3000 => 4000   for internal parts (max 1000)
+parts_emb_start:=1000;     % 1001 => 2000   for embedded parts (max 1900)
+parts_emi_start:=1900;     % 1901 => 2000   for embedded internal parts (max 100)
+parts_usr_start:=2000;     % 2001 => 3000   for user     parts (max 1000)
+parts_int_start:=3000;     % 3001 => 4000   for internal parts (max 1000)
 %--------------------------------------------------------------------------------------------------
 def def_com(expr n)(text tx)= nA:=n; forsuffixes list=tx:: list:=nA; nA:=nA+1; endfor enddef;
-def_com(-4090)(_com,_jp_atom,_jp_absA,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_dl,_tmp_line,
+def_com(-4090)(_com,_jp_atom,_jp_absA,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_tmp_line,
   _chg_len,_get_len,_ring_len,_tmp_len,_rot_ang,_adj_ang,_chg_env,_tmp_env,_set_colorA,_set_colorB,
   _group_si,_set_adr,_mk_bond,_set_atom,_arg_ang,_chg_atom,_tmp_rot,_fuse,_size_atom,_numeric,
   _jump_at,_connect_at,_set_and,_chg_charge,_nop,_mark,_moff,_term,_len_s,_len_e,_len_ss,_len_ee,
@@ -207,8 +213,11 @@
 %--------------------------------------------------------------------------------------------------
 def ]]]=] ] ] enddef;
 vardef iif(expr a,b,c)=if a: b else: c fi enddef;
-vardef pic_c(expr i,s)= substring(i,i+1) of s enddef;
-vardef sfB(expr a,b,c)= a shifted ((b,0) rotated c) enddef;
+vardef subc(expr i,s)= substring(i,i+1) of s enddef;
+vardef sfrt(expr a,b,c)= a shifted ((b,0) rotated c) enddef;
+def wpcs expr n= withpen pencircle scaled n enddef;
+def ppcs expr n= pickup pencircle scaled n enddef;
+def sbp(expr m,n)expr p=subpath(m*length(p),n*length(p)) of p enddef;
 %--------------------------------------------------------------------------------------------------
 def init_par(text t)=
   nA:=nB:=nC:=0;
@@ -242,14 +251,7 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def beginfont(text s)=
   begingroup
-  save cntA,cntB,cntM,minX,minY,f_beginchar,numS,sftX,sftY,f_ext,blen,ext,add,
-       cal_FM,cal_MW,cal_MW_str,cal_MI,cal_MI_str,wdM,htM,
-       inf_NO,inf_EN,inf_JN,inf_MW,inf_MI,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,
-       posA,posM,lineB,sB,eB,angB,angA,wdA,dxA,lenB,ang_br,info;
-  numeric lineB[],sB[],eB[],angB[],angA[],lenB[],angX[],numS[],wdM[],htM[],wdA[],dxA[];
-  pair posA[],posM[][];
-  string info[],sumA,s_tag,s_var,cal_FM,cal_MW,cal_MW_str,cal_MI,cal_MI_str,
-         inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW;
+  save f_beginchar,f_ext,blen,ext,add,ang_br;
   %------------------------------------------------------------------------------------------------
   def ext=ext_to_font enddef;
   def add=add_to_molecule enddef;
@@ -257,6 +259,9 @@
   inf_NO:=inf_EN:=inf_JN:=inf_MW:=inf_FM:=inf_CAS:=inf_USE:=inf_EXA:=inf_EXB:="-";
   cal_MW:=cal_MW_str:=cal_MI:=cal_MI_str:=cal_FM:="";
   %------------------------------------------------------------------------------------------------
+  parts_cnt:=parts_usr_start;
+  parts_int:=parts_int_start;
+  %------------------------------------------------------------------------------------------------
   char_num:=char_num+1;
   store_par(parameter_list);
   for i:=1 upto max_inf_num: info[i]:=":"; endfor
@@ -264,7 +269,7 @@
   for list=s: inf_num:=inf_num+1; info[inf_num]:=list; endfor
   %------------------------------------------------------------------------------------------------
   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
+    nA:=0; for i=0 upto length(info[j]): if subc(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];
@@ -310,11 +315,15 @@
   restore_par(parameter_list);
   endgroup;
   if proc_end=1: scantokens("bye"); fi
+  %-----------------------------------------------------------------------------------------------
+%%  message "parts_cnt (0)="& decimal(parts_cnt) &" "& decimal(parts_usr-parts_usr_start);
+%%  message "parts_int (0)="& decimal(parts_int) &" "& decimal(parts_int-parts_int_start);
+  %-----------------------------------------------------------------------------------------------
 enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def set_def_MC=
   save /,//,/*,*/,**,*/*,~,^,',`,``,<,>,&,:,=,\,\\,*\,\*,*\*,@,#,@#,$,
-       {,},|,||,|||,|=,=|,|<,>|,|:,:|,_,d,w,z,inside_def_MC;
+       {,},|,||,|||,|=,=|,|<,>|,|<<,>>|,:|,_,d,w,z,CP,CPe,CPx,inside_def_MC;
   inside_def_MC:=1;
   _:=Me; d:=db; w:=wf; z:=zf;
   tertiarydef a=b == if (known a)and(known b):: change_bond(a,b) else:: _nop fi enddef; 
@@ -332,18 +341,22 @@
   def \  ==  @,0 enddef;           def \\ ==  \~dm enddef;
   def *\ ==  \~wf enddef;          def \* ==  \~zf enddef;        def *\* == \~wv enddef;
   def |  == (_com,_mark) enddef;   def || == (_com,_moff) enddef; def ||| == (_com,_term) enddef;
-  def |< == (_com,_len_s) enddef; def >| == (_com,_len_e) enddef;
-  def |: == (_com,_len_ss) enddef; def :| == (_com,_len_ee) enddef;
+  def |< == (_com,_len_s) enddef;  def >| == (_com,_len_e) enddef;
+  def |<< == (_com,_len_ss) enddef; def >>| == (_com,_len_ee) enddef;
   def |=primary n == |<,(_chg_len,n) enddef;    def =| == >| enddef;
+  def :| == (_com,_rest) enddef;
   def /secondary n  == if known n:: (_group_si,n) else:: _nop fi enddef;
   def //secondary n == /n~dm enddef;  def */secondary n  == /n~wf enddef;
   def /*secondary n == /n~zf enddef;  def */*secondary n == /n~wv enddef;
   def **secondary n == /n~nb enddef;
-  vardef '(text TXT)== read_mcf(incr parts_usr)(|,TXT,(_com,_rest)); parts_usr enddef;
+  vardef '(text TXT)== read_mcf(incr parts_cnt)(|,``crR,TXT,:|); parts_cnt enddef;
+  def CP  == com_par enddef;
+  def CPe == com_par_ex(0) enddef;
+  def CPx == com_par_ex(1) enddef;
 enddef;
+%-------------------------------------------------------------------------------------------------
+vardef '(text TXT)= parts_cnt:=parts_cnt+1; read_mcf(parts_cnt)(TXT); parts_cnt enddef;
 %=================================================================================================
-vardef '(text TXT)= read_mcf(incr parts_usr)(TXT); parts_usr enddef;
-%-------------------------------------------------------------------------------------------------
 def read_mcf(expr n)(text TXT)=
   begingroup
   save list_cnt,nCP;
@@ -354,7 +367,7 @@
       list_cnt:=list_cnt+1;
       if pair list:: nCP:=nCP+1; comD[n][nCP]:=xpart(list); parD[n][nCP]:=ypart(list);
       elseif numeric list::
-        if     list==_nop:: message "unknown command in "AND decimal(list_cnt);
+        if     list==_nop:: message "unknown command in "AND decimal(n);
         elseif list>=parts_emb_start::
           for i==1 upto cntD[list]::
             nCP:=nCP+1; comD[n][nCP]:=comD[list][i]; parD[n][nCP]:=parD[list][i];
@@ -365,7 +378,7 @@
         str_cnt:=str_cnt+1; strD[str_cnt]:=list;
         nCP:=nCP+1; comD[n][nCP]:=_set_atom; parD[n][nCP]:=str_cnt;
       fi
-    else:: message "unknown command in "AND decimal(list_cnt);
+    else:: message "unknown command in "AND decimal(n);
     fi
   endfor
   cntD[n]:=nCP;
@@ -373,7 +386,6 @@
 enddef;
 %-------------------------------------------------------------------------------------------------
 vardef read_number(text TXT)=
-  save nN;
   parts_int:=parts_int+1;
   nN:=0;
   for list==TXT::
@@ -428,8 +440,10 @@
       if a>=parts_int_start:: for i==1 upto cntD[a]:: fuse_ring(parD[a][i],b-?3+3) endfor
       else::                fuse_ring(a,b-?3+3)
       fi
-    elseif b==Ph1:: fuse_ring(a,6) CP(_dl,-2) CP(_dl,-4)
-    elseif b==Ph2:: fuse_ring(a,6) CP(_dl,-1) CP(_dl,-3) CP(_dl,-5)
+    elseif b==Ph1:: fuse_ring(a,6) CP(_set_adr,-2) CP(_set_line,dl)
+                                   CP(_set_adr,-4) CP(_set_line,dl)
+    elseif b==Ph2:: fuse_ring(a,6) CP(_set_adr,-1) CP(_set_line,dl)
+                      CP(_set_adr,-3) CP(_set_line,dl) CP(_set_adr,-5) CP(_set_line,dl)
     elseif b==_jump_at::    CP(_jp_bond,a)
     elseif b==_connect_at:: CP(_cyc_sB,a)
     elseif comD[b][1]==_fuse::
@@ -470,7 +484,7 @@
 def com_par(expr a,b)= nCP:=nCP+1; comD[parts_int][nCP]:=a; parD[parts_int][nCP]:=b; enddef;
 %-------------------------------------------------------------------------------------------------
 def com_par_ex(expr f)(expr c)(expr a,b)=
-  if c>=parts_int_start::
+  if c>=parts_emb_start::
     for i==1 upto cntD[c]::
       if comD[c][i]==_numeric:: com_par(_set_adr,parD[c][i]) com_par(a,b)
       ef f==1::                 com_par(comD[c][i],parD[c][i]) fi
@@ -480,36 +494,30 @@
 enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def puts(expr POS)(expr STR)=
-  begingroup
-  save pA,sA,bA;
-  pair pA;
-  string sA;
-  picture bA;
-  pA:=POS;
+  temp_p:=POS;
   nB:=defaultscale*defaultsize;
   nC:=0;
   %------------------------------------------------------------------------------------------------
   for i=0 upto length(STR)-1:
-    sA:=pic_c(i,STR);
-    if sw_label_emu=1:
-      if     sA="_": nC:=iif(nC=-0.5,0,-0.5);
-      elseif sA="^": nC:=iif(nC= 0.5,0, 0.5);
+    temp_c:=subc(i,STR);
+      if sw_label_emu=1:
+      if     temp_c="_": nC:=iif(nC=-0.5,0,-0.5);
+      elseif temp_c="^": nC:=iif(nC= 0.5,0, 0.5);
       else:
         if defaultfont="draw":
-          draw_char(sA,pA+(0,nB*nC),nB,ratio_thickness_char*defaultscale*defaultsize,0);
-          pA:=pA+(nB*tbl_char_wd[ASCII(sA)],0);
+          draw_char(temp_c,temp_p+(0,nB*nC),nB,ratio_thickness_char*defaultscale*defaultsize,0);
+          temp_p:=temp_p+(nB*tbl_char_wd[ASCII(temp_c)],0);
         else:
-          bA:=sA infont defaultfont scaled defaultscale;
-          addto currentpicture also bA shifted (pA+(0,nB*nC));
-          pA:=pA+(lrcorner bA-llcorner bA);
+          temp_picture:=temp_c infont defaultfont scaled defaultscale;
+          addto currentpicture also temp_picture shifted (temp_p+(0,nB*nC));
+          temp_p:=temp_p+(lrcorner temp_picture-llcorner temp_picture);
         fi
       fi
     else:
-      draw_char(sA,pA,nB,ratio_thickness_char*defaultscale*defaultsize,0);
-      pA:=pA+(nB*tbl_char_wd[ASCII(sA)],0);
+      draw_char(temp_c,temp_p,nB,ratio_thickness_char*defaultscale*defaultsize,0);
+      temp_p:=temp_p+(nB*tbl_char_wd[ASCII(temp_c)],0);
     fi
   endfor
-  endgroup;
 enddef;
 %==================================================================================================
 def ext_setup=
@@ -600,8 +608,7 @@
 enddef;
 %--------------------------------------------------------------------------------------------------
 vardef scan_picture(expr PIC,SD)=
-  save save_pic,nA,nB,nC,nD,nE,nS,iw,erase_h,erase_v;
-  picture save_pic;
+  save iw,erase_h,erase_v;
   path erase_h,erase_v;
   nD:=0.2bp;
   if     (SD=1)or(SD=3): nS:=-max_labelsize; nE:=max_labelsize;  nB:=nD;  nC:=-nD;
@@ -612,7 +619,7 @@
   elseif (SD=3)or(SD=4):
     erase_v:=unitsquare xscaled nD yscaled 2max_labelsize shifted (nC,-max_labelsize);
   fi
-  save_pic:=currentpicture;
+  temp_picture:=currentpicture;
   currentpicture:=PIC;
   erase fill unitsquare scaled nD shifted (-max_labelsize,-max_labelsize);
   iw:=totalweight currentpicture;
@@ -627,7 +634,7 @@
   else:
     nA:=0;
   fi
-  currentpicture:=save_pic;
+  currentpicture:=temp_picture;
   nA
 enddef;
 %--------------------------------------------------------------------------------------------------
@@ -638,41 +645,34 @@
 %--------------------------------------------------------------------------------------------------
 vardef circled_plus_add=
   nA:=circlediam; nB:=circlepen;
-  image(draw fullcircle scaled nA withpen pencircle scaled nB;
-        draw (-.5nA,0)--(.5nA,0) withpen pencircle scaled nB;
-        draw (0,-.5nA)--(0,.5nA) withpen pencircle scaled nB;
-       )
+  image(draw fullcircle scaled nA wpcs nB;
+        draw (-.5nA,0)--(.5nA,0) wpcs nB; draw (0,-.5nA)--(0,.5nA) wpcs nB;)
 enddef;
 %--------------------------------------------------------------------
 vardef circled_minus_add=
   nA:=circlediam; nB:=circlepen;
-  image(draw fullcircle scaled nA withpen pencircle scaled nB;
-        draw (-.5nA,0)--(.5nA,0) withpen pencircle scaled nB;
-       )
+  image(draw fullcircle scaled nA wpcs nB; draw (-.5nA,0)--(.5nA,0) wpcs nB;)
 enddef;
 %--------------------------------------------------------------------
 vardef lone_pair_add expr ANG=
-  nA:=lonepairdiam; nB:=lonepairspace;
-  image(draw (0,0) withpen pencircle scaled nA;
-        draw ((0,nB) rotated ANG) withpen pencircle scaled nA;)
+  image(draw (0,0) wpcs lonepairdiam; draw ((0,lonepairspace) rotated ANG) wpcs lonepairdiam;)
 enddef;
 %--------------------------------------------------------------------------------------------------
 vardef label_emu@#(expr OBJ,POS) = %% modified 'thelabel@#(expr s,z)' of plain.mp
-  save oft,fx,fy,wds,sC,bA,pA,pB,pC,pD;
+  save oft,fx,fy,wds,sC,pA,pB,pC,pD;
   pair oft,oft.lft,oft.rt,oft.top,oft.bot,oft.ulft,oft.llft,oft.urt,oft.lrt,pA,pB,pC,pD;
   string sC;
-  picture bA;
   wds:=0;
   %---------------------------------------------------------------
   if string OBJ:
     for i=0 upto length(OBJ)-1:
-      sC:=pic_c(i,OBJ);
+      sC:=subc(i,OBJ);
       if not((sw_label_emu=1)and((sC="_")or(sC="^"))):
         if (defaultfont="draw")or(f_MP=0):
           wds:=wds+defaultscale*defaultsize*tbl_char_wd[ASCII(sC)];
         else:
-          bA:=sC infont defaultfont scaled defaultscale;
-          wds:=wds+xpart(lrcorner bA-llcorner bA);
+          temp_picture:=sC infont defaultfont scaled defaultscale;
+          wds:=wds+xpart(lrcorner temp_picture-llcorner temp_picture);
         fi
       fi
     endfor
@@ -699,9 +699,7 @@
   fi
 enddef;
 %-------------------------------------------------------------------------------------------------
-vardef dotlabel_emu@#(expr OBJ,POS)=
-  label_emu@#(OBJ,POS); draw POS withpen pencircle scaled dotlabeldiam;
-enddef;
+vardef dotlabel_emu@#(expr OBJ,POS)= label_emu@#(OBJ,POS); draw POS wpcs dotlabeldiam; enddef;
 %==================================================================================================
 def drawarrow_emu expr PATH = arrow_path:=PATH; draw_arrow enddef;
 %-------------------------------------------------------------------------------------------------
@@ -736,10 +734,7 @@
 enddef;
 %=================================================================================================
 def MCat(expr FW,FH)(text TXT)=
-  save_mposition:=mposition;
-  mposition:=(FW,FH);
-  MC(TXT)
-  mposition:=save_mposition;
+  save_mposition:=mposition; mposition:=(FW,FH); MC(TXT) mposition:=save_mposition;
 enddef;
 %-------------------------------------------------------------------------------------------------
 def MC(text TXT)=
@@ -746,20 +741,13 @@
   begingroup
   save markA,markB,saveA,saveB,f_bra,envT,envB,lenT,lineT,strAT,cnt_group,bondL,temp_lenE,
        temp_lenF,temp_cntB,f_end,f_term,rotT,f_at,f_lineT,f_rotT,f_lenT,f_envT,angT,
-       maxX,maxY,sA,sC,sD,pA,pB,factor,m_wd,m_ht,crR,CP,CPe,CPx,defaultsize,defaultscale;
+       maxX,maxY,sA,sC,factor,m_wd,m_ht,crR,defaultsize,defaultscale;
   %-----------------------------------------------------------------------------------------------
-  def CP=  com_par enddef;
-  def CPe= com_par_ex(0) enddef;
-  def CPx= com_par_ex(1) enddef;
+  string sA,sC;
   %-----------------------------------------------------------------------------------------------
-  string sA,sC,sD;
-  pair pA,pB;
-  %-----------------------------------------------------------------------------------------------
   if (sw_numberA>=1)or(sw_numberB>=1): ratio_atom_bond:=0.25; fi
   if (sw_expand=1)or(sw_mol_out>=1): expand_set; fi
-  parts_usr:=parts_usr_start;
-  parts_int:=parts_int_start;
-  cntA:=cntB:=cnt_group:=cntC:=0; strD[0]:=""; str_cnt:=2000; crR:=-ratio_chain_ring;
+  cntA:=cntB:=cnt_group:=cntC:=0; strD[0]:="C"; str_cnt:=2000; crR:=-ratio_chain_ring;
   %-----------------------------------------------------------------------------------------------
   font_wd:=xpart(fsize);
   font_ht:=ypart(fsize);
@@ -806,8 +794,8 @@
       if numS[i]=0: nB:=.5atom_wd;
       else:         nB:=.85atom_wd+iif(nC<45,sind(nC),cosd(nC))*.5atom_wd;
       fi
-      pA:=sfB(posA[i]-(.35atom_wd,.35atom_wd),nB,nA);
-      draw_char(sA,pA,atom_wd,bond_pen_wd*ratio_char_bond,0);
+      temp_p:=sfrt(posA[i]-(.35atom_wd,.35atom_wd),nB,nA);
+      draw_char(sA,temp_p,atom_wd,bond_pen_wd*ratio_char_bond,0);
     else: sA:="";
     fi
     nA:=length(strD[numS[i]]); sC:=substring(nA-3,nA-2) of strD[numS[i]];
@@ -865,16 +853,13 @@
   clearit;
   endgroup;
   if ((sw_aux_out>=1)or(sw_rep_out=1)or(sw_mol_out>=1)or(sw_calc=1))and(f_MP=1): proc_calc; fi
-  %-----------------------------------------------------------------------------------------------
-%%%  message "parts_usr ="& decimal(parts_usr) &" "& decimal(parts_usr-parts_usr_start);
-%%%  message "parts_int ="& decimal(parts_int) &" "& decimal(parts_int-parts_int_start);
-  %-----------------------------------------------------------------------------------------------
 enddef;
 %-------------------------------------------------------------------------------------------------
 def add_group=
   if f_at=1: nE:=getA(adrT); check_adrA(nE); else: nE:=cntA+1; fi
   cnt_group:=cnt_group+1; cnt_group[cnt_group]:=0;
-  store_group(_jp_absA,nE) store_group(_com,_len_s)
+  store_group(_jp_absA,nE)
+  store_group(_com,_len_s)
   if lineT<>nb: store_group(_tmp_line,lineT) fi
   if rotT<>0:   store_group(_rot_ang,rotT) fi
   if lenT<>crR: store_group(_chg_len,lenT) fi
@@ -882,7 +867,9 @@
   if lineT=nl:  store_group(_chg_len,_size_atom) store_group(_adj_ang,0) fi
   if lineT<>nb: store_group(_mk_bond,0) fi
   for i=1 upto cntD[par]: store_group(comD[par][i],parD[par][i]) endfor 
-  store_group(_com,_len_e) store_group(_chg_env,hz) store_group(_com,_term)
+  store_group(_com,_len_e)
+  store_group(_chg_env,hz)
+  store_group(_com,_term)
   if f_lineT=0: lineT:=si; fi
   if f_lenT=0:  lenT:=crR; fi 
   if f_rotT=0:  rotT:=0;   fi
@@ -911,10 +898,8 @@
 enddef;
 %-------------------------------------------------------------------------------------------------
 def draw_corner(expr PS,LX,LY,PN)=
-  draw( 0, 0) shifted PS withpen pencircle scaled PN;
-  draw(LX, 0) shifted PS withpen pencircle scaled PN;
-  draw(LX,LY) shifted PS withpen pencircle scaled PN;
-  draw( 0,LY) shifted PS withpen pencircle scaled PN;
+  draw( 0, 0) shifted PS wpcs PN; draw(LX, 0) shifted PS wpcs PN;
+  draw(LX,LY) shifted PS wpcs PN; draw( 0,LY) shifted PS wpcs PN;
 enddef;
 %-------------------------------------------------------------------------------------------------
 def proc_size_setup=
@@ -928,8 +913,6 @@
 enddef;
 %-------------------------------------------------------------------------------------------------
 def proc_scaling=
-  begingroup
-  save nU,nD,nP,nL,nR,xpos,ypos;
   minX:=minY:=4095;
   maxX:=maxY:=-4095;
   for i=1 upto cntA:
@@ -938,7 +921,7 @@
     if numS[i]<>0:
       nU:=nD:=nP:=nL:=nR:=0;
       for j=0 upto length(strD[numS[i]])-1:
-        sA:=pic_c(j,strD[numS[i]]);
+        sA:=subc(j,strD[numS[i]]);
         if     (sA="^"): nU:=.5atom_wd;
         elseif (sA="_"): nD:=.5atom_wd;
         elseif (sA<>"{")and(sA<>"}"): nP:=nP+atom_wd*tbl_char_wd[ASCII(sA)];
@@ -954,7 +937,6 @@
     fi
   endfor
   mol_wd:=maxX-minX; mol_ht:=maxY-minY;
-  endgroup
 enddef;
 %-------------------------------------------------------------------------------------------------
 def char_use_check=
@@ -964,7 +946,7 @@
   else:
     for i=1 upto cntA:
       if numS[i]<>0:
-        for j=0 upto length(strD[numS[i]])-1: f_char[ASCII(pic_c(j,strD[numS[i]]))]:=1; endfor
+        for j=0 upto length(strD[numS[i]])-1: f_char[ASCII(subc(j,strD[numS[i]]))]:=1; endfor
       fi
     endfor
   fi
@@ -978,7 +960,7 @@
   for i=n upto cntD[a]: com:=comD[a][i]; par:=parD[a][i];
   if com=_mk_bond: if (par=0)and(rotT<>0): rotT:=0; fi  add_atom;
   ef com=_set_adr: adrT:=par;
-  ef com=_com: if par=_mark: saveA:=markA; saveB:=markB; markA:=cntA; markB:=saveB:=cntB;
+  ef com=_com: if par=_mark: saveA:=markA; saveB:=markB; markA:=cntA; markB:=cntB;
                ef par=_rest: markA:=saveA; markB:=saveB;
                ef par=_moff: markA:=markB:=0;
                ef par=_term: termA;
@@ -985,9 +967,9 @@
                ef par=_len_s:  temp_lenE:=bondL; ef par=_len_e:  bondL:=temp_lenE;
                ef par=_len_ss: temp_lenF:=bondL; ef par=_len_ee: bondL:=temp_lenF;
                ef par=_group_s: f_at:=1; if lineT<>si: f_lineT:=1; fi if rotT<>0: f_rotT:=1; fi
-                                  if lenT<>crR: f_lenT:=1;  fi if envT<>hz: f_envT:=1; fi
+                                if lenT<>crR: f_lenT:=1;  fi if envT<>hz: f_envT:=1; fi
                ef par=_group_e: f_at:=0; f_lineT:=f_rotT:=f_lenT:=f_envT:=rotT:=envT:=0;
-                                  lineT:=si; lenT:=crR;
+                                lineT:=si; lenT:=crR;
                fi
   ef com=_set_atom: strAT:=par;
   ef com=_group_si: add_group;
@@ -998,10 +980,9 @@
   ef com=_chg_len:  if par=_ring_len: bondL:=ringL; else: bondL:=par; fi
   ef com=_get_len:  if par=_tmp_len:  if bondL=crR: bondL:=lenT; fi
                     ef par=_ring_len: if lenT<>crR: bondL:=lenT; else: if bondL<0: bondL:=1; fi fi
-                    else:     ringL:=lenB[getB(par)]; fi
+                    else: ringL:=lenB[getB(par)]; fi
   ef com=_tmp_len:  lenT:=par;
   ef com=_set_line: lineB[getB(adrT)]:=par;
-  ef com=_dl:       lineB[getB(par)]:=dl;
   ef com=_tmp_line: lineT:=par;
   ef com=_tmp_rot:  rotT:=par;
   ef com=_cyc:      f_end:=getA(par); check_adrA(f_end); add_atom;
@@ -1040,7 +1021,8 @@
   %-----------------------------------------------------------------------------------------------
   for i=1 upto cntD[a]: com:=comD[a][i]; par:=parD[a][i];
   if com=_mk_bond: if (par=0)and(rotT<>0):par:=rotT; rotT:=0; fi add_bond(par);
-  ef com=_com: if par=_mark: markA:=cntA; markB:=cntB;
+  ef com=_com: if par=_mark: saveA:=markA; saveB:=markB; markA:=cntA; markB:=cntB;
+               ef par=_rest: markA:=saveA; markB:=saveB;
                ef par=_moff: markA:=markB:=0; ef par=_term: termB;
                ef par=_group_e: lineT:=si; lenT:=crR; rotT:=envT:=0; fi
   ef com=_jp_bond: termB; nA:=getB(par); posBs:=posA[sB[nA]]; angT:=angB[nA]; f_bra:=1; rotT:=0;
@@ -1064,11 +1046,10 @@
 %-------------------------------------------------------------------------------------------------
 def add_bond(expr ROT)=
   if ROT=_arg_ang:
-    if cntB=0:
-      angT:=(angT-180) mod 360; nA:=180;
+    if cntB=0: angT:=(angT-180) mod 360; nA:=180;
     else:
       nB:=(angT mod 360);
-      if envB>=parts_emb_start: nA:=parD[envB][cntB-temp_cntB];
+      if envB>=parts_emb_start: nA:=parD[envB][cntB-temp_cntB+2];
       else:
         if envB=hz:
           if nB=0:nA:= 60;ef nB<=90:nA:=-60;ef nB<=180:nA:= 60;ef nB<270:nA:=-60;else:nA:= 60; fi
@@ -1087,11 +1068,11 @@
   fi
   angB[cntB+1]:=angT:=(angT+nA) mod 360;
   if f_end=0:
-    if lenB[cntB+1]=_size_atom: posBe:=sfB(posBs,atom_wd,angT);
+    if lenB[cntB+1]=_size_atom: posBe:=sfrt(posBs,atom_wd,angT);
     else:
       nA:=lenB[cntB+1];
       if nA<0: nB:=glu_atom(adrT)+glu_atom(cntA+1); nA:=abs(nA); else: nB:=0; fi
-      posBe:=sfB(posBs,nA*blen+nB,angT);
+      posBe:=sfrt(posBs,nA*blen+nB,angT);
     fi
     posA[cntA+1]:=posBe; f_term:=0;
   else:
@@ -1127,59 +1108,58 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def draw_atom(expr NUM)=
   begingroup
-  save slen,f_wd,f_ht,r_ff,pA,pB,bA,sA,sB,dx;
-  string sA,sB;
-  pair pA,pB;
-  picture bA;
-  %----------------------------------------------------------------------------------------------
-  sA:=strD[numS[NUM]]; slen:=length(sA)-1;
-  nA:=angX[NUM];
-  dxA[NUM]:=dx:=iif((nA<=90)or(nA>=270),1,-1);
-  wdA[NUM]:=nC:=0; pB:=(0,0);
-  pA:=posA[NUM]-(.5atom_wd*dx,.5atom_wd);
-  if (atomfont<>"draw")and(f_MP=1):
-    bA:="C" infont atomfont;
-    r_ff:=atom_wd/(ypart(ulcorner bA)-ypart(llcorner bA));
-  fi
-  for i=0 upto slen:
-    if nC=0:
-      sB:=pic_c(i,sA);
-      if (dx=-1)and(sB="{"):
-        nD:=i+1; nC:=0; for j=nD upto slen: nC:=nC+1; exitif pic_c(j,sA)="}"; endfor
-      fi
-    else: nC:=nC-1; sB:=pic_c(nD+nC,sA);
+  if numS[NUM]<>0:
+    save slen,f_wd,f_ht,r_ff,pA,pB,sA,sB,dx;
+    string sA,sB;
+    pair pA,pB;
+    %-------------------------------------------------------
+    sA:=strD[numS[NUM]]; slen:=length(sA)-1; nA:=angX[NUM];
+    dxA[NUM]:=dx:=iif((nA<=90)or(nA>=270),1,-1);
+    wdA[NUM]:=nC:=0; pB:=(0,0);
+    pA:=posA[NUM]-(.5atom_wd*dx,.5atom_wd);
+    if (atomfont<>"draw")and(f_MP=1):
+      atom_picture:="C" infont atomfont;
+      r_ff:=atom_wd/(ypart(ulcorner atom_picture)-ypart(llcorner atom_picture));
     fi
-    if     sB="_": pB:=iif(pB=(0,0),(0,-.5atom_wd),(0,0));
-    elseif sB="^": pB:=iif(pB=(0,0),(0, .5atom_wd),(0,0));
-    elseif (sB<>"{")and(sB<>"}"):
-      if (atomfont<>"draw")and(f_MP=1):
-        bA:=sB infont atomfont;
-        f_wd:=(xpart(lrcorner bA)-xpart(llcorner bA))*r_ff;
-        f_ht:=(ypart(urcorner bA)-ypart(llcorner bA))*r_ff;
-        if dx=-1: pA:=pA-(f_wd,0); fi
-        addto currentpicture also bA scaled (r_ff*(1-2ratio_atomgap_atom))
-          shifted (pA+pB+(f_wd*ratio_atomgap_atom,f_ht*ratio_atomgap_atom)) Cp(colorA[NUM]);
-        if sw_aframe=1: draw_frame(pA+pB,f_wd,f_ht,thickness_aframe); fi
-        if dx=1: pA:=pA+(f_wd,0); fi
-      else:
-        f_wd:=atom_wd*tbl_char_wd[ASCII(sB)];
-        if dx=-1: pA:=pA-(f_wd,0); fi
-        draw_char(sB,pA+pB,atom_wd,bond_pen_wd*ratio_char_bond,NUM);
-        if sw_aframe=1: draw_frame(pA+pB,f_wd,atom_wd,thickness_aframe); fi
-        if dx=1: pA:=pA+(f_wd,0); fi
+    for i=0 upto slen:
+      if nC=0:
+        sB:=subc(i,sA);
+        if (dx=-1)and(sB="{"):
+          nD:=i+1; nC:=0; for j=nD upto slen: nC:=nC+1; exitif subc(j,sA)="}"; endfor
+        fi
+      else: nC:=nC-1; sB:=subc(nD+nC,sA);
       fi
-      wdA[NUM]:=wdA[NUM]+f_wd;
-    fi
-  endfor
+      if     sB="_": pB:=iif(pB=(0,0),(0,-.5atom_wd),(0,0));
+      elseif sB="^": pB:=iif(pB=(0,0),(0, .5atom_wd),(0,0));
+      elseif (sB<>"{")and(sB<>"}"):
+        if (atomfont<>"draw")and(f_MP=1):
+          atom_picture:=sB infont atomfont;
+          f_wd:=(xpart(lrcorner atom_picture)-xpart(llcorner atom_picture))*r_ff;
+          f_ht:=(ypart(urcorner atom_picture)-ypart(llcorner atom_picture))*r_ff;
+          if dx=-1: pA:=pA-(f_wd,0); fi
+          addto currentpicture also atom_picture scaled (r_ff*(1-2ratio_atomgap_atom))
+            shifted (pA+pB+(f_wd*ratio_atomgap_atom,f_ht*ratio_atomgap_atom)) Cp(colorA[NUM]);
+          if sw_aframe=1: draw_frame(pA+pB,f_wd,f_ht,thickness_aframe); fi
+          if dx=1: pA:=pA+(f_wd,0); fi
+        else:
+          f_wd:=atom_wd*tbl_char_wd[ASCII(sB)];
+          if dx=-1: pA:=pA-(f_wd,0); fi
+          draw_char(sB,pA+pB,atom_wd,bond_pen_wd*ratio_char_bond,NUM);
+          if sw_aframe=1: draw_frame(pA+pB,f_wd,atom_wd,thickness_aframe); fi
+          if dx=1: pA:=pA+(f_wd,0); fi
+        fi
+        wdA[NUM]:=wdA[NUM]+f_wd;
+      fi
+    endfor
+  fi
   endgroup
 enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def draw_bond(expr NUM)=
   begingroup
-  save ww,ap,am,ang,col,len,Ls,Le,nL,nS,nE,pA,zA,zL,wpcs;
+  save ww,ap,am,ang,col,len,Ls,Le,pA,zA,zL;
   pair pA,Ls,Le;
   path zA,zL;
-  def wpcs expr n= withpen pencircle scaled n enddef;
   %-----------------------------------------------------------------------------------------------
   nL:=lineB[NUM]; ang:=angB[NUM]; nS:=sB[NUM]; nE:=eB[NUM]; col:=colorB[NUM]; 
   zL:=posA[nS]--posA[nE]; ww:=wedge_wd; ap:=ang+90; am:=ang-90;
@@ -1194,32 +1174,32 @@
   %-----------------------------------------------------------------------------------------------
   pickup pencircle scaled bond_pen_wd;
   if (nL=si)or(sw_single=1): draw zA Cp(col);
-  ef nL=dl: draw zA Cp(col); draw sfB(subpath pA of zA,bondgap,ap) Cp(col);
-  ef nL=dr: draw zA Cp(col); draw sfB(subpath pA of zA,bondgap,am) Cp(col);
-  ef nL=dm: draw sfB(zA,bondgap/1.75,ap) Cp(col); draw sfB(zA,bondgap/1.75,am) Cp(col);
+  ef nL=dl: draw zA Cp(col); draw sfrt(subpath pA of zA,bondgap,ap) Cp(col);
+  ef nL=dr: draw zA Cp(col); draw sfrt(subpath pA of zA,bondgap,am) Cp(col);
+  ef nL=dm: draw sfrt(zA,bondgap/1.75,ap) Cp(col); draw sfrt(zA,bondgap/1.75,am) Cp(col);
   ef nL=db: nA:=iif(((ang-angX[nS]) mod 360)<=180,ap,am);
-            draw zA Cp(col); draw sfB(subpath pA of zA,bondgap,nA) Cp(col);
-  ef nL=tm: draw zA Cp(col);draw sfB(zA,bondgap,ap) Cp(col); draw sfB(zA,bondgap,am) Cp(col);
-  ef nL=wf: fill Ls--sfB(Le,ww,am)--sfB(Le,ww,ap)--cycle Cp(col);
-  ef nL=wb: fill sfB(Ls,ww,am)--Le--sfB(Ls,ww,ap)--cycle Cp(col);
+            draw zA Cp(col); draw sfrt(subpath pA of zA,bondgap,nA) Cp(col);
+  ef nL=tm: draw zA Cp(col);draw sfrt(zA,bondgap,ap) Cp(col); draw sfrt(zA,bondgap,am) Cp(col);
+  ef nL=wf: fill Ls--sfrt(Le,ww,am)--sfrt(Le,ww,ap)--cycle Cp(col);
+  ef nL=wb: fill sfrt(Ls,ww,am)--Le--sfrt(Ls,ww,ap)--cycle Cp(col);
   ef nL=bd: draw zA withpen penrazor rotated ap scaled bondgap Cp(col);
-  ef nL=bz: bz_put(sfB(Ls,ww,ap),sfB(Le,ww,ap),sfB(Ls,ww,am),sfB(Le,ww,am));
-  ef nL=zf: wz_put(Ls,sfB(Le,ww,ap),sfB(Le,ww,am));
-  ef nL=zb: wz_put(Le,sfB(Ls,ww,am),sfB(Ls,ww,ap));
+  ef nL=bz: bz_put(sfrt(Ls,ww,ap),sfrt(Le,ww,ap),sfrt(Ls,ww,am),sfrt(Le,ww,am));
+  ef nL=zf: wz_put(Ls,sfrt(Le,ww,ap),sfrt(Le,ww,am));
+  ef nL=zb: wz_put(Le,sfrt(Ls,ww,am),sfrt(Ls,ww,ap));
   ef nL=dt: for i=0 step .75zebra_gap/len until 1: drawdot i[Ls,Le] Cp(col); endfor
   ef nL=wv: nA:=3bond_pen_wd; nB:=len/nA;
             draw Le for i=1 upto nB:
-              ..controls(((i-.5)/nB)[sfB(Le,nA,iif(odd(i),ap,am)),sfB(Ls,nA,iif(odd(i),ap,am))])
+              ..controls(((i-.5)/nB)[sfrt(Le,nA,iif(odd(i),ap,am)),sfrt(Ls,nA,iif(odd(i),ap,am))])
               ..(i/nB)[Le,Ls] endfor ..Ls Cp(col);
-  ef nL=vf: draw zA Cp(col);draw sfB(Le,bondgap,ang-150)--Le--sfB(Le,bondgap,ang+150) Cp(col);
-  ef nL=vb: draw zA Cp(col);draw sfB(Ls,bondgap,ang-30)--Ls--sfB(Ls,bondgap,ang+30) Cp(col);
+  ef nL=vf: draw zA Cp(col);draw sfrt(Le,bondgap,ang-150)--Le--sfrt(Le,bondgap,ang+150) Cp(col);
+  ef nL=vb: draw zA Cp(col);draw sfrt(Ls,bondgap,ang-30)--Ls--sfrt(Ls,bondgap,ang+30) Cp(col);
   ef nL=si_: erase draw subpath (0.15,0.85) of zA wpcs 0.8bondgap; draw zA Cp(col);
-  ef nL=wf_: erase draw subpath (0.15,0.85) of (Ls--sfB(Le,ww,am)) wpcs 0.8bondgap;
-             erase draw subpath (0.15,0.85) of (Ls--sfB(Le,ww,ap)) wpcs 0.8bondgap;
-             fill Ls--sfB(Le,ww,am)--sfB(Le,ww,ap)--cycle Cp(col);
-  ef nL=wb_: erase draw subpath (0.15,0.85) of (sfB(Ls,ww,am)--Le) wpcs 0.8bondgap;
-             erase draw subpath (0.15,0.85) of (sfB(Ls,ww,ap)--Le) wpcs 0.8bondgap;
-             fill sfB(Ls,ww,am)--Le--sfB(Ls,ww,ap)--cycle Cp(col);
+  ef nL=wf_: erase draw subpath (0.15,0.85) of (Ls--sfrt(Le,ww,am)) wpcs 0.8bondgap;
+             erase draw subpath (0.15,0.85) of (Ls--sfrt(Le,ww,ap)) wpcs 0.8bondgap;
+             fill Ls--sfrt(Le,ww,am)--sfrt(Le,ww,ap)--cycle Cp(col);
+  ef nL=wb_: erase draw subpath (0.15,0.85) of (sfrt(Ls,ww,am)--Le) wpcs 0.8bondgap;
+             erase draw subpath (0.15,0.85) of (sfrt(Ls,ww,ap)--Le) wpcs 0.8bondgap;
+             fill sfrt(Ls,ww,am)--Le--sfrt(Ls,ww,ap)--cycle Cp(col);
   ef nL=bd_: erase draw subpath(0.15,0.85) of zA wpcs 1.6bondgap;
              draw zA withpen penrazor rotated ap scaled bondgap Cp(col);
   ef nL=nb:
@@ -1243,41 +1223,76 @@
 enddef;
 %------------------------------------------------------------------------------------------------
 vardef frame_str(expr NUM)=
-  save nA,nB;
   nA:=1.12atom_wd; nB:=wdA[NUM]+.12atom_wd;
   ((0,0)--(nB,0)--(nB,nA)--(0,nA)--cycle) shifted
   (posA[NUM]-(.5nA+iif((dxA[NUM]=-1)and(wdA[NUM]>atom_wd),nB-nA,0),.5nA))
 enddef;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-parts_usr:=parts_emb_start;
+vardef STa(expr ATOM,WT,MI)=
+  str_cnt:=str_cnt+1; parts_cnt:=parts_cnt+1; tbl_cnt:=tbl_cnt+1;
+  comD[parts_cnt][1]:=_set_atom; parD[parts_cnt][1]:=str_cnt; cntD[parts_cnt]:=1;
+  strD[str_cnt]:=tbl_atom_str[tbl_cnt]:=ATOM;
+  tbl_atom[tbl_cnt]:=0;
+  tbl_atom_wt[tbl_cnt]:=WT; tbl_atom_mi[tbl_cnt]:=MI;
+  parts_cnt
+enddef;
 %-------------------------------------------------------------------------------------------------
+vardef STb(expr ATOM)(text TXT)=
+  str_cnt:=str_cnt+1; parts_cnt:=parts_cnt+1; tbl_cnt:=tbl_cnt+1; 
+  comD[parts_cnt][1]:=_set_atom; parD[parts_cnt][1]:=str_cnt; cntD[parts_cnt]:=1;
+  strD[str_cnt]:=tbl_atom_str[tbl_cnt]:=ATOM;
+  tbl_atom[tbl_cnt]:=0;
+  for list=TXT:
+    tbl_atom[tbl_cnt]:=tbl_atom[tbl_cnt]+1;
+    tbl_group[tbl_cnt][tbl_atom[tbl_cnt]]:=list-parts_emb_start;
+  endfor
+  parts_cnt
+enddef;
+%=================================================================================================
+parts_int:=parts_emi_start;
+parts_cnt:=parts_emb_start;
+%=================================================================================================
+C:= STa("C"   ,12.0107,   12.0000000);       H:= STa("H"  , 1.00794,   1.00782503223);
+Al:=STa("{Al}",26.9815,   26.98153853);      As:=STa("{As}",74.9216,   74.92159457);
+B:= STa("B"   ,10.811,    11.00930536);      Br:=STa("{Br}",79.904,    78.9183376);
+Ca:=STa("{Ca}",40.078,    39.962590863);     Cl:=STa("{Cl}",35.453,    34.968852);
+Co:=STa("{Co}",58.933194, 58.93319429);      Cr:=STa("{Cr}",51.9961,   51.94050623);
+Cu:=STa("{Cu}",63.546,    62.92959772);      D:= STa("D"   ,2.012,      2.01410177812);
+F:= STa("F"   ,18.9984,   18.99840316273);   Fe:=STa("{Fe}",55.845,    55.93493633);
+Hg:=STa("{Hg}",200.59,   201.97064340);      I:= STa("I"   ,126.90447,126.9044719);
+K:= STa("K"   ,39.0983,   38.9637064864);    Li:=STa("{Li}",6.941,      7.0160034366);
+Mg:=STa("{Mg}",24.305,    23.985041697);     Mn:=STa("{Mn}",54.938044, 54.93804391);
+Na:=STa("{Na}",22.98977,  22.9897692820);    Ni:=STa("{Ni}",58.693,    57.93534241);
+N:= STa("N"   ,14.0067,   14.00307400443);   O:= STa("O"   ,15.9994,   15.99491461957);
+P:= STa("P"   ,30.973762, 30.97376199842);   S:= STa("S"   ,32.065,    31.9720711744);
+Se:=STa("{Se}",78.971,    79.9165218);       Si:=STa("{Si}",28.0855,   27.97692653465);
+Sn:=STa("{Sn}",118.71,   119.90220163);      Ti:=STa("{Ti}",47.867,    47.94794198);
+U:= STa("U",   238.0289, 238.05079);         Zn:=STa("{Zn}",65.409,    63.92914201);
+tbl_atom_end:=tbl_cnt;
+%-------------------------------------------------------------------------------------------------
+CH3:=STb("C{H_3_}")(C,H,H,H); CH2:=STb("C{H_3_}")(C,H,H); CN:=STb("CN")(C,N); OH:=STb("OH")(O,H);
+CF3:=STb("C{F_3_}")(C,F,F,F); COOH:=STb("COOH")(C,O,O,H); SH:= STb("SH")(S,H);
+CHO:= STb("CHO")(C,H,O);      NO2:=STb("N{O_2_}")(N,O,O); NH2:=STb("N{H_2_}")(N,H,H);
+H2:=  STb("{H_2_}")(H,H);     ONa:=STb("O{Na}")(O,Na);    SO3:= STb("S{O_3_}")(S,O,O,O);
+%-------------------------------------------------------------------------------------------------
+Br[-1]:=STb("{Br^-^}")(Br); Cl[-1]:=STb("{Cl^-^}")(Cl);
+N[1]:=  STb("{N^+^}")(N);   N[-1]:= STb("{N^-^}")(N);
+O[1]:=  STb("{O^p^}")(O);   O[-1]:= STb("{O^-^}")(O);
+S[1]:=  STb("{S^p^}")(S);   S[-1]:= STb("{S^m^}")(S);
+tbl_group_end:=tbl_cnt;
+%=================================================================================================
 lr:='(60 for i==1 upto 10:: ,-60,60 endfor); rl:='(-60,lr);
-for i=3 upto 20: ?[i]:='(|:,(_get_len,_ring_len),<((-180 DIV i)-90)
-  for j==2 upto i:: ,(360 DIV i) endfor,(_cyc_sB,1-i),:|); endfor
-Ph:=Ph1:='(?6,(_dl,-2),(_dl,-4),(_dl,-6)); Ph2:='(?6,(_dl,-1),(_dl,-3),(_dl,-5));
+for i==3 upto 20: ?[i]:='(|<<,(_get_len,_ring_len),<((-180 DIV i)-90)
+  for j==2 upto i:: ,(360 DIV i) endfor,(_cyc_sB,1-i),>>|); endfor
+Ph:=Ph1:='(?6,-2=dl,-4=dl,-6=dl); Ph2:='(?6,-1=dl,-3=dl,-5=dl);
 !:=!1:='((_mk_bond,_arg_ang)); !!:='(!~db); !!!:='(!~tm);
-for i=2  upto 20: ![i]:='(|:,(_get_len,_tmp_len),! for j==2 upto i::,! endfor ,:|); endfor
+for i==2  upto 20: ![i]:='(|<<,(_get_len,_tmp_len),! for j==2 upto i::,! endfor ,>>|); endfor
 Me:='(); Et:='(!); Pr:='(!,!); Bu:='(!,!,!);
 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");S:='("S");P:='("P");F:='("F");I:='("I"); K:='("K");
-Si:='("{Si}");Al:='("{Al}");Mg:='("{Mg}");Zn:='("{Zn}");As:='("{As}");Co:='("{Co}");Cu:='("{Cu}");
-Ag:='("{Ag}");Au:='("{Au}");Sn:='("{Sn}");Cl:='("{Cl}");Br:='("{Br}");Li:='("{Li}");Cr:='("{Cr}");
-Na:='("{Na}");Ca:='("{Ca}");Hg:='("{Hg}");Ni:='("{Ni}");Ti:='("{Ti}");U:='("U");
-B:='("B");D:='("D");Fe:='("{Fe}");Mn:='("{Mn}");Se:='("{Se}");
-H[1]:= '("{H^+^}");  H[-1]:='("{H^-^}");  C[1]:='("{C^+^}");    C[-1]:='("{C^-^}");
-O[1]:= '("{O^+^}");  O[-1]:='("{O^-^}");  N[1]:='("{N^+^}");    N[-1]:='("{N^-^}");
-S[1]:= '("{S^+^}");  S[-1]:='("{S^-^}");  P[1]:='("{P^+^}");    P[-1]:='("{P^-^}");
-Li[1]:='("{Li^+^}"); Na[1]:='("{Na^+^}"); Cl[-1]:='("{Cl^-^}"); Br[-1]:='("{Br^-^}");
 %-------------------------------------------------------------------------------------------------
-R:='("R");   R1:='("{R^1^}"); R2:='("{R^2^}"); R3:='("{R^3^}"); R4:='("R^4^"); R5:='("{R^5^}");
-R6:='("R6"); R7:='("{R^7^}"); R8:='("{R^8^}"); R9:='("{R^9^}"); R10:='("R^10^"); R11:='("{R^11^}");
-%-------------------------------------------------------------------------------------------------
-CHO:='("CHO"); OH:='("OH"); COOH:='("COOH"); CH2:='("C{H_2_}"); CH3:='("C{H_3_}"); CN:='("CN");
-NH2:='("N{H_2_}"); NO2:='("N{O_2_}"); SH:='("SH"); SO3:='("S{O_3_}"); NH:='(N,/H~nl);
-%-------------------------------------------------------------------------------------------------
-NMe:=N!:='(N,/_); iPr:=Me!:='(/_,60); tBu:='(/_,/_^60,60); SO:='(S,//O); SOO:='(S,//O^-35,//O^35);
+NH:='(N,/H~nl); NMe:=N!:='(N,/_); iPr:=Me!:='(/_,60); tBu:='(/_,/_^60,60);
+SO:='(S,//O); SOO:='(S,//O^-35,//O^35);
 OMe:=O!:='(O,!); OEt:=O!2:='(O,!,!); OPr:=O!3:='(O,!,!,!); OiPr:=OMe!:='(O,!,iPr);
 SMe:=S!:='(S,!); SEt:=S!2:='(S,!,!); SPr:=S!3:='(S,!,!,!); SiPr:=SMe!:='(S,!,iPr);
 %-------------------------------------------------------------------------------------------------
@@ -1285,8 +1300,6 @@
 COOPr:=COO!3:='(COO,!,!,!); COOtBu:='(COO,!,tBu);
 COMe:=CO!:='(//O,!); COEt:=CO!2:='(//O,!,!); COPr:=CO!3:='(//O,!,!,!);
 OCOMe:=OCO!:='(O,!,//O,!); NMeMe:=NMe!:=N!_:='(N!,!); NMeEt:=NMe!2:=N!2_:='(N!,!,!);
-NMePr:=NMe!3:='(N!,!,!,!);
-NHCOMe:=NHCO!:='(NH,!,//O,!); NHiPr:=NHMe!:='(NH,!,iPr); NHtBu:='(NH,!,tBu);
 NHMe:=NH!:='(NH,!); NHEt:=NH!2:='(NH,!,!); NHPr:=NH!3:='(NH,!,!,!);
 %-------------------------------------------------------------------------------------------------
 !OH:='(!,OH); !SH:='(!,SH); !NH2:='(!,NH2);
@@ -1294,11 +1307,7 @@
 !OMe:=!O!:='(!,O!); !OEt:=!O!2:='(!,O!2); !OPr:=!O!3:='(!,O!3); !OiPr:=!OMe!:='(!,OMe!);
 !SMe:=!S!:='(!,S!); !SEt:=!S!2:='(!,S!2); !SPr:=!S!3:='(!,S!3); !SiPr:=!SMe!:='(!,SMe!);
 !NHMe:=!NH!:='(!,NH!); !NHEt:=!NH!2:='(!,NH!2); !NHPr:=!NH!3:='(!,NH!3);
-!NHiPr:=!NHMe!:='(!,NHMe!);
 !COOH:='(!,COOH); !COOMe:=!COO!:='(!,COO!); !COOEt:=!COO!2:='(!,COO!2);
-!COOPr:=!COO!3:='(!,COO!3);
-!COOtBu:='(!,COOtBu); !OCOMe:=!OCO!:='(!,OCO!); !NMeMe:=!NMe!:='(!,NMe!);
-!NMeEt:=!NMe!2:='(!,NMe!2); !NMePr:=!NMe!3:='(!,NMe!3);
 !CH3:='(!,CH3); !CN:='(!,CN); !iPr:=!Me!:='(!,iPr); !tBu:='(!,tBu);
 !CHO:='(!,CHO); !NO2:='(!,NO2); !Cl:='(!,Cl); !Br:='(!,Br); !F:='(!,F);
 !?3:='(!,?3); !?4:='(!,?4); !?5:='(!,?5); !?6:='(!,?6); !?7:='(!,?7); !?8:='(!,?8); !Ph:='(!,Ph);
@@ -1310,13 +1319,16 @@
 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);
 %-------------------------------------------------------------------------------------------------
+R:='("R");   R1:='("{R^1^}"); R2:='("{R^2^}"); R3:='("{R^3^}"); R4:='("R^4^"); R5:='("{R^5^}");
+R6:='("R6"); R7:='("{R^7^}"); R8:='("{R^8^}"); R9:='("{R^9^}"); R10:='("R^10^"); R11:='("{R^11^}");
+%-------------------------------------------------------------------------------------------------
 xCH3:='(/H,/H^60,60,H); xNH:='(N,/H); xNH2:='(N,/H,60,H); xNO2:='(N,//O,60~dm,O); xOH:='(O,!,H);
 xCHO:='(//O,!,H); xCOOH:='(//O,!,O,!,H); xCN:='(!~tm,N); xSH:='(S,!,H);
 %=================================================================================================
 init_par(parameter_list);
 %-------------------------------------------------------------------------------------------------
-parts_emb_end:=parts_usr;
-%%%%% message "parts_emb =" & decimal(parts_emb_start) &" => " & decimal(parts_emb_end);
+%%message "parts_emb =" & decimal(parts_emb_start) &" => " & decimal(parts_cnt);
+%%message "parts_emi =" & decimal(parts_emi_start) &" => " & decimal(parts_int);
 %-------------------------------------------------------------------------------------------------
 def expand_set=
   CH3:=xCH3; NH:=xNH; NH2:=xNH2; NO2:=xNO2; OH:=xOH; CHO:=xCHO; COOH:=xCOOH; CN:=xCN; SH:=xSH;
@@ -1327,7 +1339,7 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def char_size_set(expr WD)(expr HT)(expr STR)=
   for j=0 upto length(STR)-1:
-    nA:=ASCII(pic_c(j,STR)); tbl_char_wd[nA]:=WD; tbl_char_ht[nA]:=HT;
+    nA:=ASCII(subc(j,STR)); tbl_char_wd[nA]:=WD; tbl_char_ht[nA]:=HT;
   endfor
 enddef;
 %-------------------------------------------------------------------------------------------------
@@ -1349,13 +1361,11 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 def draw_char(expr CHR,POS,WD,PEN,NUM)=
 begingroup
-save Z,aW,aH,fW,fH,hW,hW,hH,fP,hP,zO,zOh,pos,dw,dwh,dwv,cdw,ppcs,sbp,sC;
+save Z,aW,aH,fW,fH,hW,hW,hH,fP,hP,zO,zOh,pos,dw,dwh,dwv,cdw,sC;
 path zO,zOh,zOa;
 string sC;
 pair Z[],pos;
 %-------------------------------------------------------------------------------------------------
-def ppcs expr n= pickup pencircle scaled n enddef;
-def sbp(expr m,n)expr p=subpath(m*length(p),n*length(p)) of p enddef;
 def dw expr p  = draw (p) shifted pos Cp(colorA[NUM]) enddef;
 def dwv expr p = draw (p) withpen penrazor scaled fP shifted pos Cp(colorA[NUM]) enddef;
 def dwvs (expr n)expr p=
@@ -1363,15 +1373,17 @@
 def dwh expr p=draw (p) withpen penrazor rotated 90 scaled fP shifted pos Cp(colorA[NUM]) enddef;
 def cdw expr p=cutdraw (p) shifted pos Cp(colorA[NUM]) enddef;
 %-------------------------------------------------------------------------------------------------
-sC:=CHR; fP:=PEN; hP:=0.5fP;
-aW:=WD*tbl_char_wd[ASCII(sC)]*(1-2ratio_atomgap_atom);
-aH:=WD*tbl_char_ht[ASCII(sC)]*(1-2ratio_atomgap_atom);
-pos:=POS+(WD*ratio_atomgap_atom,WD*ratio_atomgap_atom);
+sC:=CHR; fP:=PEN; hP:=0.5fP; nW:=WD;
+aW:=nW*tbl_char_wd[ASCII(sC)]*(1-2ratio_atomgap_atom);
+aH:=nW*tbl_char_ht[ASCII(sC)]*(1-2ratio_atomgap_atom);
+pos:=POS+(nW*ratio_atomgap_atom,nW*ratio_atomgap_atom);
+%-------------------------------------------------------------------------------------------------
 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); Z06:=(hW,aH); Z07:=(hW, 0);
 Z08:=( 0,hH); Z09:=(hP,hH); Z10:=(fW,hH); Z11:=(hW,aW); Z12:=( 0,fH); Z13:=(hP,fH); Z14:=(hW,fH);
 Z15:=(fW,aH); Z16:=(aW,fH); Z17:=(aW,hH); Z18:=(hP,aH); Z19:=(hW,hP); Z20:=(hW,hH); Z21:=(fW,hP);
 Z22:=(fW,fH); Z23:=(hW,fW);
+%-------------------------------------------------------------------------------------------------
 zO:=Z10..(.8aW,fH-.5hP)..tension 1.5..(.2aW,fH-.5hP)..Z09..
          (.2aW,1.5hP)..tension 1.5..(.8aW,1.5hP)..cycle;
 zOh:=(hP,.25aH)..Z19..(fW,.25aH)..Z20..cycle;
@@ -1490,14 +1502,11 @@
 vardef fdl(expr n)(expr s)=fixed_l(n)(decimal(s)) enddef;
 def warning(expr s)= message "% "&decimal(char_num)&fdr(3)(incr warning_cnt)&")"&s; enddef;
 %-------------------------------------------------------------------------------------------------
-def bond_check(expr a)(text s)=
-  nF:=0; for list=s: if list=bond_cnt: nF:=1; fi endfor
-  if nF=0:
-    warning("A"&decimal(a)&" ( "&fixed_l(8)(strD[numS[a]])&") has"&fdr(2)(bond_cnt)&" bonds");
-  fi
+def warning_bond(expr a)=
+  warning("A"&decimal(a)&" ( "&fixed_l(8)(strD[numS[a]])&") has"&fdr(2)(bond_cnt)&" bonds");
 enddef;
 %-------------------------------------------------------------------------------------------------
-vardef stripP(expr ATOM)=
+vardef cut_paren(expr ATOM)=
  if     length(ATOM)=4: substring (1,3) of ATOM
  elseif length(ATOM)=6: substring (1,2) of ATOM
  else: ATOM
@@ -1504,63 +1513,15 @@
  fi
 enddef;
 %=================================================================================================
-def STa(expr ATOM,WT,MI)=
-  tbl_cnt:=tbl_cnt+1;
-  tbl_atom_str[tbl_cnt]:=ATOM;
-  tbl_atom[tbl_cnt]:=0;
-  tbl_atom_wt[tbl_cnt]:=WT;
-  tbl_atom_mi[tbl_cnt]:=MI;
-enddef;
-%----------------------------------------------------------------------------------
-def STb(expr ATOM)(text TXT)=
-  tbl_cnt:=tbl_cnt+1;
-  tbl_atom_str[tbl_cnt]:=ATOM;
-  tbl_atom[tbl_cnt]:=0;
-  for list=TXT:
-    tbl_atom[tbl_cnt]:=tbl_atom[tbl_cnt]+1;
-    for j=1 upto tbl_cnt:
-      if list=tbl_atom_str[j]: tbl_group[tbl_cnt][tbl_atom[tbl_cnt]]:=j; fi
-    endfor
-  endfor
-enddef;
-%=================================================================================================
-tbl_cnt:=0;
-STa("C"   ,12.0107,   12.0000000);       STa("H"   , 1.00794,   1.00782503223);
-STa("{Al}",26.9815,   26.98153853);      STa("{As}",74.9216,   74.92159457);
-STa("B"   ,10.811,    11.00930536);      STa("{Br}",79.904,    78.9183376);
-STa("{Ca}",40.078,    39.962590863);     STa("{Cl}",35.453,    34.968852);
-STa("{Co}",58.933194, 58.93319429);      STa("{Cr}",51.9961,   51.94050623);
-STa("{Cu}",63.546,    62.92959772);      STa("D"   ,2.012,      2.01410177812);
-STa("F"   ,18.9984,   18.99840316273);   STa("{Fe}",55.845,    55.93493633);
-STa("{Hg}",200.59,   201.97064340);      STa("I"   ,126.90447,126.9044719);
-STa("K"   ,39.0983,   38.9637064864);    STa("{Li}",6.941,      7.0160034366);
-STa("{Mg}",24.305,    23.985041697);     STa("{Mn}",54.938044, 54.93804391);
-STa("N"   ,14.0067,   14.00307400443);   STa("{N^+^}",14.0067, 14.00307400443);
-STa("{N^-^}",14.0067, 14.00307400443);
-STa("{Na}",22.98977,  22.9897692820);    STa("{Ni}",58.693,    57.93534241);
-STa("O"   ,15.9994,   15.99491461957);   STa("{O^-^}",15.9994, 15.99491461957);
-STa("{O^p^}",15.9994, 15.99491461957);   STa("P"   ,30.973762, 30.97376199842);
-STa("S"   ,32.065,    31.9720711744);    STa("{S^p^}",32.065,    31.9720711744);
-STa("{S^m^}",32.065,  31.9720711744);
-STa("{Se}",78.971,    79.9165218);       STa("{Si}",28.0855,   27.97692653465);
-STa("{Sn}",118.71,   119.90220163);      STa("{Ti}",47.867,    47.94794198);
-STa("{Zn}",65.409,    63.92914201);
-%-------------------------------------------------------------------------------------------------
-STb("{H_2_}")("H","H"); STb("OH")("O","H"); STb("O{Na}")("O","{Na}"); STb("CN")("C","N");
-STb("SH")("S","H"); STb("CHO")("C","H","O");  STb("N{O_2_}")("N","O","O");
-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_calc=
   begingroup
   save warning_cnt,MWp,knownA,bondC,tmp_wtp,bond_cnt,cnt_hide_H;
-  numeric sumA[],bondC[],hideH[];
-  string sumA;
-  cnt_hide_H:=warning_cnt:=num_MW:=num_MI:=MWp:=0;
-  %------------------------------------------------------------------------------------------
-  for i=1 upto tbl_cnt: sumA[i]:=0; endfor
+  cnt_hide_H:=warning_cnt:=num_MW:=num_MI:=MWp:=tbl_atom_max:=0;
+  nE:=parts_emb_start;
+  for i=1 upto tbl_atom_end: sumA[i]:=0; endfor
   for i=1 upto cntA:
     knownA:=bond_cnt:=0;
+    nS:=numS[i];
     for j=1 upto cntB:
       if (lineB[j]>=dl)and(lineB[j]<=dm): bondC[j]:=2;
       ef lineB[j]=tm:                     bondC[j]:=3;
@@ -1570,33 +1531,42 @@
       if (sB[j]=i)or(eB[j]=i): bond_cnt:=bond_cnt+bondC[j]; fi
     endfor
     Bcnt[i]:=bond_cnt;
-    if numS[i]=0: strD[numS[i]]:="C"; fi
-    if (strD[numS[i]]="C")and(bond_cnt<4):
+    if ((nS=0)or(nS=(C-nE)))and(bond_cnt<4):
       hideH[i]:=4-bond_cnt; cnt_hide_H:=cnt_hide_H+hideH[i]; else: hideH[i]:=0;
     fi
-    if strD[numS[i]]="C":       bond_check(i)(1,2,3,4);
-    ef strD[numS[i]]="N":       bond_check(i)(3,5);
-    ef strD[numS[i]]="H":       bond_check(i)(1);
-    ef strD[numS[i]]="O":       bond_check(i)(2);
-    ef strD[numS[i]]="S":       bond_check(i)(2,4,6);
-    ef strD[numS[i]]="P":       bond_check(i)(5);
-    ef strD[numS[i]]="OH":      bond_check(i)(1);
-    ef strD[numS[i]]="COOH":    bond_check(i)(1);
-    ef strD[numS[i]]="CN":      bond_check(i)(1);
-    ef strD[numS[i]]="N{H_2_}": bond_check(i)(1);
-    ef strD[numS[i]]="F":       bond_check(i)(1);
-    ef strD[numS[i]]="{Cl}":    bond_check(i)(1);
-    ef strD[numS[i]]="{Br}":    bond_check(i)(1);
+    if nS=0:         if bond_cnt>4:  warning_bond(i) fi
+    ef nS=(O-nE):    if bond_cnt<>2: warning_bond(i) fi
+    ef nS=(N-nE):    if (bond_cnt<>3)and(bond_cnt<>5): warning_bond(i) fi
+    ef nS=(S-nE):    if (bond_cnt<>2)and(bond_cnt<>4)and(bond_cnt<>6): warning_bond(i) fi
+    ef nS=(H-nE):    if bond_cnt<>1: warning_bond(i) fi
+    ef nS=(OH-nE):   if bond_cnt<>1: warning_bond(i) fi
+    ef nS=(COOH-nE): if bond_cnt<>1: warning_bond(i) fi
+    ef nS=(NH2-nE):  if bond_cnt<>1: warning_bond(i) fi
+    ef nS=(CN-nE):   if bond_cnt<>1: warning_bond(i) fi
+    ef nS=(P-nE):    if bond_cnt<>5: warning_bond(i) fi
+    ef nS=(C-nE):    if bond_cnt>4:  warning_bond(i) fi
+    ef nS=(F-nE):    if bond_cnt<>1: warning_bond(i) fi
+    ef nS=(Cl-nE):   if bond_cnt<>1: warning_bond(i) fi
+    ef nS=(Br-nE):   if bond_cnt<>1: warning_bond(i) fi
     fi
-    for j=1 upto tbl_cnt:
-      if strD[numS[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_group[j][k]]:=sumA[tbl_group[j][k]]+1; endfor fi
-        knownA:=1; fi  endfor
+    for j=1 upto tbl_group_end:
+      if strD[nS]=tbl_atom_str[j]:
+        if tbl_atom[j]=0: sumA[j]:=sumA[j]+1; if j>tbl_atom_max: tbl_atom_max:=j; fi
+        else:
+          for k=1 upto tbl_atom[j]:
+            sumA[tbl_group[j][k]]:=sumA[tbl_group[j][k]]+1;
+            if tbl_group[j][k]>tbl_atom_max: tbl_atom_max:=tbl_group[j][k]; fi
+          endfor
+        fi
+        knownA:=1;
+      fi
+      exitif knownA=1;
+    endfor
     if knownA=0: warning(" Unknown Str("&strD[numS[i]]&") is used "&decimal(i)); fi
   endfor
+  %-------------------------------------------------------------------------------------
   sumA[2]:=sumA[2]+cnt_hide_H;
-  for i=1 upto tbl_cnt:
+  for i=1 upto tbl_atom_max:
     if sumA[i]>=1:
       nA:=tbl_atom_wt[i]/100*sumA[i];
       MWp:=MWp+nA;
@@ -1604,9 +1574,10 @@
         num_MW:= num_MW+tbl_atom_wt[i]*sumA[i];
         num_MI:= num_MI+tbl_atom_mi[i]*sumA[i];
       fi
-      cal_FM:=cal_FM&stripP(tbl_atom_str[i]) if sumA[i]>=2: &decimal(sumA[i]) fi;
+      cal_FM:=cal_FM&cut_paren(tbl_atom_str[i]) if sumA[i]>=2: &decimal(sumA[i]) fi;
     fi
   endfor
+  %-------------------------------------------------------------------------------------
   cal_MI:=substring (0,10) of decimal(num_MI);
   cal_MW:=substring (0,8)  of decimal(num_MW);
   if sw_aux_out>=1: proc_auxfile_out; fi
@@ -1626,28 +1597,29 @@
   for i=1 upto aux_max: exitif tag[i]="";
     if i=1: printf "" else: &aux_delimiter fi
     if (sw_aux_out=1)or(sw_aux_out=3): &tag[i]&":" fi
-    if     tag[i]="F":   & jobname
-    elseif tag[i]="C":   & decimal(char_num)
-    elseif tag[i]="mw":  & cal_MW
-    elseif tag[i]="fm":  & cal_FM
-    elseif tag[i]="mi":  & cal_MI
-    elseif tag[i]="w":   & decimal(xpart(fsize))
-    elseif tag[i]="h":   & decimal(ypart(fsize))
-    elseif tag[i]="w1":  & decimal(mol_wd)
-    elseif tag[i]="h1":  & decimal(mol_ht)
-    elseif tag[i]="An":  & decimal(cntA)
-    elseif tag[i]="Bn":  & decimal(cntB)
     %-------------------------------------------
-    elseif tag[i]="NO":  & inf_NO
-    elseif tag[i]="EN":  & inf_EN
-    elseif tag[i]="JN":  & inf_JN
-    elseif tag[i]="MW":  & inf_MW
-    elseif tag[i]="MI":  & inf_MI
-    elseif tag[i]="FM":  & inf_FM
-    elseif tag[i]="CAS": & inf_CAS
-    elseif tag[i]="USE": & inf_USE
-    elseif tag[i]="EXA": & inf_EXA
-    elseif tag[i]="EXB": & inf_EXB
+    if tag[i]="F":   & jobname
+    ef tag[i]="C":   & decimal(char_num)
+    ef tag[i]="mw":  & cal_MW
+    ef tag[i]="fm":  & cal_FM
+    ef tag[i]="mi":  & cal_MI
+    ef tag[i]="w":   & decimal(xpart(fsize))
+    ef tag[i]="h":   & decimal(ypart(fsize))
+    ef tag[i]="w1":  & decimal(mol_wd)
+    ef tag[i]="h1":  & decimal(mol_ht)
+    ef tag[i]="An":  & decimal(cntA)
+    ef tag[i]="Bn":  & decimal(cntB)
+    %-------------------------------------------
+    ef tag[i]="NO":  & inf_NO
+    ef tag[i]="EN":  & inf_EN
+    ef tag[i]="JN":  & inf_JN
+    ef tag[i]="MW":  & inf_MW
+    ef tag[i]="MI":  & inf_MI
+    ef tag[i]="FM":  & inf_FM
+    ef tag[i]="CAS": & inf_CAS
+    ef tag[i]="USE": & inf_USE
+    ef tag[i]="EXA": & inf_EXA
+    ef tag[i]="EXB": & inf_EXB
     fi
   endfor
   if sw_aux_out=3: for i=1 upto inf_num: &aux_delimiter&info[i] endfor; fi
@@ -1663,7 +1635,7 @@
   out_file_name:=out_file_rep;
   printf "------------------------------------------------------------------";
   printf " Molecular name = "& inf_EN;
-  printf " Warnings = "&fdr(3)(warning_cnt)&" / Expanded command = "&decimal(cntD[1]);
+  printf " Warnings = "&fdr(3)(warning_cnt)&" / Command count= "&decimal(cntD[0]);
   printf " Width * Height = " & fdr(10)(mol_wd)&" * "&fdr(10)(mol_ht);
   printf " Shift width * height  = "& fdr(10)(minX)&" * "&fdr(10)(minY);
   printf " Bond length = "&fdr(3)(blen)&"   Atom size   = "&fdr(3)(atom_wd);
@@ -1694,11 +1666,11 @@
   if MWp<=40: cal_MW_str:=cal_MW; cal_MI_str:=cal_MI; 
   else:       cal_MW_str:=fdr(10)(MWp)&" * 100"; cal_MI_str:=fdr(10)(MIp)&" * 100";
   fi
-  for i=1 upto tbl_cnt:
+  for i=1 upto tbl_atom_max:
     if sumA[i]>=1:
        nA:=tbl_atom_wt[i]/100*sumA[i]; nB:=tbl_atom_mi[i]/100*sumA[i];
        printf " "&
-         fixed_l(5)(stripP(tbl_atom_str[i]))&
+         fixed_l(5)(cut_paren(tbl_atom_str[i]))&
          "("&fdr(9)(tbl_atom_wt[i])&")"&"["&fdr(9)(tbl_atom_mi[i])&"]"&
          " * "&fdr(4)(sumA[i])&" = "
        if nA<40: &fdr(12)(tbl_atom_wt[i]*sumA[i])&"["&fdr(12)(tbl_atom_mi[i]*sumA[i])&"]";
@@ -1718,7 +1690,7 @@
 %=================================================================================================
 def proc_mol_out=
   begingroup
-  save chg_cnt,chg_atm,chg_chg,nA,nB;
+  save chg_cnt,chg_atm,chg_chg;
   nA:=nB:=chg_cnt:=0;
   message "["&decimal(char_num)&"]:"&inf_EN;
   out_file_name:=out_file_mol;
@@ -1735,7 +1707,7 @@
   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])/blen)& fdr(10)(ypart(posA[i])/blen)&
-           fdr(10)(0)&" "&fixed_l(2)(stripP(strD[numS[i]]))&"  0  0  0  0";
+           fdr(10)(0)&" "&fixed_l(2)(cut_paren(strD[numS[i]]))&"  0  0  0  0";
     if chargeA[i]<>0: chg_atm[incr chg_cnt]:=i; chg_chg[chg_cnt]:=chargeA[i]; fi
   endfor
   for i=1 upto cntB:
@@ -1759,7 +1731,7 @@
   printf "M  V30 COUNTS "&decimal(cntA)&" "&decimal(cntB)&" 0 0 0";
   printf "M  V30 BEGIN ATOM";
   for i=1 upto cntA:
-     printf "M  V30 "&decimal(i)&" "&stripP(strD[numS[i]])&" "&
+     printf "M  V30 "&decimal(i)&" "&cut_paren(strD[numS[i]])&" "&
             decimal(xpart(posA[i])/blen)&" "&decimal(ypart(posA[i])/blen)&" 0 0"
             if chargeA[i]<>0: &" CHG="&decimal(chargeA[i]) fi;
   endfor



More information about the tex-live-commits mailing list.