summaryrefslogtreecommitdiff
path: root/graphics/mcf2graph/mcf2graph.mf
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-04-05 03:00:44 +0000
committerNorbert Preining <norbert@preining.info>2021-04-05 03:00:44 +0000
commitf0b3901f183621b9000493d3ec263c69ac868156 (patch)
tree307f40bdcc97503979fc6bfa9c14726ffb277abb /graphics/mcf2graph/mcf2graph.mf
parent6c7f24a5336de85c7db50c5037772288964c607b (diff)
CTAN sync 202104050300
Diffstat (limited to 'graphics/mcf2graph/mcf2graph.mf')
-rw-r--r--graphics/mcf2graph/mcf2graph.mf133
1 files changed, 101 insertions, 32 deletions
diff --git a/graphics/mcf2graph/mcf2graph.mf b/graphics/mcf2graph/mcf2graph.mf
index 350a3e973c..2388b2f278 100644
--- a/graphics/mcf2graph/mcf2graph.mf
+++ b/graphics/mcf2graph/mcf2graph.mf
@@ -1,5 +1,5 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% mcf2graph ver 4.61 Copyright (c) 2013-2021 Akira Yamaji
+% mcf2graph ver 4.62 Copyright (c) 2013-2021 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,
@@ -33,11 +33,12 @@
% Set output report : mpost -s ahlength=3 FILENAME
% Set output MOL(V2000) : mpost -s ahlength=5 FILENAME
% Set output MOL(V3000) : mpost -s ahlength=6 FILENAME
+% Set output souce file for metafont : mpost -s ahlength=7 FILENAME
% Set to use plain.mp (label,arrow) : mpost -s labeloffset=1 FILENAME
% Set to use plain.mp (label,arrow,atom) : mpost -s labeloffset=2 FILENAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tracingstats:=1;
-message "* This is mcf2graph ver 4.61 2021.03.21";
+message "* This is mcf2graph ver 4.62 2021.04.04";
%-------------------------------------------------------------------------------------------------
newinternal cntA,cntB,cntM,minX,minY,maxX,maxY,sftX,sftY,com,par,envT,envB,lenT,lineT,angT,rotT,
crR,nA,nB,nC,nD,nE,nF,nS,nL,nR,nU,nP,xpos,ypos,markA,markB,saveA,saveB,bondL;
@@ -46,16 +47,16 @@ numeric save_num[],comD[][],parD[][],adrD[][],cntD[],tbl_atom[],tbl_group[][],f_
com_group[][],par_group[][],cnt_group[],colorA[],colorB[],sumA[],bondC[],hideH[],
lineB[],sB[],eB[],angB[],angA[],lenB[],angX[],numS[],wdM[],htM[],wdA[],dxA[],
mc_indent[],cmm_adr[];
-string save_str[],tbl_atom_str[],strD[],tag[],out_file_name,out_file_aux,
+string save_str[],tbl_atom_str[],strD[],tag[],file_name_output,out_file_aux,blank_str,temp_str,
out_file_rep,out_file_mpc,aux_delimiter,atomfont,mpfont,s_tag,s_var,cal_FM,cal_MW,cal_MI,
- inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW,blank_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,dum;
picture mol_stru[],atom_picture,save_picture,temp_picture;
path arrow_path,dottedline_path,line_path,arrow_head;
%-------------------------------------------------------------------------------------------------
char_num:=str_cnt:=tbl_cnt:=proc_end:=mangle:=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_emu:=0;
+sw_rep_out:=sw_mol_out:=sw_group_off:=sw_single:=sw_arrow_emu:=sw_file_open:=0;
numberA_start:=numberB_start:=1; numberA_end:=numberB_end:=4095;
%-------------------------------------------------------------------------------------------------
aux_max:=max_inf_num:=20;
@@ -102,7 +103,7 @@ if (known green)and(known ahlength):
out_file_aux:=jobname&"-info.aux";
out_file_mpc:=jobname&"-mpc.txt";
out_file_rep:=jobname&"-report.txt";
- def out_file_mol= jobname&"-"&fit_zero(char_num)&"-"&inf_EN&".mol" enddef;
+ def file_mol_output= jobname&"-"&fit_zero(char_num)&"-"&inf_EN&".mol" enddef;
%--default ahangle=45---------------------------------------------------------------------
if ahangle=0: outputformat:="eps"; % eps format(.mps)
elseif ahangle=11: outputformat:="png"; hppp:=vppp:=0.24; % png format(300dpi)
@@ -136,7 +137,7 @@ if (known green)and(known ahlength):
fi
%-----------------------------------------------------------------------------------------
def endchar = endfig enddef;
- def printf expr s= write s to out_file_name enddef;
+ def printf expr s= write s to file_name_output enddef;
def # = enddef;
vardef totalweight expr a= 0 enddef;
def Cp(expr s) = if known s: if s<>0: withcolor color_list[s] fi fi enddef;
@@ -221,7 +222,7 @@ def_com(-4090)(_com,_jp_atom,_jp_absA,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_t
%--------------------------------------------------------------------------------------------------
def parameter_list=
sw_rep_out,sw_numberA,sw_numberB,sw_mframe,sw_aux_out,sw_expand,sw_mol_out,sw_calc,
- sw_single,sw_ext_all,sw_aframe,sw_fframe,sw_group_off,sw_trimming,sw_arrow_emu,
+ sw_single,sw_ext_all,sw_aframe,sw_fframe,sw_group_off,sw_trimming,sw_arrow_emu,sw_file_open,
ratio_atom_bond,ratio_thickness_bond,ratio_char_bond,ratio_chain_ring,ratio_bondgap_bond,
ratio_hash_black,ratio_hashgap_bond,ratio_thickness_char,ratio_wedge_bond,ratio_atomgap_atom,
lonepairdiam,lonepairspace,blength,offset_atom,offset_wedge,max_blength,offset_hash_gap,
@@ -263,8 +264,10 @@ enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def beginfont(text s)=
begingroup
- save ',f_beginchar,f_ext,blen,ext,add,ang_br,s_fw,s_bw,s_len,at_colon,info,mc;
- string info[],mc[],mc;
+ save ',f_beginchar,f_ext,blen,ext,add,ang_br,n_fw,n_bw,at_colon,at_semicol,info,mc,temps,
+ file_name_input,temps_a,t_tag;
+ numeric at_semicol[];
+ string info[],mc[],temps,temps_a,mc,file_name_input,t_tag;
%------------------------------------------------------------------------------------------------
def ext=ext_to_font enddef;
def add=add_to_molecule enddef;
@@ -282,20 +285,22 @@ def beginfont(text s)=
for list=s: inf_num:=inf_num+1; info[inf_num]:=list; mc[inf_num]:=""; endfor
%------------------------------------------------------------------------------------------------
for j=1 upto inf_num:
- at_colon:=0;
- for i=1 upto 9: if subc(i,info[j])=":": at_colon:=i; fi exitif at_colon>0; endfor
- s_len:=length(info[j]);
+ at_colon:=scan_char(":",info[j],0,1);
if at_colon=1:
- s_fw:=0; for k=2 upto s_len: if subc(k,info[j])<>" ": s_fw:=k; fi exitif s_fw>0; endfor
- s_bw:=0; for k=s_len downto 2: if subc(k,info[j])<>" ": s_bw:=k; fi exitif s_bw>0; endfor
+ n_fw:=scan_char(" ",info[j],1,2);
+ n_bw:=scan_char(" ",info[j],-1,2);
mc_row:=mc_row+1;
- mc_indent[mc_row]:=s_fw-2;
- mc[mc_row]:=substring (s_fw-1,s_bw) of info[j];
+ mc_indent[mc_row]:=n_fw-2;
+ mc[mc_row]:=substring (n_fw-1,n_bw) of info[j];
mc:=mc&mc[mc_row];
ef at_colon>=1:
- s_tag:=substring (0,at_colon-1) of info[j];
- s_var:=substring (at_colon,s_len) of info[j];
- if known scantokens("inf_"&s_tag): scantokens("inf_"&s_tag):=s_var; fi
+ s_tag:=substring (0,at_colon-1) of info[j];
+ s_var:=substring (at_colon,length(info[j])) of info[j];
+ if s_tag="f": if f_MP=1: file_name_input:=s_var&".mcf"; fi
+ ef s_tag="t": if f_MP=1: t_tag:=s_var; fi
+ ef s_tag="v": if f_MP=1: nA:=extract_data(t_tag,s_var); fi
+ else: if known scantokens("inf_"&s_tag): scantokens("inf_"&s_tag):=s_var; fi
+ fi
fi
endfor
%------------------------------------------------------------------------------------------------
@@ -355,6 +360,65 @@ def endfont=
%% message "* parts_int (0)="& decimal(parts_int) &" "& decimal(parts_int-parts_int_start);
%-----------------------------------------------------------------------------------------------
enddef;
+%-------------------------------------------------------------------------------------------------
+vardef extract_data(expr t,v)=
+ save data_cnt,f_end,semicol_cnt,cond,n_var;
+ f_end:=data_cnt:=semicol_cnt:=cond:=at_semicol[0]:=0;
+ if t="n": n_var:=scantokens(v); fi
+ forever:
+ temps:=readfrom file_name_input;
+ exitif temps=EOF;
+ if subc(1,temps)="%":
+ ef subc(1,temps)="*": f_end:=1;
+ ef subc(1,temps)="+":
+ data_cnt:=data_cnt+1;
+ if t="n": if n_var=0: cond:=1; else: if data_cnt=n_var: cond:=1; fi fi
+ else: if v=scantokens("inf_"&t): cond:=1; fi
+ fi
+ if cond=1:
+ forever:
+ temps:=readfrom file_name_input;
+ exitif subc(1,temps)="-";
+ mc_row:=mc_row+1;
+ n_fw:=scan_char(" ",temps,1,1);
+ mc_indent[mc_row]:=n_fw-1;
+ mc[mc_row]:=substring (n_fw-1,length(temps)) of temps;
+ mc:=mc&mc[mc_row];
+ endfor
+ f_end:=1;
+ else:
+ forever: temps:=readfrom file_name_input; exitif subc(1,temps)="-"; endfor
+ fi
+ else:
+ semicol_cnt:=0;
+ for i=1 upto length(temps):
+ if subc(i,temps)=";": semicol_cnt:=semicol_cnt+1; at_semicol[semicol_cnt]:=i; fi
+ endfor
+ for i=1 upto semicol_cnt+1:
+ if i<=semicol_cnt: temps_a:=substring (at_semicol[i-1],at_semicol[i]-1) of temps;
+ else: temps_a:=substring (at_semicol[semicol_cnt],length(temps)) of temps;
+ fi
+ at_colon:=scan_char(":",temps_a,0,1);
+ s_tag:=substring (0,at_colon-1) of temps_a;
+ s_var:=substring (at_colon,length(temps_a)) of temps_a;
+ if known scantokens("inf_"&s_tag): scantokens("inf_"&s_tag):=s_var; fi
+ endfor
+ fi
+ exitif f_end=1;
+ endfor
+ if sw_file_open=0: closefrom file_name_input; fi
+ data_cnt
+enddef;
+%--------------------------------------------------------------------------------------------------
+vardef scan_char(expr c,s,d,n)=
+ save k,n_s;
+ n_s:=0;
+ if d=0: for k=n upto length(s): if subc(k,s)=c: n_s:=k; fi exitif n_s>0; endfor
+ ef d=1: for k=n upto length(s): if subc(k,s)<>c: n_s:=k; fi exitif n_s>0; endfor
+ ef d=-1: for k=length(s) downto n: if subc(k,s)<>c: n_s:=k; fi exitif n_s>0; endfor
+ fi
+ n_s
+enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def set_def_MC=
save /,//,/*,*/,**,*/*,~,^,',`,<,>,:,=,\,\\,*\,\*,*\*,@,@$,$,&,&$,#,##,{,},|,||,_,inside_def_MC;
@@ -1531,7 +1595,7 @@ enddef;
%=================================================================================================
def proc_auxfile_out=
message "["&decimal(char_num)&"]:"&inf_EN;
- out_file_name:=out_file_aux;
+ file_name_output:=out_file_aux;
%--------------------------------------------------------------------------------------
if (char_num=1)and(sw_aux_out=2):
printf tag[1] for i=2 upto aux_max: exitif tag[i]=""; &aux_delimiter&tag[i] endfor ;
@@ -1541,7 +1605,7 @@ def proc_auxfile_out=
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
+ if tag[i]="J": & jobname
ef tag[i]="C": & decimal(char_num)
ef tag[i]="mw": & cal_MW
ef tag[i]="fm": & cal_FM
@@ -1576,7 +1640,7 @@ enddef;
%-------------------------------------------------------------------------------------------------
def proc_report_out=
message "["&decimal(char_num)&"]:"&inf_EN;
- out_file_name:=out_file_rep;
+ file_name_output:=out_file_rep;
printf "===========================================================================";
printf " No."&fdr(4)(char_num)&" / Name = "& inf_EN;
if mc_row>=1:
@@ -1640,7 +1704,7 @@ enddef;
%=================================================================================================
def proc_mol_out=
message "["&decimal(char_num)&"]:"&inf_EN;
- out_file_name:=out_file_mol;
+ file_name_output:=file_mol_output;
%-V2000---------------------------------------------------------------------------------------
if sw_mol_out=1:
printf ""; printf " -MCFtoMOL- "&fsl(20)(info[1]); printf "";
@@ -1818,13 +1882,13 @@ vardef check(expr s)=
if mc_row>=1:
%---------------------------------------------------------------------------------------------
for i=1 upto length(s):
- temp_c:=subc(i,s); if temp_c<>" ": char_cnt:=char_cnt+1; mc_char[char_cnt]:=ASCII(temp_c); fi
+ temp_c:=subc(i,s);
+ if temp_c<>" ": char_cnt:=char_cnt+1; mc_char[char_cnt]:=ASCII(temp_c); fi
endfor
mc_char[0]:=mc_char[char_cnt+1]:=mc_char[char_cnt+2]:=a_cmm;
%-- argument missing chkeck ----------------------------------------------------------------
cnt_prn_s:=cnt_prn_e:=cnt_brc_s:=cnt_brc_e:=cnt_brk_s:=cnt_brk_e:=cnt_inline_def:=cnt_at:=0;
- cnt_cmm:=cnt_and:=cnt_gtn:=cnt_gtn:=0;
- nA:=f_depth:=0;
+ cnt_cmm:=cnt_and:=cnt_gtn:=cnt_gtn:=nA:=f_depth:=0;
forever:
nA:=nA+1; nB:=mc_char[nA-1]; nC:=mc_char[nA]; nD:=mc_char[nA+1];
%-----------------------------------------------------------------------------------------
@@ -1869,16 +1933,21 @@ vardef check(expr s)=
if nB<>a_cmm: proc_err(8,nA) fi % a |
fi
%------------------------------------------------------------------------------------------
- ef nC=a_prn_s: cnt_prn_s:=cnt_prn_s+1; f_depth:=1;
+ ef nC=a_prn_s: if nD= a_cmm: proc_err(7,nA) fi % ( x
+ cnt_prn_s:=cnt_prn_s+1; f_depth:=1;
if nB=a_qut: cnt_inline_def:=cnt_inline_def+1; fi
ef nC=a_prn_e: cnt_prn_e:=cnt_prn_e+1; f_depth:=0;
- ef nC=a_brc_s: cnt_brc_s:=cnt_brc_s+1; f_depth:=1;
- ef nC=a_brc_e: cnt_brc_e:=cnt_brc_e+1; f_depth:=0;
+ ef nC=a_brc_s: if nD= a_cmm: proc_err(7,nA) fi % { x
+ cnt_brc_s:=cnt_brc_s+1; f_depth:=1;
+ ef nC=a_brc_e: if nD= a_cmm: proc_err(7,nA) fi % } x
+ cnt_brc_e:=cnt_brc_e+1; f_depth:=0;
if nD=a_cln: cnt_chg_atoms:=cnt_chg_atoms+1;
ef nD=a_equ: cnt_chg_bonds:=cnt_chg_bonds+1;
fi
- ef nC=a_brk_s: cnt_brk_s:=cnt_brk_s+1; f_depth:=1;
- ef nC=a_brk_e: cnt_brk_e:=cnt_brk_e+1; f_depth:=0;
+ ef nC=a_brk_s: if nD= a_cmm: proc_err(7,nA) fi % [ x
+ cnt_brk_s:=cnt_brk_s+1; f_depth:=1;
+ ef nC=a_brk_e: if nB= a_cmm: proc_err(7,nA) fi % x ]
+ cnt_brk_e:=cnt_brk_e+1; f_depth:=0;
%-------------------------------------------------------------------------------------------
fi
exitif nA>=char_cnt+1;