Hi SAS experts, I'm trying to write a macro to do 1. compile files 2. add TOC. Attched files are needed to run the program as below. Two issues: 1. Font for L16.2.6.4 and L16.2.6.5 is courier new with 8pt. But when they are combined, it changed to time new roman automatically, please see complied.rtf. 2. Is there any way that can make TOC portrait and L16.2.6.4 & L16.2.6.5 landscape. Thank you very much! Bob proc template; define style styles.ftoc; parent=styles.rtf; style body from document / leftmargin=1in rightmargin=1in topmargin=1.25in bottommargin=1in; end; run; options orientation=portrait; *This creates the Table of Contents RTF file; ods listing close; ods rtf file="&loc.\TOC.rtf" style=ftoc headery = 500 footery = 500 startpage=no anchor='TOC'; title; footnote; proc report data=text2 nowd missing style(column)={asis=on font_size=10pt font_face="Courier New" font_weight=bold background=white foreground=black /*cellheight=0.4in*/} style(header)={asis=on just=left font_size=12pt font_face="Courier New" font_weight=bold background=white foreground=black bordertopcolor=black borderbottomcolor=black bordertopwidth=1 borderbottomwidth=1 } style(lines)={asis=on just=left font_size=10pt font_face="Courier New" font_weight=bold background=white foreground=black}; column ttlord fdisp; define ttlord/order order=internal noprint; define fdisp / "Table of Contents"; run; ods rtf close; ods listing; %Macro Compile(titles=toc2); *Step 1: Read in the TOC file and modify the end RTF code; data readtoc; infile "&loc.\TOC.rtf" missover length=len end=fin lrecl=2000 firstobs=1; input string $varying2000. len; if fin then do; string=compress(string,'}'); *The final } ends the RTF document, so it is removed to add additional code (i.e. RTF documents.; end; run; quit; *Step 2: Begin Compiled file; data _null_; file "&loc.\Compiled.rtf" lrecl=2000; set readtoc; put string; run; *Step 3: Read in tables from the titles dataset and create macro variables; data _null_; set &titles. end=fin; if anatype='Table' then call symput('F'||strip(_n_),'T'||strip(FINALNO)); else if anatype='Listing' then call symput('F'||strip(_n_),'L'||strip(FINALNO)); if fin then call symput('fileno',strip(_n_)); run; *Step 4: Read in each table file and modify the RTF code; %do tt=1 %to &fileno.; %put &&F&tt..; data readrtf; infile "&loc.\&&F&tt...rtf" missover length=len end=fin lrecl=2000 firstobs=25; *This starts at 25, because the first 24 lines of code are for document creation and are included in the TOC section.; input string $varying2000. len; if _n_=1 then string="\sect"||strip(string); *The \sect creates a break and a new section at the beginning of this table.; else string=string; if fin then do; string=compress(string,'}'); end; *Change bookmark name on 1st page; if find(string,'*\bkmkstart IDX}{\*\bkmkend IDX}')>0 then do; string=tranwrd(string,'IDX',strip(translate("&&F&tt..",'_','.'))); end; *Remove other bookmarks; else if find(string,'\bkmkstart')>0 then do; rstart=find(string,'\bkmkstart'); *Find the position of \bkmkstart; bkmk=scan(substr(string,rstart),2,' }{\'); *Find the name of the bookmark (2nd word); bkmkend=find(string,'\bkmkend'); *Find the position of \bkmkend; rend=find(string, strip(bkmk), bkmkend)+length(bkmk)-1; *Find the position of the bookmark after \bkmrkend plus the length of the bookmark name; remove=substr(string,rstart,(rend-rstart+1)); *String to be removed; string=tranwrd(string,strip(remove),''); *Remove bookmark RTF code; end; run; *Step 4a: Write to RTF file; data _null_; file "&loc.\Compiled.rtf" lrecl=2000 mod; set readrtf; put string; run; %end; *Step 5: Finish RTF file; data _null_; file "&loc.\Compiled.rtf" lrecl=32767 mod; put '}'; run; %Mend Compile; %Compile;
... View more