From 10e09e01b238ad80b81ecddc9b0f915eb23b79fc Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 6 Jun 2021 20:49:41 +0000 Subject: mcf2graph (6jun21) git-svn-id: svn://tug.org/texlive/trunk@59490 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf | 155 ++++++++++++---------- 1 file changed, 83 insertions(+), 72 deletions(-) (limited to 'Master/texmf-dist/metapost') diff --git a/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf b/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf index 9cf47d31f87..5bbd4639dc9 100644 --- a/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf +++ b/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% mcf2graph ver 4.65 Copyright (c) 2013-2021 Akira Yamaji +% mcf2graph ver 4.66 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, @@ -37,7 +37,7 @@ % Set to use plain.mp (label,arrow,atom) : mpost -s labeloffset=2 FILENAME %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tracingstats:=1; -message "* This is mcf2graph ver 4.65 2021.05.23"; +message "* This is mcf2graph ver 4.66 2021.06.06"; %------------------------------------------------------------------------------------------------- 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; @@ -53,16 +53,14 @@ pair save_pair[],posA[],posM[][],msize,mposition,fsize,fmargin,save_mposition 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:=0; -sw_numberA:=sw_numberB:=sw_expand:=sw_fframe:=sw_mframe:=sw_aframe:=sw_trimming:=sw_ext_all:=0; -sw_group_off:=sw_single:=sw_arrow_emu:=sw_output:=0; -numberA_start:=numberB_start:=1; numberA_end:=numberB_end:=4095; +char_num:=str_cnt:=tbl_cnt:=proc_end:=mangle:=sw_expand:=sw_frame:=sw_trimming:=sw_ext_all:=0; +sw_abbreviate:=sw_arrow_emu:=sw_output:=sw_numbering:=0; numbering_start:=1; numbering_end:=4095; %------------------------------------------------------------------------------------------------- aux_max:=max_inf_num:=20; aux_delimiter:=";"; blank_str:= " "; dum:=(-4091,0); for i=1 upto aux_max: tag[i]:=""; endfor -None:=11; None_Info_t:=12; None_Mcode_t:=13; None_Info_Mcode_t:=14; None_Report_t:=15; -Info1:=21; Info2:=22; Info_t:=23; Report:=31; Report_t:=32; MOL2k:=41; MOL3k:=42; -Mfont:=51; Mcode:=61; Mcode_t:=62; Info_Mcode_t:=63; +Font:=1; Temp:=2; Info:=4; Table:=8; Report:=16; MOL2k:=32; MOL3k:=64; Mfont:=128; Mcode:=256; +Atom:=8; Bond:=16; Brock:=32; Inverse:=64; Group:=32; Mol:=64; +Outside:=1; Inside:=2; Bothside:=Outside+Inside; %------------------------------------------------------------------------------------------------- a_prn_s:=ASCII("("); a_prn_e:=ASCII(")"); a_brc_s:=ASCII("{"); a_brc_e:=ASCII("}"); a_brk_s:=ASCII("["); a_brk_e:=ASCII("]"); a_cmm:=ASCII(","); a_equ:=ASCII("="); @@ -108,8 +106,8 @@ if (known green)and(known ahlength): elseif ahangle=45: outputformat:="eps"; % eps format(.mps) *default fi %--default ahlength=4--------------------------------------------------------------------- - if ahlength=1: sw_output:=Info1; % output aux file - elseif ahlength=2: sw_output:=Info2; % output aux file(fixed mode) + if ahlength=1: sw_output:=Info; % output aux file + elseif ahlength=2: sw_output:=Info+Table; % output aux file(Table mode) elseif ahlength=3: sw_output:=Report; % output report elseif ahlength=4: sw_output:=0; % *default elseif ahlength=5: sw_output:=MOL2k; % output MOL(V2000) @@ -179,13 +177,12 @@ if f_MP=1: fi %-------------------------------------------------------------------------------------------------- ?3:=?20:=Ph:=Ph1:=Ph2:=hz:=0; vt:=1; -ratio_chain_ring:=0.66; ratio_atom_bond:=0.36; ratio_thickness_bond:=0.015; -ratio_thickness_char:=0.1; ratio_char_bond:=1.5; ratio_bondgap_bond:=0.15; -ratio_hashgap_bond:=0.12; ratio_hash_black:=0.4; ratio_wedge_bond:=0.12; +ratio_chain_ring:=0.66; ratio_atom_bond:=0.36; ratio_thickness_bond:=0.015; +ratio_thickness_char:=0.1; ratio_char_bond:=1.5; ratio_bondgap_bond:=0.15; +ratio_hashgap_bond:=0.12; ratio_hash_black:=0.4; ratio_wedge_bond:=0.12; ratio_atomgap_atom:=0.04; -offset_thickness:=0.2bp; offset_bond_gap:=0.3bp; offset_hash_gap:=0.1bp; -offset_atom:=0.8pt; offset_wedge:=0.4bp; -thickness_fframe:=0.2bp; thickness_mframe:=0.2bp; thickness_aframe:=0.1bp; +offset_thickness:=0.2bp; offset_bond_gap:=0.3bp; offset_hash_gap:=0.1bp; +offset_atom:=0.8pt; offset_wedge:=0.4bp; thickness_frame:=0.2bp; max_blength:=10mm; blength:=mangle:=0; max_labelsize:=20mm; dottedline_gap:=1.5bp; %-------------------------------------------------------------------------------------------------- fsize:=(30mm,20mm); fmargin:=(0.4mm,0.4mm); msize:=(1,1); mposition:=(0.5,0.5); @@ -209,17 +206,16 @@ def_com(-4090)(_com,_jp_atom,_jp_absA,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_line,_t _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,_arrange_ang,_chg_atom,_tmp_rot,_fuse,_size_atom,_numeric, _jump_at,_set_add,_chg_add,_nop,_mark,_moff,_term,_len_s,_len_e,_len_ss,_len_ee, - _group_s,_group_e,_rest,_charge, + _group_s,_group_e,_rest,_charge,_from,_until, si,dl,dl_,dr,dr_,db,dm,dm_,tm,wf,wb,bd,bz,zf,zb,dt,wv,nl,vf,vb,nb,si_,wf_,wb_,zf_,zb_,wv_,bd_); %-------------------------------------------------------------------------------------------------- def parameter_list= - sw_numberA,sw_numberB,sw_mframe,sw_expand,sw_output, - sw_single,sw_ext_all,sw_aframe,sw_fframe,sw_group_off,sw_trimming,sw_arrow_emu, + sw_numbering,sw_expand,sw_output,sw_ext_all,sw_frame,sw_trimming,sw_arrow_emu,sw_abbreviate, 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, - offset_bond_gap,thickness_fframe,thickness_mframe,thickness_aframe,offset_thickness, - numberA_start,numberA_end,numberB_start,numberB_end,defaultsize,defaultscale,labeloffset,mangle, + lonepairdiam,lonepairspace,offset_atom,offset_wedge,max_blength,offset_hash_gap, + offset_bond_gap,thickness_frame,offset_thickness, + numbering_start,numbering_end,defaultsize,defaultscale,labeloffset,mangle,blength, fsize,fmargin,msize,mposition,defaultfont,atomfont,dottedline_gap, Me,Et,CH3,NH,NH2,NO,NO2,OH,CHO,COOH,CN,SH,!CH3,!NH2,!NO2,!OH,!CHO,!COOH,!CN,!SH enddef; @@ -227,7 +223,7 @@ enddef; def init_par(text t)= nA:=nB:=nC:=0; for list=t: - if numeric list: nA:=nA+1; save_num[nA]:=list; + if numeric list: nA:=nA+1; save_num[nA]:=list; elseif pair list: nB:=nB+1; save_pair[nB]:=list; elseif string list: nC:=nC+1; save_str[nC]:=list; fi @@ -237,7 +233,7 @@ enddef; def store_par(text t)= nA:=nB:=nC:=0; for list=t: - if numeric list: nA:=nA+1; if save_num[nA]<>list: save_num[nA]:=list; fi + if numeric list: nA:=nA+1; if save_num[nA]<>list: save_num[nA]:=list; fi elseif pair list: nB:=nB+1; if save_pair[nB]<>list: save_pair[nB]:=list; fi elseif string list: nC:=nC+1; if save_str[nC]<>list: save_str[nC]:=list; fi fi @@ -304,7 +300,7 @@ def endfont= %-------------------------------------------------------------------------------------------- if f_EOF=0: %-------------------------------------------------------------------------------------------- - if sw_output<=None_Report_t: + if (sw_output=0)or(scan_bit(sw_output,Font)): if cntM>=1: if sw_ext_all=1: ext_to_font(EXT_ALL); fi if sw_trimming>=1: @@ -326,15 +322,15 @@ def endfont= %---------------------------------------------------------------------------------------- if f_MP=0: beginchar(char_num,font_wd/bp*bp#,font_ht/bp*bp#,0) else: beginfig(char_num) w:=charwd:=font_wd; h:=charht:=font_ht; chardp:=0; - if (sw_fframe<>1)and(sw_fframe<>3): draw_corner((0,0),w,h,0.05bp); fi + if scan_bit(sw_frame,Outside): else: draw_corner((0,0),w,h,0.05bp); fi fi - if (sw_fframe=1)or(sw_fframe=3): draw_frame((0,0),w,h,thickness_fframe); fi - if (sw_fframe=2)or(sw_fframe=3): - draw_frame((margin_lr,margin_tb),w-2margin_lr,h-2margin_tb,thickness_fframe); + if scan_bit(sw_frame,Outside): draw_frame((0,0),w,h,thickness_frame); fi + if scan_bit(sw_frame,Inside): + draw_frame((margin_lr,margin_tb),w-2margin_lr,h-2margin_tb,thickness_frame); fi for i=1 upto cntM: addto currentpicture also mol_stru[i] shifted posM[0][i]; mol_stru[i]:=nullpicture; - if sw_mframe=1: ext(draw_frame(p[i],w[i],h[i],thickness_mframe)) fi + if scan_bit(sw_frame,Mol): ext(draw_frame(p[i],w[i],h[i],thickness_frame)) fi endfor if f_ext=1: addto currentpicture also mol_stru[0]; mol_stru[0]:=nullpicture; fi %----------------------------------------------------------------------------------------- @@ -343,29 +339,29 @@ def endfont= if f_MP=0: beginchar(char_num,font_wd/bp*bp#,font_ht/bp*bp#,0) else: beginfig(char_num) w:=charwd:=font_wd; h:=charht:=font_ht; fi - draw (0,h)--(0,0)--(w,0)--(w,h)--(0,h)--(w,0) wpcs thickness_fframe; + draw (0,h)--(0,0)--(w,0)--(w,h)--(0,h)--(w,0) wpcs thickness_frame; fi %----------------------------------------------------------------------------------------- endchar; clearit; %----------------------------------------------------------------------------------------- - if sw_output=None_Info_t: proc_info_out(3); - ef sw_output=None_Mcode_t: proc_mc_out(2); - ef sw_output=None_Info_Mcode_t: proc_info_out(3); proc_mc_out(2); - ef sw_output=None_Report_t: proc_report_out(2); + if sw_output=(Font+Info+Temp): proc_info_out(3); + ef sw_output=(Font+Mcode+Temp): proc_mc_out(2); + ef sw_output=(Font+Info+Mcode+Temp): proc_info_out(3); proc_mc_out(2); + ef sw_output=(Font+Report+Temp): proc_report_out(2); fi %----------------------------------------------------------------------------------------- - ef sw_output=Info1: proc_info_out(1); - ef sw_output=Info2: proc_info_out(2); - ef sw_output=Info_t: proc_info_out(3); - ef sw_output=Mcode: proc_mc_out(1); - ef sw_output=Mcode_t: proc_mc_out(2); - ef sw_output=Mfont: proc_mf_out(0); - ef sw_output=Report: proc_report_out(1); - ef sw_output=Report_t: proc_report_out(2); - ef sw_output=MOL2k: proc_mol_out(1); - ef sw_output=MOL3k: proc_mol_out(2); - ef sw_output=Info_Mcode_t: proc_info_out(3); proc_mc_out(2); + ef sw_output=Info: proc_info_out(1); + ef sw_output=(Info+Table): proc_info_out(2); + ef sw_output=(Info+Temp): proc_info_out(3); + ef sw_output=Mcode: proc_mc_out(1); + ef sw_output=(Mcode+Temp): proc_mc_out(2); + ef sw_output=Mfont: proc_mf_out(0); + ef sw_output=Report: proc_report_out(1); + ef sw_output=(Report+Temp): proc_report_out(2); + ef sw_output=MOL2k: proc_mol_out(1); + ef sw_output=MOL3k: proc_mol_out(2); + ef sw_output=(Info+Mcode+Temp): proc_info_out(3); proc_mc_out(2); fi %----------------------------------------------------------------------------------------------- %% message "* parts_cnt (0)="& decimal(parts_cnt) &" "& decimal(parts_usr-parts_usr_start); @@ -400,11 +396,13 @@ def pickup_data_unit(expr t,v)= if temps=EOF: f_EOF:=1; fi exitif temps=EOF; 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]; + if 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]; + fi endfor f_end:=1; else: @@ -437,6 +435,8 @@ def pickup_data_unit(expr t,v)= endgroup; enddef; %-------------------------------------------------------------------------------------------------- +vardef scan_bit(expr n,b)= if b=0: false else: odd(floor(n/b)) fi enddef; +%-------------------------------------------------------------------------------------------------- vardef scan_char(expr c,s,d,n)= save k,n_s; n_s:=0; @@ -465,6 +465,7 @@ vardef '(text TXT)= parts_cnt:=parts_cnt+1; read_mcf(parts_cnt)(TXT); parts_cnt vardef read_id(text TXT)=read_mcf(incr parts_cnt)(|,#crR,TXT,##,(_com,_rest)); parts_cnt enddef; vardef read_ud(text TXT)=read_mcf(incr parts_cnt)(dum,dum,|,TXT,(_com,_rest)); parts_cnt enddef; vardef abs_adress primary n == n-4095 enddef; +primarydef a from_until b == (_from,a),(_until,b) enddef; tertiarydef a op_equ b = if (known a)and(known b):: change_bond(a,b) else:: _nop fi enddef; tertiarydef a op_col b = if (known a)and(known b):: change_atom(a,b) else:: _nop fi enddef; tertiarydef a op_hat b = if known b:: (_tmp_rot,b),a else:: _nop,a fi enddef; @@ -513,6 +514,8 @@ def read_mcf(expr n)(text TXT)= enddef; %------------------------------------------------------------------------------------------------- vardef read_number(text TXT)= + save --,-+,nA,nB,nC; + let -- == from_until; parts_int:=parts_int+1; nA:=0; for list==TXT:: @@ -522,7 +525,13 @@ vardef read_number(text TXT)= else:: nA:=nA+1; comD[parts_int][nA]:=_numeric; parD[parts_int][nA]:=list; fi elseif pair list:: - nA:=nA+1; comD[parts_int][nA]:=xpart(list); parD[parts_int][nA]:=ypart(list); + if xpart(list)==_from:: nB:=ypart(list); + ef xpart(list)==_until:: nC:=ypart(list); + for i==nB upto nC:: + nA:=nA+1; comD[parts_int][nA]:=_numeric; parD[parts_int][nA]:=i; + endfor + else:: nA:=nA+1; comD[parts_int][nA]:=xpart(list); parD[parts_int][nA]:=ypart(list); + fi fi else:: message "unknown command in "AND decimal(parts_int); fi @@ -871,7 +880,7 @@ def MC(text TXT)= string temp_c; pair temp_p; %----------------------------------------------------------------------------------------------- - if (sw_numberA>=1)or(sw_numberB>=1): ratio_atom_bond:=0.25; fi + if sw_numbering>=1: ratio_atom_bond:=0.25; fi if (sw_expand=1)or(sw_output=MOL2k)or(sw_output=MOL3k): expand_set; crR:=1; else: crR:=-ratio_chain_ring; fi @@ -884,7 +893,7 @@ def MC(text TXT)= %=============================================================================================== read_mcf(0)(TXT,(_com,_term)); proc_bond_atom(0)(1); - if (cnt_group>0)and(sw_group_off=0): read_group(0)(1); fi + if (cnt_group>0)and(not scan_bit(sw_abbreviate,Group)): read_group(0)(1); fi char_use_check; %-scaling--------------------------------------------------------------------------------------- if blength>1: blen:=blength; proc_size_setup; proc_skeleton(0); proc_scaling; @@ -910,7 +919,7 @@ def MC(text TXT)= if blen>max_blength: blen:=max_blength; proc_size_setup; proc_skeleton(0); proc_scaling; fi fi %-draw atom------------------------------------------------------------------------------------- - if (sw_numberA=0)and(sw_numberB=0): for i=1 upto cntA: draw_atom(i); endfor fi + if sw_numbering=0: for i=1 upto cntA: draw_atom(i); endfor fi %-draw add to atom------------------------------------------------------------------------------ for i=1 upto cntA: if addA[i]<>0: @@ -928,12 +937,13 @@ def MC(text TXT)= for i=1 upto cntB: if lineB[i]=si_: draw_bond(i); fi endfor %-atom numbering-------------------------------------------------------------------------------- - if sw_numberA>=1: + if scan_bit(sw_numbering,Atom): for i=1 upto cntA: - if (i>=numberA_start)and(i<=numberA_end): - if sw_numberA=2: nA:=i-numberA_start+1; - elseif sw_numberA=3: nA:=iif(numberA_end=numbering_start)and(i<=numbering_end): + if scan_bit(sw_numbering,Brock): nA:=i-numbering_start+1; + elseif scan_bit(sw_numbering,Inverse): + nA:=iif(numbering_end=1: + if scan_bit(sw_numbering,Bond): for i=1 upto cntB: - if (i>=numberB_start)and(i<=numberB_end): - if sw_numberB=2: nB:=i-numberB_start+1; - elseif sw_numberB=3: nB:=iif(numberB_end=numbering_start)and(i<=numbering_end): + if scan_bit(sw_numbering,Brock): nB:=i-numbering_start+1; + elseif scan_bit(sw_numbering,Inverse): + nB:=iif(numbering_end0)or(sw_numberB<>0): for j=a_zero upto a_nine: f_char[j]:=1; endfor + if sw_numbering>=1: for j=a_zero upto a_nine: f_char[j]:=1; endfor else: for i=1 upto cntA: if numS[i]<>0: @@ -1258,7 +1269,7 @@ def draw_atom(expr NUM)= f_wd:=atom_wd*tbl_char_wd[ASCII(temp_c)]; if dir_str=-1: pos_a:=pos_a-(f_wd,0); fi draw_char(temp_c,pos_a+pos_c,atom_wd,bond_pen_wd*ratio_char_bond,NUM); - if sw_aframe=1: draw_frame(pos_a+pos_c,f_wd,atom_wd,thickness_aframe); fi + if scan_bit(sw_frame,Atom): draw_frame(pos_a+pos_c,f_wd,atom_wd,thickness_frame); fi if dir_str=1: pos_a:=pos_a+(f_wd,0); fi else: atom_picture:=temp_c infont atomfont; @@ -1268,7 +1279,7 @@ def draw_atom(expr NUM)= addto currentpicture also atom_picture scaled (r_ff*(1-2ratio_atomgap_atom)) shifted (pos_a+pos_c+(f_wd*ratio_atomgap_atom,f_ht*ratio_atomgap_atom)) Cp(colorA[NUM]); - if sw_aframe=1: draw_frame(pos_a+pos_c,f_wd,f_ht,thickness_aframe); fi + if scan_bit(sw_frame,Atom): draw_frame(pos_a+pos_c,f_wd,f_ht,thickness_frame); fi if dir_str=1: pos_a:=pos_a+(f_wd,0); fi fi wdA[NUM]:=wdA[NUM]+f_wd; @@ -1287,7 +1298,7 @@ def draw_bond(expr NUM)= 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; %----------------------------------------------------------------------------------------------- - if (numS[nS]=0)and(numS[nE]=0)or(sw_numberA=1)or(sw_numberB=1): + if (numS[nS]=0)and(numS[nE]=0)or(sw_numbering>=1): Ls:=posA[nS]; Le:=posA[nE]; pA:=(.1,.9); ef numS[nS]=0: Le:=zL intersectionpoint frame_str(nE); Ls:=posA[nS]; pA:=(.15,1); ef numS[nE]=0: Ls:=zL intersectionpoint frame_str(nS); Le:=posA[nE]; pA:=(0,.85); @@ -1296,7 +1307,7 @@ def draw_bond(expr NUM)= zA:=Ls--Le; len:=length(Le-Ls); %----------------------------------------------------------------------------------------------- pickup pencircle scaled bond_pen_wd; - if (nL=si)or(sw_single=1): draw zA Cp(col); + if (nL=si)or(scan_bit(sw_abbreviate,Bond)): draw zA 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); @@ -1642,7 +1653,7 @@ def proc_info_out(expr n)= fi %-------------------------------------------------------------------------------------- if (char_num=1)and(n=2): - printf tag[1] for i=2 upto aux_max: exitif tag[i]=""; &aux_delimiter&tag[i] endfor% ; + printf tag[1] for i=2 upto aux_max: exitif tag[i]=""; &aux_delimiter&tag[i] endfor ; fi %-------------------------------------------------------------------------------------- for i=1 upto aux_max: exitif tag[i]=""; -- cgit v1.2.3