%表題   ETC 便利な道具たち
%
%履歴
%\Drireki{
%         92/03/26 沼口  敦
%         92/04/22 林祥介   (4.1版)
%        }
%
% \Dchapter{PS出力の加工}
  \Dchapterhead
  \label{PS加工}

\section{はじめに}

ここでは, 電脳ライブラリのPostScript出力(sgks.ps)を
各種目的のために加工する方法と,
そのための道具(pslib)に付いて述べる.

  \begin{enumerate}
  \item ページの抜きだし
  \item \LaTeX{}への組み込み
  \item 描画ツールによる編集
  \end{enumerate}

これらの方法は環境に大きく依存する.
以下で述べる手順を実行するために必要な環境を列挙する.

  \begin{enumerate}
  \item Unix 環境:
        DOS環境への移植も, 描画ツールによる編集を除き容易であろう.
  \item AWK処理系:
        Unix には, 標準で{\tt /bin/awk}および{\tt /bin/nawk}が
        付属している.
        通常使われるAWKは{\tt /bin/nawk}であり,
        基本的に{\tt /bin/awk}の上位互換であるため,
        ここでは, {\tt /bin/nawk}を用いる.
        {\tt jgawk}(GNU版AWK)を用いてもよい.
  \item \LaTeX{}処理系:
        以下では, ASCII版日本語\LaTeX{}を仮定する.
  \item {\tt epsf.sty}:
         PSファイルを\LaTeX{}に組み込む時に
        便利な機能を提供するスタイルファイル.
        \LaTeX の標準スタイルファイルを置くディレクトリまたは
        環境変数{\tt TEXINPUTS}の示すディレクトリに入れておく.
  \item {\tt dvi2ps}:
        DVIファイルをポストスクリプトに変換するフィルタ.
        以下では, 日本語化された, {\tt dvi2ps-j} を仮定する
        \footnote{ここでは述べないが,
                  {\tt postscript.sty + pstex + jdvi2kps}
                  の組み合わせでも使用可能である.}.
  \item Xウィンドウ環境:
        X11R4以上.
  \item {\tt idraw}:
        対話型描画ツールとして,
        以下では, 日本語化された{\tt idraw}である{\tt kdraw}
        \footnote{idraw はX11/contribに付属するC++
                  ライブラリであるInterviewsに含まれる.
                  コンパイルにはg++などのC++コンパイラが必要である.}
        を仮定する.
  \item ポストスクリプト出力が可能なプリンタ.
        もしくは {\tt ghostscript} などのポストスクリプトインタプリタ.
  \end{enumerate}

  以下に述べるコマンドは, パスの通ったディレクトリに入れ,
  実行可能フラグを立てておくとよい.
  {\tt /bin/nawk} 以外のAWK処理系を使用する場合は,
  1行目を書換えること.


\section{sgksselect : sgks.psのページ抜きだし}
%\label{pslib.sgksselect}

複数ページを含む sgks.ps から特定のページを抜き出す場合には,
{\tt sgksselect} を使用する.
以下で述べる\LaTeX の取り込み, 描画ツールでの編集をするためには,
1ページがひとつのファイルになっている必要があるため,
場合によりこの作業が前段階として必要になる.

\subsection{sgksselect}
\label{pslib.sgksselect.cmd}

\begin{enumerate}
  \item 機能
  \begin{quote}
    sgks.ps から特定の1ページを抜きだし, 標準出力に出力する.
  \end{quote}
  \item 使用方法
  \begin{quote}
    {\tt sgksselect p=}{\em page psfile}
    {\tt sgksselect} {\em psfile}
  \end{quote}
  \item 引数
  \begin{quote}
    \begin{tabular}{lp{11cm}}
      {\em page\/}   & 選択するページ.
                      省略すると{\tt p=1}が仮定される. \\
      {\em psfile\/} & 入力ファイル名. 標準的には{\tt sgks.ps\/}.
                     省略すると, 標準入力が用いられる.
    \end{tabular}
  \end{quote}
\end{enumerate}

\section{sgksrot : sgks.psの\TeX{}への組み込み}
\label{pslib.sgks2tex}

dvi2psを用いてsgks.psを\TeX{}に組み込む手順の概略は
以下の通りである.

\begin{enumerate}
\item 必要であれば, {\tt sgks.ps}に回転その他の加工を行い,
      {\tt Boundingbox}コメントを調整する.
\item \LaTeX のスタイルオプションとして {\tt epsf.sty} を指定し,
      \verb!\epsfile! コマンドで {\tt sgks.ps} ファイルを指定する.
\item \LaTeX の処理の後,
      dvi ファイルを {\tt dvi2ps} でPSに変換する.
      このとき, {\tt sgks.ps} が出力PSファイルにとりこまれる.
\end{enumerate}

詳しい手順を以下に記す.

\begin{enumerate}
\item {\tt sgks.ps}を以下のように加工する.

  \begin{enumerate}
  \item 横長画面の場合({\tt IWS>0}).
    \begin{enumerate}
    \item 1行めの \verb/%! SGKS OUTPUT FOR POSTSCRIPT FILE./
          の後に,
          ( \verb!%%BoundingBox...!というコメントがすでにあれば
           それを取り除き),

          \verb!%%BoundingBox: -1 -1 751 531!

          という行を入れる.
          これは, PSファイルに含まれる座標の範囲を
          {\tt epsf.sty}に知らせるためのコメントである.

    \item 25行目付近にある,

          \verb!562 44 translate! \\
          \verb!+90 rotate!

          を取り除くか, 行の先頭に \verb!%!を挿入して
          コメントアウトする.

    \item ハードフィルを用いている場合,
          20行目付近にある, {\tt /P1}, {\tt /P2} 等の定義を
          以下の様に書き換える.

          \begin{verbatim}
/P3 {{pop}} def
/P4 {{rightup}} def
/P1 {{exch pop}} def
/P2 {{rightdown}} def
          \end{verbatim}

          すなわち, {\tt P1}と{\tt P3}, {\tt P2}と{\tt P4}を
          とりかえる.

    \end{enumerate}

     これらの作業は
     \footnote{PSは縦長画面が標準であり,
               横長画面の場合には
               PSを90度回転させて出力していることから,
               このような元に戻す作業が必要となっている.}
     後述の{\tt sgksrot}コマンドによって
     行うことができる.

  \item 縦長画面の場合({\tt IWS<0}).
    \begin{enumerate}
    \item 1行めの \verb/%! SGKS OUTPUT FOR POSTSCRIPT FILE./
          の後に,

          \verb!%%BoundingBox: 31 43 563 795!

          という行を入れる.
          これは, PSファイルに含まれる座標の範囲を
          {\tt epsf.sty}に知らせるためのコメントである.

          ただし, このコメントは標準で入っているものであるので,
          通常はこの操作は必要ない.
   \end{enumerate}
  \end{enumerate}

\item \LaTeX のスタイルオプションとして {\tt epsf.sty} を指定する.
      すなわち, 以下のように{\tt [ ]}の中に{\tt epsf}を入れる.

      \verb!\documentstyle[a4j,12pt,epsf]{jarticle}!

      本文中で, 挿入したい場所に
      \verb!\epsfile! コマンドで入れるsgks.psファイルを指定する.

      \verb!\epsfile{file=sgks.ps,width=10cm}!

      または,

      \verb!\epsfile{file=sgks.ps,height=8cm}!

      \verb!width=10cm!, \verb!height=8cm!などの指定により,
      図全体の幅, または高さが指定した値になるように
      縮小拡大されて挿入される.

      \begin{quote}
        \small
        このスケーリングには, \verb!%%BoundingBox!の値が使用される.
        \verb!%%BoundingBox!の値は
        順にx座標の下限, y座標の下限, x座標の上限, y座標の上限を示す.
        座標の単位は1/72インチである.
        この範囲が指定した実長におさまるようにスケーリングし,
        その大きさの領域を確保するようになっている.
      \end{quote}

\item \LaTeX の処理を行う.
      ここで,\verb!\epsfile!に指定したファイルが見つからないと,
      エラーがとなる.
      dvi ファイルを {\tt dvi2ps} でPSに変換する.
      このとき, 挿入されるファイル名が標準出力に表示されるはずである.

      PSプリンタ, PSプレヴューアがない環境で
      \LaTeX 処理を行いデバッグ, 出力等を行う場合には,
      \verb!\epsfdrafttrue! コマンド(引数無し)をプレアンブル等に
      指定して\LaTeX 処理をおこなうとよい.
      このときは, PSファイルを取り込む指定(\verb!\special!)が
      dviファイルに出力されず, かわりに
      取り込むファイル名が印刷される.

\end{enumerate}


\subsection{sgksrot}
\label{pslib.sgksrot.cmd}

\begin{enumerate}
  \item 機能
  \begin{quote}
    sgks.ps を90度回転させて, 横長画面が\LaTeX にとりこめるようにする.
  \end{quote}
  \item 使用方法
  \begin{quote}
    {\tt sgksrot} {\em psfile}
  \end{quote}
  \item 引数
  \begin{quote}
    \begin{tabular}{lp{11cm}}
      {\em psfile\/} & 入力ファイル名. 標準的には{\tt sgks.ps\/}.
           省略すると, 標準入力が用いられる.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item PSファイルは1ページごとに一つのファイルと
          なっていなければならない.
          ページを抜き出すには,
          {\tt sgksselect}(\ref{pslib.sgksselect.cmd})が使用できる.
  \end{enumerate}
\end{enumerate}

\section{sgks2idraw : 描画ツールによるsgks.psの編集}

直接の印刷, あるいは\LaTeX{}への組み込みの前に
sgks.psファイルを対話型描画ツールによって編集加工することができる.
ここでは, idraw(あるいはその日本語対応版のkdraw)を
用いた方法を述べる.

\begin{enumerate}
\item {\tt sgks2idraw} を使用して, {\tt sgks.ps}ファイルを
      {\tt idraw}が読み込めるファイルに変換する.

\item {\tt idraw}を起動してファイルを読み込み,
      編集加工後セーブ, 印刷する.
\end{enumerate}

\subsection{sgk2idraw}
\label{pslib.sgks2idraw.cmd}

\begin{enumerate}
  \item 機能
  \begin{quote}
    sgks.ps を idraw が読み込める形に変換する.
  \end{quote}
  \item 使用方法
  \begin{quote}
    {\tt sgk2idraw} {\em psfile}
  \end{quote}
  \item 引数
  \begin{quote}
    \begin{tabular}{lp{11cm}}
      {\em psfile\/} & 入力ファイル名. 標準的には{\tt sgks.ps\/}.
           省略すると, 標準入力が用いられる.
    \end{tabular}
  \end{quote}
  \item 備考
  \begin{enumerate}
    \item PSファイルは1ページごとに一つのファイルと
          なっていなければならない.
          ページを抜き出すには,
          {\tt sgksselect}(\ref{pslib.sgksselect.cmd})が使用できる.

    \item ハードフィルは変換できない. 無視される.

    \item {\tt sgks2idraw}で変換したファイルは
      そのままでは印刷できない.
      一度{\tt idraw}で読み込み, セーブすると印刷可能となる.

    \item ある(比較的新しい?)バージョンの{\tt idraw}では
      読み込んだ時非常に大きくなってしまい,
      また線が太くなってしまう.
      {\tt kdraw}は古いバージョンの{\tt idraw}({\tt Interviews2.6})を
      元にしており, そのような症状は出ない.

    \item 2つの{\tt idraw}を立ちあげて,
      {\tt .clipboard}を用いて
      cut and paste する場合, paste したイメージの
      スケールがおかしくなる(大きくなる).

    \item 編集加工された画像にあわせて\verb!BoundingBox!が
      再設定されるために,
      編集前と\LaTeX{}に組み込んだ時の大きさが異なってしまう
      ことがある. その際には\verb!BoundingBox!の数値を
      \ref{pslib.sgks2tex}で示したものに設定しなおすこと.

  \end{enumerate}
\end{enumerate}

