基于SAS软件的高级RTF排版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于SAS软件的高级RTF排版
作者信息:Katja Glaß, Bayer Schering Pharma AG, Berlin, GER
摘要: SAS9的结果输出系统(ODS)RTF功能提供了多种设计多文本格式的可能性,包括RTF命令在内的附加功能使得RTF的布局设计几乎有无限种可能。
本文的目的是列出使用SAS设计RTF的不同方法。
重点陈述使用直接RTF命令进行自动编码或创建不同类型表单等操作的优势。
此外,本文进一步探讨了一般方法下如何实现用新的RTF命令丰富结果输出功能。
前言
SAS中ODS的主要优势是可以创建按单元格组织的逻辑表,这些逻辑表更易于处理,排版和阅读。
目前,临床研究文献倾向于使用MS文档格式,SAS提供的ODS RTF可用于生成符合当前布局要求且可调整格式的表单,此外,ODS RTF与以往的ASCII格式相比还具有很多其他优势。
下文将介绍基于SAS设计RTF文件的方案及附加功能
1.基础知识
1.1.基本OPTIONS PAPERSIZE=A4 ORIENTATION=landscape;使用ODS RTF最重要的选项是地址和纸型的设置。
这些涉及到RTF创建的选项应在每段SAS程序的开头设定。
例如在欧洲地区创建表格常用A4横向版式:OPTIONS PAPERSIZE=A4 ORIENTATION=landscape;
1.2.根据使用ODS RTF通道只需要输入两条简单的命令,一条标志程序开始,一条标志结束:ODS RTF;ODS RTF CLOSE;在这两行命令间产生的所有SAS输出结果都自动放置在了RTF文件中。
文件的结构和内容与相应的输出清单一致。
基本RTF文档建立程序如下:
ODS RTF FILE=”C:\temp\class.rtf”
AUTHOR=”Katja Glaß”
TITLE =”Output of SASHELP.CLASS”;
PROC PRINT DATA=sashelp.class; RUN;
ODS RTF CLOSE;
图1: RTF输出的简单例子
“FILE”命令重定向输出到另一个文件并成为SAS的缺省设置。
使用ODS RTF的AURHOR和TITLE语句可以将一些文档元数据信息写入RTF文件。
BODYTITLE是一个非常实用的语句,可以使标题和脚注在文中而不是页眉和页脚显示。
当新
表格需要另起一页显示时可以使用STARTPAGE=YES语句。
ODS RTF最重要的功能是排版。
总布置图,边缘距离,颜色等很多选项可以通过程序来定义。
使用不同的SAS语句可以产生完全不同的页面:
ODS RTF FILE=”C:\temp\class.rtf”
BODYTITLE STARPAGE=YES
STYLE=journal;
TITLE1 “Printout of sashelp.class”;
FOOTNOTE1 “Note: Created on February 2007”;
PROC PRINT DATA=sashelp.class; RUN;
ODS RTF CLOSE;
更多关于ODS RTF版式的基础语句可在很多文献中找到,例如SUGI文摘125-29 [1].
1.3.ODS ESCAPECHAR 调用字段函数和其他RTF元素需要使用一个特殊字符,其前置代码需已在SAS中注册,后面的代码才能被定义。
定义这个特殊的字符需要用到ESCAPECHAR语句:ODS ESCAPECHAR=’^’;
2.使用ODS RTF进行排版
2.1.总体布局功能一些基本的标题和脚注样式可能已经存在于系统中。
例如可以选择粗体字体,字体颜色,背景色,字体大小和高度。
此外还可设置对齐,下划线和链接。
下例将对这些用法加以说明:
ODS RTF FILE="C:\temp\example.rtf";
TITLE1 BOLD COLOR=blue BCOLOR=yellow "bold blue title on yellow background";
TITLE2 FONT=arial HEIGHT=20 UNDERLIN=1 "tall underlined arial title";
TITLE3 JUSTIFY=R LINK="" "left aligned SAS link title";
PROC PRINT DATA=sashelp.class;RUN;
ODS RTF CLOSE;
表格布局也存在一些标准样式。
我们主要通过PROC REPORT过程来实现各种类型表格的输出,故本文重点讨论该过程,涉及到的一些语句也适用于其他过程。
布局选项可应用于报告的不同位置,最常用于页眉,列,行或完整的报告。
诸如颜色,字体,对准线和边缘距离等的不同选项可根据位置进行调整。
在SAS文件编制中可找到完整目录。
以下例子可加以解释:
ODS RTF FILE="C:\temp\example.rtf";
PROC REPORT DATA=sashelp.shoes NOWINDOWS HEADLINE MISSING
style(header)=[ just=center font_size=10pt
font_weight=bold background=white]
style(report)=[cellpadding=6pt];
column region subsidiary product stores sales inventory returns;
DEFINE region / display;
DEFINE stores / display;
DEFINE inventory / display STYLE={FONT_STYLE=italic};
DEFINE returns / display STYLE={CELLWIDTH=3cm};
compute region;
CALL DEFINE(_col_, "Style", "STYLE=[indent=1cm]");
endcomp;
compute stores;
IF stores < 4
THEN DO;
CALL DEFINE(1, "Style", "STYLE=[background=yellow]");
END;
endcomp;
RUN;
ODS RTF CLOSE;
2.2.嵌入式布局功能上文中提到的样式元素同样也适用于使用ESCAPECHAR加“S”作为指示符的其他位置。
在标题和脚注中这些元素可如下例设置:
ODS RTF FILE = "C:\temp\test.rtf" bodytitle;
title1 "standard title";
title2 "^S={indent=.12in} indented title";
title3 "^S={just=right} right aligned title";
title4 "^S={font_size=40pt} tall title";
title5 "^S={font=('ARIAL',20pt,bold)} tall, bold and arial title";
footnote1 "^S={preimage='H:\My Documents\My Pictures\fische-7.jpg'} a picture";
PROC PRINT DATA=sashelp.class;RUN;
ODS RTF CLOSE;
同样,这些元素也可用ODS RTF TEXT语句调用:
ODS RTF FILE="C:\temp\test.rtf" bodytitle;
ODS RTF TEXT = "standard title";
ODS RTF TEXT = "^S={indent=.12in} indented title";
ODS RTF TEXT = "^S={just=right} right aligned title";
ODS RTF TEXT = "^S={font_size=20pt tall title";
ODS RTF TEXT = "^S={font=('ARIAL',20pt,bold)} tall, bold and arial title";
ODS RTF CLOSE;
在PROC REPORT语句输出的表格中也可使用这些样式:
ODS RTF FILE="C:\temp\example.rtf";
PROC REPORT DATA=sashelp.class NOWINDOWS HEADLINE MISSING;
COLUMN sex name age height weight;
DEFINE sex / group noprint;
COMPUTE BEFORE sex;
LINE '^S={just=left font_weight=bold}Sex=' sex $1.;
ENDCOMP;
RUN;
ODS RTF CLOSE;
图2: 在PROC REPORT语句中嵌入粗体式样
这些布局块也可应用于整个板块的不同位置。
例如可以仅将第一个单词加粗而其余的不加粗:ODS RTF FILE="C:\temp\example.rtf";
PROC REPORT DATA=sashelp.class NOWINDOWS HEADLINE MISSING;
COLUMN sex name age height weight;
DEFINE sex / group noprint;
COMPUTE BEFORE sex;
LINE '^S={just=left font_weight=bold}S^S={font_weight=medium}ex=' sex $1.;
ENDCOMP;
RUN;
ODS RTF CLOSE;
有时命令的顺序也很重要,如下例所见只是多了一行命令就无法实现欲想中的左对齐。
为了达到文本内容的左对齐,相应命令应位于有关陈述的第一行。
ODS RTF FILE="C:\temp\example.rtf";
PROC REPORT DATA=sashelp.class NOWINDOWS HEADLINE MISSING;
column sex name age height weight;
define sex / group noprint;
compute before sex;
line '';
line '^S={just=left font_weight=bold}Sex=' sex $1.;
endcomp;
RUN;
ODS RTF CLOSE;
3.对RTF进行排版
3.1.添加嵌入式RTF标签设计RTF文件最有趣,最灵活的方法是使用直接RTF命令和字段函数。
各种各样的RTF命令(标签)有不同的使用方式。
当在输出中使用包含RTF命令的RTF语句时,SAS 会特别的遮蔽某些特殊字符,这使得PROTECTSPECIALCHAR语句可以使保护选项失效。
为了避免由于数据(例:自由文本域)中包含那些特殊字符而报错,我认为只能命令SAS只在特殊位置暴露标签。
当一段文本输出的开头是{ 且结尾是}时,SAS并不遮蔽中间的特殊字符。
此外也可以用ESCAPECHAR语句来避免字符遮蔽。
例如,标签“\b”意为令一段文本字体为黑体。
接下来的例子
说明了遮蔽功能,在第一行的\b并没有作为文本在输出中显示。
第二个和第三个例子中遮蔽被去除了,因此最后一个单词显示成了粗体而标签\b被隐藏。
1) ODS RTF TEXT = "The third \b word";
2) ODS RTF TEXT = "{The third \b word}";
3) ODS RTF TEXT = "The third ^R/RTF'\b 'word";
图3: 使用加粗标签的例子
常见RTF标签的信息参见ODS FAQS及其概念的有关SAS页面,详细说明在RTF说明书中已给出。
查找特殊标签的好方法是使用类如微软文字处理软件等其他能产生RTF的软件。
当文件以RTF 格式保存后,再用文本编辑器打开可进行语法分析。
匹配的标签添加在合适的位置上。
然而绝大多数程序产生的RTF文件中包含了过多的标签,以至于为了找到相应标签需要耗费大量时间来查找和测试。
3.2.使用字段函数字段函数是一类与前不同但非常实用的标签。
由打开文件的程序(例如微软文字处理软件)所支持的所有的函数都可以在文件中建立。
常用的函数有{page},表示当前页面;{pageof}表示页数,{filename}表示文件名,{createdate}表示显示日期以及{savedate}。
使用微软文字处理软件时更容易检测到字段函数,只要创建一个字段(插入—>字段…—>选择一个字段)然后按[Alt]+[F9]就可以显示字段函数。
当需要创建的表格较为复杂,内容中包含了不同的格式时也可以用该方法。
在Word下可以看到相关语法。
编程时应将欲嵌入文档的字段置于能表示下文描述了一个字段的特殊标签中,相应的标签为“{\field{\fldinst <字段名> }}”。
这些标签不应在文档中被遮蔽,为此,需要使用之前介绍的方法。
下例简答说明了这些不同的字段函数的用法:
OPTIONS NODATE NONUMBER;
ODS RTF FILE="C:\temp\example.rtf";
TITLE1 j=r "{page {\field{\fldinst{page}}} of {\field{\fldinst{numpages}}}}";
FOOTNOTE "file ^R/RTF'{\field{\fldinst{filename}}}' created on
^R/RTF'{\field{\fldinst{createdate}}}' saved on
^R/RTF'{\field{\fldinst{savedate \\@ ""d.M.yyyy""}}}'";
PROC REPORT DATA=sashelp.class NOWINDOWS HEADLINE MISSING;
column sex name age height weight;
compute before _page_;
line 'Table ^R/RTF"{\field{\fldinst{SEQ table}}}": Listing of class';
endcomp;
RUN;
ODS RTF CLOSE;
图4: 字段函数示例
标题包括了“页数第X页/共X页”,脚注包括了文件名,保存和创建日期等信息。
如示例中所见,日期有不同的表现形式。
在Word下使用与检测字段函数同样的方法可得到表述这些日期形式的特殊语句。
在表格中标题是已插入的序列。
以上函数可用于自动编码。
3.3.索引
实验得出,SAS的CONTENTS函数可支持内容目录。
在一些情况下,该函数是可行的,但在大多数情况下需要手动建立不同的TOC。
在RTF中,一个索引也是一个简单的字段函数。
Word中的标准内容目录是{TOC \o "1-3" \h \z \u}。
此外,格式和水平深度可用{TOC \t "标题1;1;标题2;2;标题3;3"}语句手动定义。
创建其他索引也可使用这种内容目录。
当使用‘table’格式来创建表时,表集合中的一个表格的标题可用{ TOC \h \z \c "Table" }语句创建。
在微软文字处理软件的语言版本中,有时表格内容中的分隔符是“,”而不是“;”。
很多文章中包括了RTF文档格式指派的问题。
在下一步中,字段函数必须嵌入到文档中。
RTF中用反斜杠这个特殊字符来表示后面衔接的是标签。
为了使反斜杠起到字段函数说明的功能,双反斜杠中的字符会被遮蔽。
最后一个布局手法是,可以在字段不更新的情况下添加一个可视的文本,做法是在{\fldrslt {文本}}中以临时结果的形式给出文本。
ODS RTF FILE="C:\temp\example.rtf" bodytitle;
ODS RTF TEXT='^R/RTF"{\field{\fldinst{TOC \\o ''1-3'' \\h \\z \\u}}
{\fldrslt {table of contents }}}"';
ODS RTF CLOSE;
使用ODS RTF TEXT的一个缺点是包含文本的单元格总是以其所包含最长文本的长度作为其
单元格的长度。
为了更好地显示编译的TOC,单元格的宽度应该100%的利用起来,用OUTPUTWIDTH格式可以达到这种效果:
ODS RTF FILE="C:\temp\example.rtf" bodytitle;
ODS RTF TEXT='^S={outputwidth=100% just=l}^R/RTF"
{\field{\fldinst{TOC \\o ''1-3'' \\h \\z \\u}}
{\fldrslt {table of contents }}}"';
ODS RTF CLOSE;
3.4.行标记当一个特定的布局需要添加特别用途线时无法用ODS格式来实现。
此时,可以在指定位置创建一条线。
然而,表格和单元格的划线不受SAS的影响。
但使用段落制表或许能在不同位置创建线条。
有关内容可参见参考文献[5]。
以下示例简单展示了这些标签的功能:
ODS RTF FILE="C:\temp\example.rtf" style=journal;
PROC REPORT DATA=sashelp.class NOWINDOWS HEADLINE MISSING;
column sex name age height weight;
define sex / group;
compute before _page_;
line '^R/RTF"\brdrb\brdrs\brdrw15 "Table: Listing';
endcomp;
compute after sex;
line '^R/RTF"\brdrt\brdrs\brdrw15"';
endcomp;
RUN;
ODS RTF CLOSE;
在本例中表格标题下面和每个性别组上面都有一条线。
有时在处理程序中没有显示这些线,但在打印或其他视图中这些线都会显示。
3.5.RTF中的缩进另一个常常用到的功能是缩进,在ASCII中前导空格常被缩进。
事实上,SAS
中的AXIS功能可进行缩进且不删除前导空格和RTF输出。
通常,我们更需要缩进功能而不是前导空格。
ODS的格式代码“INDENT”不仅可以创建模拟缩进还可以创建真正的缩进。
在大多数情况下,这个代码不够灵活,无法根据不同的前导空格数来进行缩进。
缩进的RTF标签是\li加上一个指出缩进宽度的数字。
要显示下列例子需要先创建有前导空格的数据集:
PROC SORT DATA=sashelp.class OUT=class; BY sex name; RUN;
DATA class2;
SET class;
BY sex;
LENGTH text $20;
text = ' ' || TRIM(name);
sort=2;
OUTPUT;
IF first.sex
THEN DO;
IF sex = "F" THEN text = "Female";
ELSE text = "Male";
sort = 1;
age=.; height=.; weight=.;
OUTPUT;
END;
RUN;
PROC SORT DATA=class2; BY sex sort; RUN;
OPTIONS MISSING='';
“ASIS”代码的用法如下:
ODS RTF FILE="C:\temp\example.rtf" style=journal;
PROC REPORT DATA=class2 NOWINDOWS HEADLINE MISSING style(column)={asis=on}; column text age height weight;
RUN;
ODS RTF CLOSE;
可用以下代码来创建根据前导空格数进行缩进的程序:
ODS RTF FILE="C:\temp\example.rtf" style=journal;
PROC REPORT DATA=class2 NOWINDOWS HEADLINE MISSING;
COLUMN text age height weight;
DEFINE sex / GROUP noprint;
COMPUTE text;
spacediff = rxmatch(rxparse("^' '"), text) * 70;
IF spacediff > 70
THEN CALL DEFINE(_col_, "Style",
"STYLE=[cellwidth=3cm
pretext='^R/RTF""\keepn\li" ||
compress(spacediff) || " ""']");
ENDCOMP;
RUN;
ODS RTF CLOSE;
图5: 缩进示例
解释一下最后一个例子,我们一开始先用一个规则表达式求出了前导空格数。
这个数又乘以一个常数。
在本例中选用70作为宽度因为这是Times New Roman体的10号字空格的典型宽度。
当存在前导空格时,这一行会按计算值(pretext)进行缩进。
然而,SAS在计算列宽时不会算入缩进值。
因此宽度需要手动设置以避免不当断行。
4.后处理
后处理是指对RTF文档设计进行可能的优化的最后一个步骤。
所有前期未能体现的特征均可在后处理步骤中产生。
以遇到重复标题进行自动编号的过程为例,这里有一个问题,该过程可能存在重复的字段函数,为同一个表格编了两个号码。
无论在使用page变量或为表格规定宽度时,同一个表格都会被分成几个不同的表从而出现上述问题。
在后处理步骤中这些重复的标题可被删除或可用引用的最后字段替换自动编号的字段。
另外一个值得注意的地方是,在使用BODYTITLE 语句时,SAS会自动为新建的表格创建一个标题行一个注脚行,有时会引起一些问题。
而这两行可以通过一个简单的数据步删除。
此外,分页符有时不太好用;ODS RTF STARTPAGE=NOW语句常常无法运行。
此外,当表格太宽太分散时,SAS不会内嵌分页符,只能在后处理中设置。
后处理如何执行并不重要。
使用数据步和编程语言PEARL即可满足程序的需要,此外还可以运用微软文字处理软件所需的脚本语言VB。
最重要的地方是执行的效率,对方法的认知和结果的稳定性。
结论
运用前述提到的方法结合直接RTF命令和后处理过程对ODS进行操作可以实现RTF的全部过程。
ODS系统提供了很多简单实用的基本功能。
在进一步的发展中,我们渴望新功能的实施以减少需要进行的特殊处理。
值得注意的是,ODS MARKUP中RTF的标签集的一个大优点是不会在每一个报告中使用特殊标签而是在默认标签集中包含了这些特殊标签。
在SAS9.2版本中我们将会知道这个功能是否灵活好用。
总的来说,SAS中有不同复杂度,不同范围且灵活的操作可用于RTF布局。
首先,尽可能用ODS RTF来实现操作。
源代码应是明白易懂的。
接下来,缺失的功能应尝试给出直接RTF命令来实现。
如果这样还不能解决问题,最后一步才是后处理。
因为后处理程序可能非常复杂,所以应尽量少使用后处理。
在SAS系统中灵活使用这三步可以实现一切过程。
参考文献
[1] Lauren Haworth [2004] …SAS with Style: Creating your own ODS Style Template for RTF Output”, SUGI 29 –Paper 125-29,
[2] SAS Support –“ODS FAQ and Conce uochengpts –The RTF Destination”
[3] SAS 9.3.1 Online documentation, “Concepts: REPORT Procedure”
[4] Rich Text Format (RTF) Specification, version 1.6, Microsoft MSDN
[5] Steve Prust [2005] “Experiences of using ODS : moving from ASCII to RTF output“, PHUSE 2005 –Paper TS06
[6] SAS Support –“Experimental RTF Features in SAS 9.1”
[7] Lauren Haworth [2005] …Applying Microsoft Word Styles to ODS RTF O utp ut”, SUGI 30 – Paper 043-30
[8] Elizabeth Axelrod, David Shamlin [2004] …Skinning the Cat This Way and That: Using ODS to Create
Word Documents That Work for You”, SUGI 29 – Paper 084-29 -
[9] Wayne Hester [2006] “Teaching Your RTF Tagset to Do Clever Tri c ks” – SUGI 31 – Paper 067 – 31
联系方式
欢迎提出宝贵的意见和问题。
以下地址可联系到作者:
先灵医药Sellerstr.31 13342 柏林
所涉及的品牌和产品名称均属于其相应公司。