后记 - 案例陈述的替代方法

时间:2015-09-20 09:08:06

标签: postscript

我偶尔会涉及附言,这是一种我喜欢的古怪语言,但我远非专家。

制作这样的图表:

enter image description here

我写了一些看起来像这样的代码:

(function (angular) {


    var AuthenticationService = function($http, $cookieStore, $rootScope, $timeout, UserService) {
        var service = {};

        service.ClearCredentials = ClearCredentials;




        function ClearCredentials() {
            $rootScope.globals = {};
            $cookieStore.remove('globals');
            $http.defaults.headers.common.Authorization = 'Basic ';
        }
     return service;
    }



    AuthenticationService.$inject = ['$http', '$cookieStore', '$rootScope', '$timeout', 'UserService'];
    angular.module("app.AuthenticationService").factory("AuthenticationService", AuthenticationService);

})(angular);

我不喜欢嵌套的if语句和重复,但它是第一个快速尝试解决方案。我的第一个想法是我用另一种语言的案例陈述。对于Postscript,我想我应该为标签名称对和相应的八进制字符代码选择合适的数据结构。也许是嵌套数组。

  % 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 ...

但是我不确定如何迭代这个并且仍然优雅地跟踪我是否需要在没有名称匹配时执行默认过程。

我能遵循一个好的习语吗?

2 个答案:

答案 0 :(得分:3)

好的,现在我回到我的办公桌前。我自己不是回答这个问题,而是让我指出一个优秀的资源,John Deubert的Acumen Training Journal

如果你看一下2001年4月的PostScript技术期刊,你会看到约翰关于如何使用词典实现案例陈述的清晰描述。我建议这比使用数组要好两个主要原因,首先是简单添加默认情况的能力,其次是'get'和'known'运算符,正如John指出的那样,通常在PostScript解释器,因为它们经常使用。

答案 1 :(得分: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