標籤:

PaddingRight=

有的時候,在RTF output中的一列里我們既需要展示居中對齊的內容,又需要展示左對齊的內容。比如下面的例子(一個簡化的demographic table)

我們使用居中對齊來實現這個table(因為看上去這種方式更加簡單)。對於下面需要左對齊Race,我們使用使用恰當的前導空格(leading blank space)來實現對齊。但是這裡面有一個問題,Placebo組的Race>OTHER是0,由於0後面沒有其他數值所以增加前導空格只會讓他更靠右。

一個比較簡單的辦法是,在0後面增加不可見的字元,比如排版空格(ASCII字元A0)就是一個不錯的選擇。然而,有的時候可能由於種種原因,我們無法選擇這個字元。那麼有沒有其他的辦法呢?

有!我們先把這個問題簡化(以及一般化):使用居中對齊的方式,讓兩個長度不同的字元串在RTF的output中看上去像是左對齊。先來構造一個數據集:

data test;n length a $200;n a = 123;n output;n a = 123123456;n output;nrun;n

數據集test裡面只有一個變數a,有兩個值,一個是字元串「123」,一個是「123123456」。第二個值比第一個多6個字元。這裡的方法利用了paddingright這個style attribute,先看code:

ods rtf file=/folders/myfolders/padding/padding.rtf stylex=rtf;nnproc report data=test nowd style(report)=[width_=100%];n column a padding;n define a / style(column)=[just=c padding=0 font=("Courier", 10pt)];n define padding/noprint;nn compute a;n if a = 123 then do;n call define(a, style, stylex=[paddingright=35pt]);n end;n endcomp;nrun;nnods rtf close;n

RTF的路徑怪怪的是因為我在使用SAS University Edition. 在define語句裡面我們把a的對齊定義為居中。然後compute語句裡面,我們對「123」這個值利用call define語句重新定義style。paddingright的值給定的是35pt,結果如下:

ok,大功告成。接下來是自問自答的環節。

1. 為什麼是35pt?顯然我們關心這個數字的來歷,以便於我們使用同樣的方法處理其他的情形。在我們的例子裡面,第二行的字元串比第一行的字元串多6個字元,那麼我們需要利用padding製造6個字元的寬度。那麼6個字元的寬度是多少呢?這個和字體和字型大小都有關係。一般而言我們在生成統計報表中都使用所謂的「等寬字體」,比如這裡的「Courier New」。(對於英文而言)通俗的講等寬字體就是所有的字母和標點符號佔用一樣的寬度,字母w和字幕i一樣寬 -- 這是所有對齊方法的基本前提。對於等寬字體而言,高寬比(aspect ratio)是固定的。對於這裡的courier new而言它近似是0.5。因此,6個10pt字元的寬度是30pt。(順便提一句,我們定義字體大小的時候都指的是字體的高度,因為對於非等寬字體而言,字體寬度是沒有辦法統一規定的)。如果你嘗試在上面的例子把30pt給paddingright的話,你會發現結果是這樣的:

看上去還差一點。對於這額外的5pt我也是找了很久,最後在RTF的specification裡面找到答案了:

cellxN是用來指定table中單元格右邊界,按照RTF specification的說法,它的值包含了半個空格的寬度。我們在sas生成的RTF中可以看到它的身影(第二行最右側):

在當前字體字型大小下,半個空格的寬度剛好是5pt。

因此,總結一下我們可以嘗試給這個paddingright的值一個公式:

(兩個值長度的差/2 + 0.5) * 字型大小n

2. 既然我們有公式了,能不能不要在proc report當中出現這些magic number了?當然可以!我們把上面的例子改寫

data test;n length a $200;n a = 123;n padding=35pt;n output;n a = 123123456;n padding= ;n output;nrun;nnods rtf file=/folders/myfolders/padding/padding.rtf stylex=rtf;nnproc report data=test nowd style(report)=[width_=100%];n column a padding;n define a / style(column)=[just=c padding=0 font=("Courier", 10pt)];n define padding/noprint;nn compute padding;n if ~missing(padding) then do;n call define(a, style, stylex=[paddingright=35pt]);n end;n endcomp;nrun;nnods rtf close;n

推薦閱讀:

漫談SAS Macro (3) - Macro Quoting, Part I
ORDER=DATA in PROC REPORT
SAS 是一個什麼樣的公司,為什麼常年位於最佳僱主前幾名?
SAS入門指南
sas界面為什麼那麼丑?

TAG:SAS |