BookmarkSubscribeRSS Feed
KarlK
Fluorite | Level 6
I'll apologize in advance for the length of this post, but it's mostly just a sample program, so I hope that's allright.

I need to produce tables with a very specific set of attributes to keep
the brand people happy. The specs I'm having trouble with concern
thickness of borders, and are as follows:

1) thick (3px) vertical borders between the columns and on the right of the
table
2) thick horizontal borders between column header and rest of table and on
the bottom of the table
3) thin (1px) horizontal borders between the rows
4) no border at all on top of the table (horizontally), and and on the
left of the table (vertically).

I've made a style sheet with proc template that works fine for the HTML
destination (in IE8 and Firefox 3.5), but does not work for the PDF or RTF
destinations. Specifically, for RTF, all the rules are the same width
(looks to be 1px). For PDF, all rules are thick except the bottom
horizontal rule, which is thin, plus I've got a thick rule on the top and
the left which shouldn't be there at all.

Are there any style gurus who might point me in the right direction to
produce a table that meets the specs in all 3 destination? I have included
a sample program which should run as is, in Sas Win (XP) 9.2 (TS2M0).
Thanks in advance.

* * * * Sample program starts here * * * *;
proc template;
define style Styles.KKtest;
parent = styles.printer;

style table from output /
frame = below
bordercollapse = collapse
borderspacing = 0
borderwidth = 3px
bordercolor = #AAC1D9
;
style column from table /
borderrightwidth = 3px
borderrightcolor = #AAC1D9
verticalalign = middle
textalign = center
;
style header from column /
borderbottomwidth = 3px
backgroundcolor = #3399FF
fontweight = bold
;
style data from column /
borderbottomwidth = 1px
;
end;
quit;

ods listing close;
ods noproctitle;
ods pdf file="c:\temp\kktest.pdf" style=kktest;
ods rtf file="c:\temp\kktest.rtf" style=kktest;
ods html file="c:\temp\kktest.html" style=kktest;

title;
proc report data=sashelp.class(obs=5) nowd split="*";
column name sex age height weight;
define name / order style(header)={backgroundcolor=white} "Upper Left*Header";

compute name;
* highlight alternate rows;
n+1;
if mod(n,2) eq 1 then call define(_row_,'style','style={background=#FFFFCC}');
* left align data but keep header centered;
call define(_col_,'style',"style={textalign=left}");
endcomp;
run;

title;
ods _all_ close;
ods listing;
5 REPLIES 5
Cynthia_sas
SAS Super FREQ
Hi:

Here's the thing....HTML=browser; RTF=word processor; PDF=portable document file (sort of printer-image)...all different in concept. And sadly, the borderwidths are internally generated differently for each of them.

For ODS HTML, your style template is converted to CSS style properties and the CSS is embedded in the HTML file as an in-line style section. This is an inherently different method of drawing borders than what is used by ODS RTF and ODS PDF. If you think of a word processor, the border lines are controlled by word processor methods and you might not be able, in RTF control strings to generate the full range of border types/lines/thicknesses as you can in HTML. For another thing, the HTML measurements are generally in pixels, while for RTF, all the measurements are internally converted to TWIPS (twentieths of a printer's point) -- so 1 px in HTML might not translate to -exactly- the same thing in TWIPS when the word processor gets done rendering the RTF; and the PDF file is meant to be an image of what would get sent to a printer -- only in a file format. Printers don't measure in pixels, they generally measure in PT (points).

So right away, you're going to have issues coming up with 1 template to rule them all. I think your best bet is to work with Tech Support because you'll need to come up with 3 separate style templates, one for each destination. Impacting how you write your style templates will be whether you are using SAS 9.1.3 or SAS 9.2, as the syntax will be different for these 2 versions of SAS. Also impacting your template will be whether you can use the bordertopxxx/borderbottomxxx/borderrightxxx type attributes for all your destinations.

I generally find that only the simplest of templates will work in all 3 destinations and by simple I mean that I'm changing the header colors or something. Generally, I find it better to draft a template specific to a destination because of the differences mentioned above.

Tech Support will be your best resource for this question, in my opinion.

cynthia
KarlK
Fluorite | Level 6
Cynthia, a concise and erudite reply, from someone whose writings have consistently increased my knowledge of ODS. I am most grateful. You clearly recognized that I am most comfortable in the XHTML/CSS world, where my template works fine. May I ask one follow-up?

I'm using 9.2, and my reading of the ODS manual has convinced me that the borderXXXwidth attribute (where XXX=top, bottom, right, left) should work in HTML, RTF and PDF. Given that my template works just fine in HTML (and, I would add, when I send my HTML doc through adobe acrobat to convert to PDF, it also looks fine), I might just need to play around with the units of measurement (pixels, points, ems or whatever) and the thicknesses of the lines. Does that seem reasonable, or do you think my logic needs to be fundamentally adjusted, depending on output destination?

I will take you advice and work with Tech Support. Some of us guys just have a hard time asking for directions 🙂
Cynthia_sas
SAS Super FREQ
Hi, Karl:
Now the time has come, (the walrus said) to speak of many things, of sailing ships and sealing wax and cabbages and kings...( sorry, I couldn't resist. I'm a big fan of Alice in Wonderland and Lewis Carroll).

But, in fact, there are many things to say about style attributes and most of what can be known about style attributes and where they can be used is found in the documentation topic entitled, "Style Attributes and Their Values"
http://support.sas.com/documentation/cdl/en/odsug/61723/HTML/default/a002972093.htm

So, your time has come to bond with that documentation information. So the answer to your question is yes...and no. You can probably come up with separate RTF and HTML and PDF templates and fiddle with borderxxxwidth to get what you want in those destinations -- as far as borderxxxWIDTH is concerned.

If you look up your attributes of interest, as for example, BorderBottomWidth, you will find this in the doc:

BORDERBOTTOMWIDTH=dimension
specifies the width of the bottom border of the table.

Restriction: The BORDERBOTTOMWIDTH= attribute is valid only in markup family destinations, RTF destination, printer family destinations, and the Measured RTF destination.


whereas, for a different attribute, it says:

BORDERBOTTOMSTYLE= line-style
specifies the line style of the bottom border of the specified cell.
.... more documentation ....
Restriction: The BORDERBOTTOMSTYLE= attribute is valid only in markup family destinations, RTF destination, and the Measured RTF destination.


Note, that BorderBottomWidth is supported in HTML, RTF and PDF, but that BorderBottomStyle is only supported in HTML (markup family) and RTF.

The YES is that you can probably come close to what you want in the 3 separate destinations by fiddling with width dimensions for those destinations where your attribute of choice is supported. The NO is that an attribute like BorderBottomStyle won't work for Printer Family destinations and so you may end up with a slightly different template for PDF than for RTF and/or HTML -- if you were going to attempt to use any of the attributes that are RTF or Markup Family only.

Even when I use the CSSSTYLE= option to specify a CSS sheet for RTF and PDF (this is a new feature in 9.2), the place where I notice the most difference between standard HTML/CSS and RTF and PDF used with CSS is in the cellpadding and border lines. This is what caused me to suggest that you work with Tech Support -- because there may end up being some inherent differences that you will just have to live with.

And rather than get frustrated or get lost by not asking for directions, Tech Support folks can get you started in the right direction to achieve the best look in all 3 destinations.

cynthia
KarlK
Fluorite | Level 6
Thanks, Cynthia. Will do.

* * * Remainder is OT * * *

Lewis Carroll fan, eh? I just got back from seeing Tim Burton's movie. Loved it, but the famous line you referenced was not in it, unfortunately.

>> 1 template to rule them all <<
A J.R.R. Tolkien fan, as well, apparently.
Cynthia_sas
SAS Super FREQ
...yes, what can I say... I was a Lit major before my career as a SAS programmer/teacher so I never miss an opportunity to work a lit reference into the conversation. One of my favorite word frequency example programs is the one I used to parse the first chapter of Melville's "Moby Dick" (after I got the first chapter into a SAS dataset):
http://support.sas.com/forums/thread.jspa?messageID=13656㕘

cynthia

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 5 replies
  • 3768 views
  • 0 likes
  • 2 in conversation