PostScript の基本知識

PostScript は Adobe 社が開発したプリンター制御言語(PDL)で,業界の標準となっている高性能なソフトウェア言語です。その PS ファイルはテキスト,グラフィックス,スキャンされた画像などを含むページの内容ですが,PS ファイルがプリンターに送られると,プリンターに搭載されている RIP(Raster Image Processor)がビットマップ(1 bit TIFF)に変換し,紙などの媒体に描画します。また高解像度のフィルム出力や刷版出力としてのイメージセッターや CTP 用の RIP は Windows NT などのコンピュータに搭載されています。
ここでは「PS ファイルの記述方法」や「LaTeX2e への展開」と現在印刷・出版業界で大きな話題となっている「PDF/X-1a」について説明します。

PS ファイルの記述方法

PS ファイルはテキストファイルですので,適当なテキストエディターを使って入力します。

    %!
    gsave                        % 現在の座標値などを保存
    newpath                      % 新しいパスの構築
    100 200 moveto               % カレントポイントを(100,200)に移動
    300 200 lineto               % 絶対位置(300,200)まで線を引く指定
    0 0 0 1 setcmykcolor         % CMYK の順番で線や文字の指定
    stroke                       % 実際に線を引く
    showpage                     % 頁全体をプリント
    grestore                     % gsave で保存された座標情報などを元に戻す
% で始まる行はコメント行です。最初の行は %! で始める約束ですが,%!PS または %!PS-Adobe-3.0 としても % 以降は行末までコメント行ですので,問題はありません。続いて gsave を記述し,最後は grestore で終わるのが流儀です。
座標系の単位はデフォルトではポイントです。また原点の XY 座標は(0,0)の左下隅となっています。1 ポイント=0.3514mm ですが,ここではポイントの単位のまま進めます。ペンの現在位置を XY 座標(100,200)に移動し,XY 座標(300,200)までパスを構築しています。stroke で,実際の線が引かれます。
0 0 0 1 setcmykcolor は,0 0 0 setrgbcolor と RGB でも指定可能ですが,DTP では CMYK が標準ですので,CMYK の指定で統一しておいたほうがいいでしょう。数値は 0 から 1 の範囲を比率で指定します。なおここで setcmykcolor 命令をおこなったのは最終出力を考慮したからです。最終出力がコンポジット出力の 1 色だったら不要ですが,2 色とか 4 色に分版する場合は記述しておいたほうが無難です。でなければ,1 色(K 版)の文字や線のはずが CMY 版すべてに出力されてしまいます。
このファイルを test.ps として保存します。プリンターユーティリティなどを用い,test.ps をダウンロードすればプリントできます。あるいは Acrobat Distiller で PDF に変換後,Reader で表示し,必要ならプリントアウトします。LaTeX2e ユーザーの方は,GSview で直ちに確認できるし,この PS ファイルを EPS ファイルに変換すれば,他のアプリケーションに取り込むこともできます。

上記の stroke の後に続けます。
    100 300 moveto
    200 0 rlineto                % 相対位置(200,0)-->(100,300)+(200,0)=(300,300)
    0 200 rlineto                % 相対位置(300,300)-->(300,300)+(0,200)=(300,500)
    -200 0 rlineto               % 相対位置(-200,0)-->(300,500)+(-200,0)=(100,500)
    closepath                    % 図形のパスを閉じる
    gsave
    0.8 setgray                  % 枠の中を20%にする網の指定
    fill                         % 塗りつぶす
    grestore
    5.0 setlinewidth             % 5ポイントの線幅の指定
    stroke                       % 実際に線枠を引く

    200 600 50 0 360 arc         % 円を描く(中心の座標X Y 半径 開始角度 終了角度)
    stroke
lineto は絶対位置の指定ですが,相対位置で指定したい場合は rlineto を使います。 setgray 命令は stroke で線を書くときの線の濃度にも影響するので,fill を実行後,grestore で濃度の情報を元に戻しておきます。続いて文字の指定と出力です。
    /Times-Roman findfont        % Times-Romanを選択
    15 scalefont setfont         % 15ポイントの描画フォントに設定
    120 420 moveto               % 文字を書く位置に移動
    (Hello! world) show          % Hello! worldと書く
英数字の場合は括弧 () の中にそのままの文字を入力し,show 命令すればいいのですが,和文の場合は次のように記述します。
    /Ryumin-Light-H findfont     % リュウミンライト(JIS形式)
    10 scalefont setfont
    120 520 moveto
    (\044\042\044\044) show      % 8進数(JIS形式)で "あい" と書く

    /GothicBBB-Medium-H findfont % ゴシックBBBミディアム(JIS形式)
    12 scalefont setfont
    120 620 moveto
    <24 22 24 24> show           % 16進数(JIS形式)で "あい" と書く

    /GothicBBB-Medium-83pv-RKSJ-H findfont  % ゴシックBBBミディアム(Shift-JIS形式)
    12 scalefont setfont
    120 650 moveto
    <82 A0 82 A2> show           % 16進数(Shift-JIS形式)で "あい" と書く
    showpage
    grestore
このように和文の場合は JIS または Shift-JIS 形式でフォントを指定した後,文字を 8 進数(JIS 形式)のコードで記述し,show 命令します。または 16 進数(JIS 形式),16 進数(Shift-JIS 形式)で記述しますが,この場合はコードを <> で括ります。なお Adobe InDesign などアプリケーションが出力する PS ファイルの和文は内部的に処理しているので,(あい) sh などと 8 進数や 16 進数の文字コードではなく,読める形で表現されています。
PostScript では,直線や円弧のほかにベジェ曲線の描き方などいろいろ用意されていますが,ここでは直線と直線を使ってつながっている部分を丸くしたい,つまり 2 本の接線を指定して円弧をつくり,最終的には角丸付きの枠を作りたい場合の例を示します。
    %!
    gsave
    newpath
    120 100 moveto
    400 100 400 120 20 arcto     % 接線の指定による円弧
    pop pop pop pop              % 2つの接点の座標をクリアする
    400 250 380 250 20 arcto
    pop pop pop pop
    100 250 100 230 20 arcto
    pop pop pop pop
    100 100 120 100 20 arcto
    pop pop pop pop
    0.7 0 0 0 setcmykcolor
    2 setlinewidth
    stroke
    showpage
    grestore
この例では,XY 座標(120,100)に移動後,arcto 命令で(400,100)とをつなぐ直線と(400,120)とをつなぐ直線とを接線とする半径が 20 の円弧がパスに追加されます。以下同様の処理を行って角丸付きの枠を作ります。

最後に枠の幅や高さ,半径を指定すれば角丸付きの枠ができるというマクロ定義の例を示し,LaTeX2e へ展開することにします。

    %!
    gsave
    newpath 
    /WW 300 def                  % 枠の幅の定義
    /HH 150 def                  % 枠の高さの定義
    /RR 2 def                    % 枠の罫幅の定義(座標指定用)
    /r 20 def                    % 枠の半径の定義
    /x1 {RR 0.5 mul} def
    /y1 {x1} def
    /x2 {WW x1 sub} def
    /y2 {HH x1 sub} def
    /noudo {0.7 0 0 0 setcmykcolor} def
    /senhaba {2 setlinewidth} def

    r x1 add y1 moveto
    x2 y1 x2 y2 r arcto 4 {pop} repeat
    x2 y2 x1 y2 r arcto 4 {pop} repeat
    x1 y2 x1 y1 r arcto 4 {pop} repeat
    x1 y1 x2 y1 r arcto 4 {pop} repeat
    noudo
    senhaba

    stroke
    showpage
    grestore
/WW 300 def のように,マクロ定義は「/変数名 値 def」という記述をします。また空白を含む定義は /x1 {RR 0.5 mul} def のように,{}で囲むようにします。後でこの変数を参照する場合は,/ を付けないで変数名を書きます。
mul 命令は a b mul という書式で,a と b を乗算します。sub 命令は a b sub という書式で,a から b を減算します。
自分でマクロを定義する場合など罫線の幅にも注意してください。XY 座標を指定するときに,その中心線の位置を指定するようにします。
このマクロ定義したファイルを適当な名前で保存しておきます。そして TeX 文書では部分的に書き換えます。その結果は以下の通りです。

LaTeX2e への展開

    \documentclass{jbook}
    \makeatletter
    \newdimen\PS@WIDTH
    \newdimen\PS@HEIGHT
    \newdimen\PS@RULE
    \newdimen\PS@RADIUS
    %# \round{幅}{高}{半径}{罫幅}{罫濃}{網}{テキスト}
    \long\def\round#1#2#3#4#5#6#7{%
      \leavevmode
      \hbox to #1{\vbox to #2{\vfill %%%% 角丸
        \PS@WIDTH=#1
        \PS@HEIGHT=#2
        \PS@RADIUS=#3
        \PS@RULE=#4
        \special{" userdict begin
        /sp {65781 div} def
        /WW {\number\PS@WIDTH\space sp} def
        /HH {\number\PS@HEIGHT\space sp} def
        /RR {\number\PS@RULE\space sp} def
        /r {\number\PS@RADIUS\space sp} def
        /x1 {RR 0.5 mul} def
        /y1 {x1} def
        /x2 {WW x1 sub} def
        /y2 {HH x1 sub} def
        end
        r x1 add y1 moveto
        x2 y1 x2 y2 r arcto 4 {pop} repeat x2 y2 x1 y2 r arcto 4 {pop} repeat
        x1 y2 x1 y1 r arcto 4 {pop} repeat x1 y1 x2 y1 r arcto 4 {pop} repeat
        gsave #6 setcmykcolor fill grestore
        #5 setcmykcolor RR setlinewidth stroke}\par
        \nointerlineskip
        \vbox to 0pt{\vss\vbox to #2{\vss\hbox to #1{\hss#7\hss}\vss}}}\hfill}}
    \makeatother
    \begin{document}
    \round{100mm}{50mm}{5mm}{.5mm}{.7 0 0 0}{0 0 0 .1}{PostScriptの基本知識}
    \end{document}
この TeX 文書を実際にコンパイルして DVIOUT や GSview などでご確認ください。

PDF/X-1a

PDF(Portable Document Format)は,PostScript の拡張版として,当初は印刷・出版の世界で使用されてきましたが,現在では文書のやり取りやインターネット上に文書を公開するためのデファクトスタンダードとして広く活用されています。
TeX でも PDF に変換するツールはいろいろありますが,信頼性の高い印刷用文書として ISO 規格として認定された PDF/X-1a 仕様の PDF として基本的には対応しておりません。ただし,埋め込みのできるフォント(CID/OpenType/TrueType)を使用し,dvipsk でPSファイルを作成してからCMYK対応の Acrobat 7.0 以降で PDF を作成すれば,PDF/X-1a の PDF を作ることができます。
現在,印刷・出版業界で大きな話題となっている PDF/X-1a の仕様は以下の通りです。

 ・PDF のバージョンは PDF1.3 であること
 ・フォントが埋め込まれていること
 ・画像は実画像が埋め込まれていること
 ・OPI は禁止されていること
 ・全てのエレメントは,CMYK か特色を使用していること
 ・トランスファー関数やハーフトーンスクリーン情報は含めることができないこと
 ・ファイルのトラッピングが行われているかいないかが明確にされていること
 ・メディアサイズと仕上がりサイズまたはアートサイズが定義されていること
  裁ち落としサイズはオプション
 ・指定印刷条件を記述するか,ICC 出力プロファイルを特定することにより,
  出力インテント(Japan Color 2001 Coated)が指定されていること
なお PDF/X-1a の仕様になっているかどうかは,Adobe Acrobat 6.0 以降で 該当の PDF を開き,プリフライトすれば結果がわかるようになっています。