2015-09-20 54 views
3

我偶爾會涉及postscript,它是我喜歡的一種古怪的語言,但我遠離專家。Postscript - 案例陳述的替代方法

爲了生產圖所示:

enter image description here

我已經寫了一些代碼,看起來像這樣:

% fontsize on stack 

    label (Up) eq 
    { /Symbol exch selectfont (\255) show } 
    { label (Down) eq 
     { /Symbol exch selectfont (\257) show } 
     { label (Left) eq 
     { /Symbol exch selectfont (\254) show } 
     { label (Right) eq 
      { /Symbol exch selectfont (\256) show } 
      { label (bs) eq 
      { /Symbol exch selectfont (\254) show } 
      { /Helvetica exch selectfont 
       label length 3 lt 
       { label show } 
       { 
        label (/)    % (page/up) (/) 
        search     % (up) (/) (page) true 
        {      % (up) (/) (page) 
        /Helvetica keyHeight 4.6 div selectfont 
        3 1 roll    % (page) (up) (/) 
        pop     % (page) (up) 
        currentpoint   % (page) (up) 438 745 
        3 2 roll    % (page) 438 745 (up) 
        show     % (page) 438 745 
        moveto    % (page) 
        0 keyHeight 0.25 mul % (page) 0 11 
        rmoveto    % (page) 
        show }    % 
        { show } ifelse 
       } ifelse 
      } ifelse 
      } ifelse 
     } ifelse 
     } ifelse 
    } ifelse 
    ... 
    (End)key (Page/Down)key 0.5 gap (7)(Home)key2 (8)(Up)key2 ... 

我不喜歡嵌套的if語句和重複,但它第一次快速刺入解決方案。我的第一個想法是我會用另一種語言使用case語句。對於Postscript,我想我應該爲這些標籤名稱對和相應的八進制字符代碼選擇合適的數據結構。也許是一個嵌套數組。

[ [(Up) (\255)] [(Down) (\257)] ... ] 

但我不確定我怎麼會遍歷這個,仍然優雅跟蹤我是否需要在沒有名字匹配執行默認過程。

有沒有一個很好的習語我可以遵循?

+1

可悲的是,我從我的辦公桌前的那一刻,如果你檢查comp.lang.postscript檔案,你應該找到一些帖子出現在這個問題上(從我或luser楚格設計查找代碼,如果我沒記錯的話) 。否則,當我回家時,我會在這裏張貼一些東西。 – KenS

回答

3

好吧,現在我回到我的辦公桌。如果你看一看2001年4月的PostScript技術雜誌,你會看到John對如何使用詞典實現case語句的清晰描述。我認爲這比使用數組有兩個主要原因要好,首先是簡單添加默認情況的能力,其次是「獲取」和「已知」運算符(正如約翰指出的那樣)通常會高度優化PostScript解釋器,因爲它們被非常頻繁地使用。

+0

基於'case'的字典看起來非常適合我的需求!也感謝您向我介紹Acumen培訓雜誌。 – RedGrittyBrick

2

您可以爲您的具體使用情況採取的另一種方法是定義組合字體。它看起來大部分文本都在Helvetica中顯示,但是從Symbol中借用了少數幾個文本。 example program here顯示您可以選擇一種字體並在自定義Type-3字體的BuildChar過程中使用它。它可能仍然需要一個case語句來實現,但讓實際應用程序的使用更好。

這是草稿。

%lo-font threshold hi-font . <<derived font>> 
/splitfont { 
    4 dict begin {hi-font threshold lo-font}{exch def}forall 
     /width .9 def 
    (<< 
     /FontType 3 
     /FontBBox [ 0 0 //width 1 ] 
     /FontMatrix matrix 
     /Encoding StandardEncoding % Lying to the postscript interpreter 
     /BuildChar { 
      %//width 0 0 0 //width 1 setcachedevice 
      dup //threshold lt 
       { //lo-font }{ //hi-font } ifelse 
      1 selectfont 
      (?)dup 0 4 3 roll put 
      dup stringwidth 
      setcharwidth %2 index false charpath pathbbox setcachedevice 
      show 
      pop 
     } 
    >>) cvx exec 
    end 
} def 

/Helv+Symb /Helvetica 8#254 /Symbol splitfont definefont pop 

/Helv+Symb 20 selectfont 
100 100 moveto 
(Text in Helvetica + \254\255\256\257) show