PostScript

図書館へ行ったら、運よくニュートン誌が有った。なかなか人気みたいでいつも貸し出し中なん だけどね。年間購読もipad版が用意されてたりして、これなら読んだ後の処分にも困らない から良いと思うんだけど、そういう無駄使いはやめて、運を天に任せるのさ。それが、貧乏年寄りの生活の知恵。(株や馬をやって儲けろと言うのは、ピーピーな人をまじかに見ているので、却下)

で、光の量子論ですって。光は波か粒子かと言う一大論争。結論を書いてしまうと、決着は ついていない。

昔々、ある所にホイヘンスさんという有名な物理学者兼発明家がおられたそうな。彼は、光の性質である、直進、屈折、反射に注目した。そしてこれらの性質が、光が波であると仮定すると 上手く説明出来ると訴えた。

それに対して、ニュートンさんは、光は粒子だよ説を唱えて反論。多くの科学者は彼の粒子説を 支持した。なんてったって、彼はブランドですからねぇ。彼の名声を高めたニュートン力学を 使えば、粒子の運動と言う事で上手く説明出来るとした。

でも波説も負けてはいない。有名なスリット実験。2つのスリットを通った光が干渉して 明るい所と暗い所が出来るでしょ。これ、粒子説じゃ上手く説明出来んよ。なお、この干渉 の応用として、現代では、ノイズキャンセリング・イヤホンとかに応用されてる。ノイズの 逆相を加えれば、ノイズは消えるでしょってあれだ。なんと言っても、音は波だからね。

アインシュタインさんが、光電効果(光を充てると電子が飛び出してくる性質)を研究の末、 光が粒子だとするとうまく説明出来るよ説を発表。

彼が言う粒子ってのは、凡人が思い浮かべるような砂粒みたいなものではない。エネルギー的に これ以上分解出来ない単位の事を、光子と呼び、比喩的に粒子って言ったまでだ。 で、難しい量子力学が発展していくんですなあ。(と、凡人は高みの見物。なんてったって、 シュレーディンガー方程式に挫折しましたから)

で、確率解釈とかが出てきて、アインシュタインはあの有名な言葉『神はサイコロを振らない』が誕生。

どうも、光は観測してない時は波としての性質を持ち、観測した途端に粒子の性質が現れるって 言う2面性を持ってるみたい。なんだけど、確率解釈以外の解釈方法はないのかと、物理学者は、脳に汗をかかせて計算してるようです。

【誰でも分かる】「量子力学」ってなんなの? 詳しい人に聞いてきた【入門編】

中学レベルの数学で量子テレポーテーションを理解してみよう

以上、無料で仕入れた、最新科学知識でした。

gnuplotはpostscriptの実行機械

昔の記憶では、gnuplotで色々なファイル形式を出力出来たはず。仕事でお世話になったのは PNGでの出力。だって、グラフをWebに載せる一直線な方法だもの。cronで回して、1時間間隔で、温度とか湿度のグラフを更新して、ドヤ顔してたな。IoTの先取りをとっくの昔にして ましたよ。

で、色々なファイル形式の一部に、psってのが有った事を覚えている。論文に載せるグラフは この方法で採取すると、後で加工(端的に言うと、改変、ねつ造)するのに便利ですって説明を 何処かで読んだ事がある。何処かの誰かさんみたいに、画像を切り貼りすると、そこから足が ついちゃうけど、psで処理すればそんな心配は無用です。

psってのが、どんな物かを知った今、これに手を染めない訳にはいかないだろう。 軽くググったら、超伝導を研究されてる物理屋さんの所を勧められた。

論文に使えるグラフを作る(その1)

オイラーもやってみる。

gnuplot> set terminal post
Terminal type set to 'postscript'
Options are 'landscape noenhanced defaultplex \
   leveldefault monochrome colortext \
   dashed dashlength 1.0 linewidth 1.0 butt noclip \
   nobackground \
   palfuncparam 2000,0.003 \
   "Helvetica" 14  fontscale 1.0 '
gnuplot> set out "aa.eps"
gnuplot> plot sin(x)/x

set terminal で、出力形式をpostscriptにする時、色々設定出来るようだけど、今回は デフォルトを使う。出力ファイル名を指定してから、プロット。出力が直接ファイルに行くので X環境が無くても実行出来る。(だから、cronで手軽に回せるのだ)

後は、gvで一応確認。見栄え宜しく表示されました。くどいようですが、ファイルはテキスト ファイルになってますんで、改変は容易ですよ。

emacsでpostscriptの実験

とは言え、どこをつついたらどうなるってのを知らないと、思うようにはなかなかいかないでしょう。

そこで、editorで改変もとえ修正 -> gvで確認 -> editorで改変 と言うサイクルを 回す必要があります。

取り合えず、emacsで開いてみたら、psファイルってのを自動認識してくれて、PostScriptモードになってくれました。ここから、gvを起動出来ればいいんだけど、DocViewってのが からんでいるのかな。C-c C-c すればいいよなんて案内が出てくるんだけど、希望通りには 行きません。

そこで、オイラーは無い知恵を絞った。

PostScriptのGNU互換機は、GhostScript。これって、お絵描き出来るForth、アドビ方言だよね。 猫でもわかるPostScriptとPDFの昔話に、アドビの生い立ちが出てたぞ。

そんな事よりこれって、プログラミング言語だよね。ソースを閲覧しててインタープリターを起動 するってのは、emacsでの王道な使い方。きっと手が有るはず。

ぐぐってみたけど、emacsでPDFに変換するとかプリントするってのが、よくある世間の使われ方みたい。 オイラーみたいな考えを持った人は居ないかなとしつこく探しましたよ。 そして見つけたのが、 Emacs で GhostScript(PostScript)というやつ。

C-c C-sでgsを呼び出せるとな。

-=U-:----F1  aa.eps         Top (1,0)      (PostScript DocView) -------------
gs -dNODISPLAY
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>

やってみたら、DISPLAY無しで起動した。仰せに従って、ps-run-x にgsを設定しても、相変わらずのNODISPLAY。こうなったら、ps-run-xがどういう使われ方をしてるか調べてやれ。 場所は、/usr/local/share/emacs/25.1/lisp/progmodes/ps-mode.el.gz

(defcustom ps-run-x '("gs" "-r72" "-sPAPERSIZE=a4")
  "Command as list to run PostScript with graphic display."
  :group 'PostScript-interaction
  :type '(repeat string))

(defcustom ps-run-dumb '("gs" "-dNODISPLAY")
  "Command as list to run PostScript without graphic display."
  :group 'PostScript-interaction
  :type '(repeat string))

ふむ、どうやら、使う人に合わせて馬鹿モードが選ばれている風。(飼い主に合わせて、道具は 進化するんか)でも、何処かにこれを選択してる場所が有るはず。

(defun ps-run-start ()
  "Start interactive PostScript."
  (interactive)
  (let ((command (or (and window-system ps-run-x) ps-run-dumb))
    :

ふむ、X Window好きな人とCUI好きな人で、より分けている。勿論、オイラーのemacsはnox11を使ってるんで、馬鹿モードなんだな。そうと分かれば、ここを改造する? そんな馬鹿丸出しの原始人ではありません。スマートに、init.elに

(setq  ps-run-dumb '("gs" "-r72" "-sPAPERSIZE=a4"))

して、emacsをだましてしまいましょう。思わず setq しちゃったけど、これで定義するやつはdefcustomより強いのね。そうでなければ、emacs起動時に読み込まれたinit.elの設定は、ps-modeを呼び出した時にパッケージ内の設定で上書きされちゃうものね。

心配なので一応ぐぐっておく。 ファイルのロードとホック - 環境設定のための Emacs Lisp 入門とか、 defcustomで定義された変数はsetqではなくcustom-set-variablesで設定すべき理由なんというか、ぐちゃぐちゃしてるな。歴史ある構造物は、こうなるのが定め。エントロピー増大は必然です。

これで、

gs -r72 -sPAPERSIZE=a4
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>(aa.eps) run
Loading StandardSymL font from /usr/local/share/ghostscript/9.07/Resource/Font/StandardSymL... 3420168 1949502 4338072 3048101 1 done.
Loading NimbusSanL-Regu font from /usr/local/share/ghostscript/9.07/Resource/Font/NimbusSanL-Regu... 3420168 2000975 4358256 3067160 1 done.
>>showpage, press <return> to continue<<

GS>

グラフは、横長に書かれていた。90度回転した状態で表示されちゃたぞ。調べてみると、 set terminalのpostscriptだけだと、landscape(横置き)がデフォだった。それに色も 付いていない。不満が有るなら、オプション設定しろとな。

gnuplot> set terminal post portrait color

portraitってよく聞くけど、縦置きって意味なのね。知らんかったわい。

ファイルの前半には便利な関数が多数設定されてました。実習でやったはずなんだけど、3分で 忘れるくちなんで、あわてて Postscript プログラミングメモ なんてのを見ている。

;; ps-mode
;; C-c C-v : ps-run-boundingbox
;; C-c C-u : ps-mode-uncomment-region
;; C-c C-t : ps-mode-epsf-rich
;; C-c C-s : ps-run-start
;; C-c C-r : ps-run-region
;; C-c C-q : ps-run-quit
;; C-c C-p : ps-mode-print-buffer
;; C-c C-o : ps-mode-comment-out-region
;; C-c C-k : ps-run-kill
;; C-c C-j : ps-mode-other-newline
;; C-c C-l : ps-run-clear
;; C-c C-b : ps-run-buffer

ps-modeには色々な関数が定義されてるけど、オイラーが使うのは、4つだけ。C-c C-s で、gsを走らせる。次に、C-c C-bで描画してみる。それが気にいらなければ、C-c C-l の消しゴムで消す。 コードを書き直して、また、C-c C-b -> C-c C-l の繰り返し。飽きたら、 C-c C-qで終了。

postscript

POSTSCRIPT TUTORIAL and COOKBOOK これ、本家が出している、トレーニング本。巻末にあるオペレーター (手続きと言うか関数の事を専門用語でこう呼ぶとか)が便利。

ちょいと例を書いてみた。xx cmって書くと、cm単位で数値を指定出来る。ふつうは、1インチを72に分割した、印刷業界の単位。

/cm {28.346 mul} def

72 72 moveto
10 cm 0 rlineto
0 10 cm rlineto
0 10 cm sub 0 rlineto
0 0 10 cm sub rlineto
stroke
showpage

これ、4角形を書く、カメさんの軌跡。左とか下に移動する時は負数にするんで、0から引き算 するという愚行をやってる。もう少し、上下左右のオペレータを定義すると、LOGOになるな。

この cm ってオペレーター、Haskellで言う部分適用の見える化を体現していますなあ。 mulってオペレータは、掛け算を実行する。但し定義の中で、引数を一つしか取っていない。 もう一つの引数は、このオペレーター cm を使う時に供給する。

そんじゃ、gnuplotが出力した本式のepsファイルを見て行く。 冒頭付近で興味をそそるのは、

%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 50 50 410 302

この範囲の中にグラフを押し込んでいるんだな。ポイントで言われてもピンとこないな。

> (define mm (/ 72 25.4))
> mm
2.834645669291339
> (/ (- 410 50) mm)
126.99999999999999

逆ポーランド法のpostscriptを使ってて、前置法のschemeが出てくるとは、これいかに? まあ、どちらが体に染み付いているか、これで明確でしょう。 一ポイントは、約2.8mmです。後はそれを使って演算。約13cmX9cmぐらいの描画範囲ですか。

/ClipToBoundingBox false def

/doclip {
  ClipToBoundingBox {
    newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath
    clip
  } if
} def

CliptoBoundingBox ってのがtrueだと、doclipが有効になるのか。

/M {moveto} bind def
/L {lineto} bind def
/R {rmoveto} bind def
/V {rlineto} bind def
/N {newpath moveto} bind def
/Z {closepath} bind def
/C {setrgbcolor} bind def
/f {rlineto fill} bind def
/g {setgray} bind def

よく使う名前は1文字の短縮形を定義してるのだな。ソースレベルで圧縮って、gzだかlhaだかの基本テクニックと思われ。 その後、色だとかパターンだとかの定義がぐちゃぐちゃ続いていて、萎えるなあ。

/SDict 10 dict def
systemdict /pdfmark known not {
  userdict /pdfmark systemdict /cleartomark get put
} if
SDict begin [
  /Title (aa.eps)
  /Subject (gnuplot plot)
  /Creator (gnuplot 4.6 patchlevel 6)
  /Author (sakae)
    :
  /DOCINFO pdfmark
end
} ifelse
end

こんな情報まで、埋め込まれているみたいだぞ。問題ある人は、取り除いておけ。

%%Page: 1 1
gnudict begin
gsave
doclip
50 50 translate
0.050 0.050 scale
0 setgray

長い長いPrologが終わって、やっとページの表示に取り掛かります。紙の端じゃ見栄えが悪いので、原点をちょいとずらしてます。倍率もぐっと落としてます。その分、以下で使われる 座標位置には、大きな数値を使って、微妙な機微を表現しようという作戦みたいですね。

1.000 UL
LTb
LCb setrgbcolor
462 280 M
63 0 V
6422 0 R
-63 0 V
378 280 M
(-10) Rshow

軸値をまず書いておこううという事ですか。その後、軸を書き、いよいよ終盤戦突入

% Begin plot #1
1.000 UL
LT0
LC0 setrgbcolor
/Helvetica findfont 140 scalefont setfont
LCb setrgbcolor
6296 4738 M
(x) Rshow
LT0
6380 4738 M
399 0 V
462 280 M
66 46 V
65 47 V
66 46 V
65 46 V
:
66 46 V
% End plot #1
stroke

グラフ内に、凡例を書き、続いて折れ線グラフのデータ(今回は直線です)を、がーと 書いています。

see gnuplot source

どこかHPで、gnuplotをpostscriptモードで出力した時のPrologに出て来るオペレーター群の 説明書がソース中のdocに入っているよとの情報を載せていた。これはもう見る鹿。 OpenBSDでソースを取り出しみたら、doc/psdoc/ps_file.doc ってのがそれだった。

ちょっとオイラーの所で出てくるものとは違ったけど、参考になりますだ。実際のページは、 y軸の処理をしてからx軸の処理、それから凡例の処理という具合に進行してくのね。

ああ、docの中には、日本語の解説書も置いてあるぞ。1992年にfj.sourcesに投稿された 翻訳記事が、先人達によって引き継がれ、本家にマージされているんだな。先輩諸氏に 感謝ですよ。

term/Postscript/prologue.psに置いてあるやつが、現場でpsファイルの冒頭に置かれる んだな。これだけで、375行ある。この後ろにページデータが連結されるんだ。納得です。

termなんてdirが有るな。これはterminalか。

gnuplot> help term
 Gnuplot supports a large number of output formats. These are selected by
 choosing an appropriate terminal type, possibly with additional modifying
 options. See `set terminal`.

 This document may describe terminal types that are not available to you
 because they were not configured or installed on your system. To see a list of
 terminals available on a particular gnuplot installation, type 'set terminal'
 with no modifiers.

Subtopics available for term:
    cairolatex        canvas            cgm               context
    corel             dumb              dxf               eepic
    emf               emtex             epscairo          epslatex
    fig               gif               gpic              hp2623a
    hp2648            hpgl              imagen            jpeg
    latex             mf                mif               mp
    pcl5              pdfcairo          png               pngcairo
    pop               postscript        pslatex           pstex
    pstricks          push              qms               regis
    svg               tek40xx           tek410x           texdraw
    tgif              tkcanvas          tpic              vttek
    x11               xlib              xterm

出力フォーマットを色々選べる。そうか、グラフは仮想的に書いておいて、それをユーザー 要求に合わせて、png欲しいとかgifで欲しいとか今回やったようにpostscriptで欲しいとか 選べるんだな。だから、オイラーみたいにGUIの無い環境で暮らしていても、グラフを 描けるとな。

面白いのは、luaのサポートが有ったりcanvasとjsがつるんでhtmlに描けたりする事ですかね。 dumbは通好み?

 Example:
       set term dumb size 60,15
       plot [-5:6.5] sin(x) with impulse

            1 +-------------------------------------------------+
          0.8 +|||++                   ++||||++   sin(x) +----+ |
          0.6 +|||||+                 ++|||||||+                |
          0.4 +||||||+               ++|||||||||+               |
          0.2 +|||||||+             ++|||||||||||+             +|
            0 ++++++++++++++++++++++++++++++++++++++++++++++++++|
         -0.2 +        +|||||||||||+              +|||||||||||+ |
         -0.4 +         +|||||||||+                +|||||||||+  |
         -0.6 +          +|||||||+                  +|||||||+   |
         -0.8 +   +       ++||||+   +       +        ++||||+  + |
           -1 +---+--------+--------+-------+--------+--------+-+
                 -4       -2        0       2        4        6

よくやるよ。