第11章プリンタ定義ファイルの記述

11.1 プリンタ定義ファイル

プリンタ定義ファイルは、

• プリンタが要求するビットイメージデータの形式

• プリンタの印字命令のうちdviprt が使用するプリンタの機能に当たるもの

などを定義しておくためのファイルで、この情報をもとにdviprt はプリンタコードを生成し出力します。

dviprt が直接使用するプリンタ定義ファイルは、拡張子が .cfg のもので、これは人が読み書きしやすい形ではなくコンピュータよりの形 (バイナリ形式) をしています。人が読み書きしやすいプリンタ定義ファイルの形式としてテキスト形式のものが用意されており、この形式のファイルの拡張子は慣例的に .src としています。 dviprt は、バイナリ形式の*.cfg しか解釈できませんので、テキスト形式の定義ファイル*.src をなんらかの手段でバイナリ形式に変換する必要があります。この変換を行なうプログラムがoptcfg.exe です。

これから説明するプリンタ定義ファイルの説明はテキスト形式の定義ファイル*.src に関するものです。従って新たにプリンタ定義ファイルを作成したり既存のものを修正する場合にはテキスト形式の*.src に対して作業を行ない、 dviprt で使うには一度optcfg.exe を使って*.cfg に変換してください。

dviprt の配布には多くのプリンタ定義ファイルが付属しています。各種の新しいプリンタは既存のプリンタのプリンタ命令と同じ命令、またはそれを拡張したもの、を使用していることが多いのでプリンタ定義ファイルを一から作成しなければならないことはまれです。まずは似たプリンタ、例えば旧機種や別メーカの製品に機能拡張を施しただけのプリンタならばその元になった機種のための設定ファイルがないかどうかを確認してそれをそのまま、またはわずかな修正で使用できないか検討してみてください。

またこの説明で具体的なイメージがつかめない場合には配布に含まれているものを例としてご覧になることをお勧めします。

なお、プリンタ定義ファイルの仕様がdviprt バージョン 2.42 で拡張されました。ここでの説明はこの拡張された仕様について述べてあります。ここで説明するテキスト形式のプリンタ定義ファイルをバイナリ形式に変換するにはoptcfg.exe のバージョン 3.0 以降が必要です。旧仕様との関係については本章 p.18 をご覧ください。

11.2 説明中の表記に関して

この説明では以下のような表記を用います。

• 出力されるプリンタコード

実際に出力されるプリンタコードはイタリック体を使って 16 進数表記 (16 進ダンプ) することとします。

例 :

FF FD 23 45 0D 0A

\underline{2 第 11 章プリンタ定義ファイルの記述}

• 数値説明中の数値は上記のようなプリンタの出力コードを表わす場合を除いて特に断らない限り 10 進数表記です。説明の都合上 n 進数表記の数を用いる場合には、 (Number)_{n}のようにその数を括弧で囲んみ、基数を下付き文字で添えて表わします。

dviout の Ver.2.43.2 の Technical Guide より抜粋

例 :

8 進数表記の 123

(123)_{8}

• プリンタ定義ファイル中に実際に記述する文字列プリンタ定義ファイルに実際に書く内容は、そのままをタイプライタ体で記述することとします。

例 :

    maximal_unit  : 360

11.3 項目の詳細

プリンタ定義ファイルの全項目の意味を詳しく述べます。説明では一部、 dviprt のプリンタコード生成についての理解を前提としている部分があります。 dviprt のプリンタコード生成手順に関する説明 (本章 p.12) を参考にしてください。初めて目を通す場合には、各項目に設定する値の型さえわかっていただければ結構です。各項目は、整数型、選択型、文字列型、プリンタコード型、のいずれかの型を持っています。

• name

プリンタの名前 (文字列) です。出力されるプリンタコードには影響を及ぼしません。 dviprt 起動時にこの名前をディスプレイに表示しますので、どのプリンタ用のプリンタ定義ファイルなのか判別できるような名前を登録しておくのがよいでしょう。

• upper position

プリンタのピン配列などを選択し、指定します。

1. ピン配列の指定ビットイメージをプリンタに出力する際、イメージデータを並び替えてから送る必要があります。これは、プログラム内部ではビットイメージを上から下、左から右の順番で行優先で保持しているのに対して、プリンタが要求するイメージデータの順番が必ずしもそうなっていない為です。 dviprt ではこの順番を出力データ中のドットの順番と印字結果との対応によって次の 4 種類に区分しています。これらの中の一つをこの項目で指定します。

   (a) HIGH_BIT

11.1 p.3 のように、イメージデータを列優先で出力します。この種類に該当するものとして ESC/P 系のプリンタがあります。

  (b) LOW_BIT

HIGH_BIT と基本的には同じですが、縦方向の並びが 8 ドット毎に (すなわち 1 バイトのデータの中のビットの並びが) HIGH_BIT とは逆の順序になっています (cf. 11.2 p.3)。この種類には PC-PR 系が該当します。

   (c) LEFT_IS_HIGH

イメージデータを行優先で出力します (cf. 11.3 p.3)。 HP DeskJet やほとんどのページプリンタがこの種類に該当します。

  (d) LEFT_IS_LOW

\underline{11.3. 項目の詳細 3}

[figure: 下位; 上位; 印字結果; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; データ; 上位; 下位; ⋯; ⋮; ⋮; ⋮] 図 11.1: HIGH BIT 型のプリンタ

[figure: 上位; 下位; 印字結果; ⋯; 下位; 上位; データ; ⋮; ⋮; ⋮; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯; ⋯] 図 11.2: LOW BIT 型のプリンタ

LEFT_IS_HIGH と基本的に同じですが、イメージデータ中のビットの並びが 8 ドット毎に LEFT_IS_HIGH とは逆の順序になっています。これに該当するプリンタは今のところ存在しないようです。

2. NON MOVING

イメージデータを印字後、次回の印字位置が印字した次の位置に移動せず元の位置のままであるようなプリンタ (ページプリンタに多いようです) では、さらに NON_MOVING を記述します (cf. 11.4 p.4)。

もし NON_MOVING に該当するプリンタで upper_position に NON_MOVING を指定し忘れると、重

ね刷りされる、印字位置がずれる、などの不具合が生じます。

• pins

プリンタが一回の印字で印字する縦のドット数です。必ず 8 の倍数で指定します。

• minimal unit

ビットイメージを扱う際の最小単位の横幅です (cf. 11.5 p.13)。バイト単位 (ドット数/8) で指定します。 dviprt は、 DVI ファイルをビットマップイメージに変換した結果のうち、幅がここで指定された

[figure: 下位; 上位; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; ⋮; データ; 上位; 下位; ⋯; ⋯; ⋯; 印字結果; ⋯]

図 11.3: LEFT IS HIGH 型のプリンタ印字後の位置印字前の位置印字前の位置

印字後の位置

イメージ

                                     NON MOVING の

プリンタ

                               NON MOVING ではない

プリンタ

イメージ

                               図 11.4: NON MOVING

バイト数、高さが pins で指定された範囲のドット数の矩形が空白であれば、ビットイメージの印字命令の代わりに横方向の移動命令 (skip_spaces。後述) を使います。従ってこの minimal_unit の値が小さいほど skip_spaces が使われる可能性が増すことになります。この項目を省略した場合、 minimal_unit は、出力コードの大きさが最小になるであろう値に設定されます。

• maximal unit

イメージデータを出力するときにプリンタが一度に扱うことが出来る最大の横幅です。バイト単位で指定します。プリンタの最大印字可能幅を指定するものではありませんので注意してください。印字データの横幅や横方向の移動量がこの値よりも大きい場合にはこの値以下の大きさに分割されて出力されます。この項目が省略された場合、 max_unit は十分に大きな値となります。多くのプリンタではプリンタの最大印字可能幅かそれ以上の値なので、通常は指定しないか、十分大きな値 (たとえば、 10000) にしておきます。

• bit image mode

印字データを出力する前に最初に一度だけ出力するプリンタ初期化コードです。つまりdviprt を起動後に初めて出力されるプリンタコードになります。通常、改行幅の変更、 1 ページ目の給紙などを行ないます。

• normal mode

全ページを出力後、すなわち一番最後に出力されるプリンタコードです。プリンタのバッファのフラッシュ・最終ページの排紙を行なうコード、および bit_image_mode で変更した内容を元に戻すためのコード、などを指定します。最終ページのみが出力されない場合、この項目でバッファのフラッシュや排紙のためのプリンタコードを指定し忘れていることが原因の一つとして考えられます。

• send bit image

ビットイメージの印字命令を出力する毎にデータの先頭に付加して出力するプリンタコードです。後

述する bit_row_header および after_bit_image と組み合わせて一つのビットイメージの印字命令

を形成します (cf. 11.7 p.15)。

• bit row header
upper_position の項目に LEFT_IS_HIGH か LEFT_IS_LOW が指定された場合に有効です。

1 ラスタ行 (縦方向 1 ドット) のデータの先頭にこのコードが付加されます (cf. 11.8 p.15)。この項目が省略された場合には何も出力されません。

• after bit image

各イメージデータを出力する毎に、ここに定義されるデータをイメージデータの末尾に付加します (cf. 11.7 p.15)。この項目が省略された場合には何も出力されません。

• skip spaces

印字位置を水平方向に移動する命令。

• line feed

プリンタのバッファのフラッシュ、行頭への移動、 pins ドット下への移動、を行なうためのプリンタコード。 dviprt は印字位置を縦方向に移動するのにこのコードを使いますので、ここで定義されたコードによって、丁度 pins ドット下の行頭に移動することが必要です。プリンタの改行コードを使う場合には “改行幅 =pins ドット分の長さ” になるようにあらかじめ bit_image_mode で改行幅を変更しておかなければなりません (通常、プリンタの改行幅の初期値は “プリンタフォントの高さ +α” です)。この項目が省略された場合には ASCII コードの「復帰 + 改行」 (0D 0A) が用いられます。

• form feed

プリンタのバッファのフラッシュおよび改ページ (現ページの排紙と次ページの給紙) を行なうためのプリンタコード。この項目が省略された場合には ASCII コードの「復帰 + 改ページ」 (0D 0C ) が用いられます。ページの最終行のみが出力されない場合、この項目でプリンタのバッファのフラッシュを行なうコードを指定し忘れていることが原因の一つとして考えられます。

• dpi

プリンタのデフォルトの解像度です。 dviprt の起動オプション-dpi や-DPI が指定されない場合、ここで記述された解像度が用いられます。 y_dpi を指定しなかった場合は、縦横が同じ解像度となります。整数で指定します。省略された場合には 180dpi が指定されたものとみなされます。

• y dpi 縦横の解像度が違う場合に、縦の解像度を指定します。 dviprt の起動オプション-DPI に対応しますが、起動オプションが指定された場合は、起動オプションの方が優先されます。

• encode

プリンタに送るビットイメージデータをどのように符号化するかを指定します。符号化とは、ここでは元の形に一意的に復元できるような形にデータを変換することをさします。例えばデータ圧縮などです。ここに指定される内容と同様のことが起動オプションによっても可能な場合 (例えば-FAX や-comp) もありますが、プリンタの制御コードとビットイメージの符号化の方法との間には密接な関係がある場合が多いためプリンタ定義の中で記述できるようになっています。この項目では以下の指定が可能です。

HEX データを ASCII テキストによる 16 進数表現に変換します。 16 進数ダンプを想像していた

だくとよいでしょう。 FAX G3 Fax エンコード。起動オプションの-FAX と等価。ならべて-FAX オプションの引数を書

いておくことも可能。 PCL1 HP PCL mode 1 圧縮。起動オプション-comp=1 と等価。 PCL2 HP PCL mode 2 圧縮。起動オプション-comp=2 と等価。 \underline{6 第 11 章プリンタ定義ファイルの記述}

11.4 書式

11.4.1 コメント

以下のような行はコメント行として無視されます。

• 文字「;」 (セミコロン) で始まる行。「;」の前に空白文字を先行させることも出来ます。

• 文字 a–z, _(アンダースコア) 以外の文字で始まる行。ただし、後述するプリンタコード型の項目中の「継続行」に限っては、後者の場合はあてはまりません。

11.4.2 各項目共通の書式

各項目は、

項目名 : 値のように、項目名とその値とを「:」 (コロン) で区切って書きます。項目名は必ず第 1 カラムから書きはじめます。空白文字が先行した場合コメント行とみなされてしまいますので注意してください。「:」の前後の空白はあってもなくても構いません。

11.4.3 項目の型別の書式 11.4.3.1 文字列型の項目

文字列を指定します。この項目には name が該当します。例 :

name            : BJ-10v 48 pin
name            : HP DeskJet 505J (mode 2 compression)

11.4.3.2 整数型の項目

pins、 minimal_unit、 maximal_unit、 dpi、 y_dpi が該当します。数値を 10 進表記で記述します。

例 :

pins      : 48

このタイプの項目の値は以下に示すような範囲内の非負の整数です。 pins 8 の倍数かつ 8 ≤ pins ≤ 128

minimal unit 1 以上
maximal unit 1 以上
dpi  1 以上
y dpi  1 以上

\underline{11.4. 書式 7}

11.4.3.3 選択型

  upper_position、 encode が該当します。

あらかじめ決められた数種類の選択肢の中から一つを選び、記述します。付加的な情報をさらに付け加えることができる項目もあります。

このタイプの各項目の選択肢は以下のようになっています。選択肢の意味については各項目の説明をご覧ください。付加情報を記述する場合には同じ行に空白文字で区切ってならべて書きます。

項目名選択肢付加情報

      upper_position  HIGH_BIT  選択肢によらず
                      LOW_BIT         NON_MOVING
                      LEFT_IS_HIGH を指定可能。

                      LEFT_IS_LOW

      encode          FAX           -FAX オプションの引数

                      HEX
                      PCL1
                      PCL2

例 :

     upper_position   : LEFT_IS_HIGH NON_MOVING
     encode           : FAX 1728;2280

11.4.3.4 プリンタコード型の項目

この型には

     bit_image_mode, normal_mode, send_bit_image, bit_row_header, after_bit_image,
     skip_spaces, line_feed, form_feed

の各項目が該当します。

このタイプの項目は、 dviprt が要求するプリンタの動作を具体的にどのようなプリンタ命令を使ってプリンタに行なわせるか、ということを定義しています。

この項目の値は、次の 2 種類の要素を出力する順番に並べたものからなっています。

• そのまま出力するコード。

• 書式指定による、 dviprt の内部変数の値やそれを使って様々な演算を施した結果の出力。例えば、水平スキップの移動量を 2 バイトのバイナリ表記で出力させたい、というときなどに使います。

プリンタコードの定義中ではスペースやタブなどの空白文字は単なる区切り文字として扱われ全て無視されます。従って空白文字そのものを記述したい場合には後述するエスケープシーケンスを用いて表現する必要があります。

コードの指定そのまま出力するプリンタコードは以下のように記述します。

• アルファベット、数字、 ‘\’ を除いた記号類など、空白文字以外の ASCII テキスト文字はそのまま記述します。例 :

normal_mode   : showpage

• 上記以外のものは、以下のようなエスケープシーケンスを用いて表わします。エスケープシーケンスは文字 \で始めます。

\ backslash または yen。 ‘\’ そのもの (ASCII コード 5C )。 \s または \SP SPace character。スペース文字 (ASCII コード 20 )。 \e または \ESC ESCape character。エスケープ文字 (ASCII コード 1B)。 \n New line, line feed。改行 (ASCII コード 0A)。 \t horizontal Tab。水平タブ (ASCII コード 09 )。 \r carriage Return。復帰 (ASCII コード 0D)。 \f Form feed。改ページ (ASCII コード 0C )。 \v Vertical tab。垂直タブ (ASCII コード 0B)。 \" double quotation。文字「"」 (ASCII コード 22 )。 \0ooo Octal number。 8 進数で表わされたコード。「\0」 (オー O ではなくゼロ 0) で始めます。 o

には 0 以上 7 以下の数字が入ります。例えば(33)_{8}は \033 のように表わします。 1 バイトのコードを表わす数ですのでとりうる値の範囲は 0 以上 255 以下、すなわち \0000 から \0377 です。桁数は可変です。

\ddd Decimal number。 10 進数で表わされたコード。 d には 0 以上 9 以下の数字が入ります。ただし最上位桁の数字は 8 進数表記と区別するために 0 以外の数字で始めます。例えば (72)_{10}は \72 のように表わします。とりうる値の範囲や桁数は 8 進数と同様です。

\xhh または \Xhh heXadecimal number。 16 進数で表わされたコード。 h には 0 以上 9 以下の数字、または

a から f までのアルファベット (大文字でも可) が入ります。例えば(1A)_{16}は \x1a のように表わします。とりうる値の範囲や桁数は 8 進数と同様です。

これらのエスケープシーケンスを使って例えば次のように記述します。

例 :

bit_image_mode   : \e 3 \24
line_feed        : \r \n

エスケープシーケンスにエスケープシーケンスではない表記を続ける場合には 1 つ以上の空白文字で区切ってください。逆の場合やエスケープシーケンス同士を続ける場合には空白文字は必要有りません。

例 :

bit_image_mode   : \e3\24 これはエラー
line_feed        : \r\n  これは可

書式指定書式指定は一般に以下のように書式と式を「,」 (コンマ) で区切って記述します。

書式, 式この「式」の値を「書式」に従って出力する、ということになります。この指定の中に空白文字を含めてはいけません。

従来の*.src との互換性を考慮して、「, 式」の部分が省略された場合には「横方向の送り幅」 (後述する内部変数 d の値) を「式」の値とみなします。

• 書式新仕様のプリンタ定義ファイルには以下の書式があります。この中で n はその桁数を表わし、 1 ≤ n ≤ 7、または n = ? とします。 n = ? の場合可変長の桁数を表わし、数の表現に必要な最小の桁数で出力されます。可変長の桁数は ASCII テキスト形式の書式においてのみ使用可能です。

\bn バイナリ下位 → 上位バイト \Bn バイナリ上位 → 下位バイト \on 8 進 ASCII テキスト \dn 10 進 ASCII テキスト \hn 16 進 ASCII テキスト (小文字) \Hn 16 進 ASCII テキスト (大文字)

上記の ASCII テキスト表記 (8 進、 10 進 16 進) の書式では桁数の指定に「I」を続けることによって最下位桁の文字コードに(16)_{10}すなわち(10)_{16}を加えるようにできます。これは桁数指定が可変長 ( 「?」 ) の場合に最下位桁を表わすいわばデリミタのような役割をします。例えば、「\d?I」というフォーマットで(1000)_{10}を表現した場合、出力されるコードは 16 進表記で 31 30 30 40 です。バイナリ表記のフォーマットの場合にはこの書式オプション I は無視されます。

\st 文字列を式の値の回数だけ出力。

この書式\st だけは他のものと比べて特殊なもので以下のような形をしています。

    \st, 式,"文字列"

「書式」から最初の「"」までには空白文字を含めてはいけませが「"」で囲まれた部分には改行文字以外の空白文字を含めることができます。「文字列」の長さは 255 バイト以内です。「"」で囲まれた部分は、そのまま出力するコードの指定と同じ方法で記述します。つまり空白文字は全て無視されエスケープシーケンスが使えます。文字「"」そのものを文字列に含めるには「\"」と記述してください。この書式 \st では式の「値そのもの」を出力する代わりに式の値を回数の指定とみなしてその回数だけ「文字列」をくり返し出力します。

• 式式は以下のような定数、内部変数、演算子、および括弧という要素からなります。

– 定数

0 以上(65535)_{10}以下、つまり(F F F F)_{16}以下の非負の整数です。表記の桁数は可変です。

0oooooo

8 進表記の整数。「0」で始めます。例えば(13)_{8}は「013」のように記述します。 ddddd

10 進表記の整数。「0」以外の数字で始めます。例えば(1234)_{10}は「1234」のように記述します。 xhhhh またはXhhhh

16 進表記の整数。例えば(7F F C)_{16}は「x7ffc」のように記述します。「x」一文字だけ書いた場合、後述の「水平方向の絶対位置」とみなされてしまうので注意してください。 – 内部変数

w ページ幅 (dots)。 h ページ高 (dots)。 r 横の解像度 (dpi)。 R 縦の解像度 (dpi)。 p 通しページ。始めのページが 1 です。値は form_feed を出力した後で更新されます。 v pins の項目の値を 8 で割ったもの。 c constant の項目で定義された値。旧仕様との互換性のために用意されています。新たにプ

リンタ定義ファイルを作成するときには使わないようにしてください。

s 出力するイメージデータそのもののバイト数。 send_bit_image, bit_row_header および
after_bit_image の定義内でのみ使える変数です。

データ圧縮や HEX MODE によるイメージデータの加工を指定している場合にはその加工

後のデータサイズです。 send_bit_image と after_bit_image の定義の中では縦 pins ドッ

ト分のデータのバイト数、 bit_row_header ではその 1 ラスタ行分のデータのバイト数です。

d 横方向の送り。 send_bit_image, bit_row_header, after_bit_image, skip_spaces の定

義内でのみ使える変数です。旧仕様で書式指定を使って出力されていた値はこの変数の値に該当します。

x 水平方向の絶対的な印字位置 (dots)。ページ左端のドットの位置が 0 です。定義中で使われているプリンタコード型の項目値を出力する直前の印字位置を指しています。従って、

send_bit_image, bit_row_header, after_bit_image, skip_spaces といった x の値が変

更される可能性がある項目の定義中で印字位置が移動した後の値が欲しければ x の代わりに後述する式による表現を用いて x+d と表現してください。例えば ESC/P 24 pin のプリンタで、横方向のスキップを相対位置指定でなく絶対位置指定によって行なうには skip_spaces を以下のように定義します。

例 :

   skip_spaces     : \e $ \b2,x+d
x の値は after_bit_image や skip_spaces を出力した後に更新され line_feed を出力した

後で 0 にリセットされます。ただし、 NON_MOVING タイプのプリンタの場合は、 after_bit_image の後での更新は行なわれず skip_spaces を出力したあとにのみ更新されます。従っていずれの場合も x の表わす位置は実際のプリンタの状態に一致することになります。

y 垂直方向の絶対的な印字位置 (dots)。ページ最上部のドットの位置が 0 です。 x 同様、コードを出力する直前の位置を指しています。値は line_feed を一回出力するごとに更新され、 form_feed を出力した直後に 0 にリセットされます。

– 演算子

以下の二項演算子があります。

算術演算ビット演算
+ 加算  | 論理和
- 減算  & 論理積
* 乗算  ^排他的論理和
/ 除算  > 右シフト
% 剰余  < 左シフト

– 開き括弧「(」と閉じ括弧「)」

これらを組み合わせて「式」を形成します。式は、通常の中置記法で記述します。ただし、演算子の間に「優先順位はなく」、左側から順に解釈されます。例えば、以下のようなものが「式」の例です。

例 :

     p
     (w+7)/8
     x+d/2

最後の例は、慣例的には x + (d/2) の意味になりますが、ここでは、 (x + d)/2 と解釈されます。前者のように解釈させたいのであれば、括弧を用いて x+(d/2) と明示的に演算順序を指定するか、 d/2+x としてください。

演算は、アプリケーション内部では符号なしの 2byte で計算されます。従って、 2byte 符号なし整数で表わされる範囲からはみ出すような演算についてはその結果は保証されません。

以下は「書式, 式」の例です。

例 :

     \b2,s
     \d?,(w+7)/8

プリンタコード型の項目の実際

これまでに説明してきた書式指定出力とコード出力を組み合わせて、実際にどのように項目の記述を行なうかを説明します。

書式指定とコード指定は以下のように出力する順番にならべて書くだけです。

例 :

     send_bit_image  : \ESC Z \b2

この例では

1B 5A

というコードに続いて、これから送るビットイメージの横幅 (ドット単位) を下位→上位の順にバイナリ形式で送ります。例えば幅が 280 ドットならば数値は、

18 01

というコードで出力されます。次の例は 1 ラスタ行ぶんのデータサイズをバイト単位で出力する例です。

例 :

     bit_row_header  : \ESC _W \b2,s

この例では

1B 5F 57

に続いてイメージデータのバイト数を 2 バイトのバイナリ形式で下位バイト→上位バイトの順に出力します。例えばデータのバイト数が 35 バイトならば数値は、

23 00

というコードで出力されます。次のものは 2 つ以上の書式が同時に指定された場合の例です。

例 :

     send_bit_image  : \x9b \d?,s ; \d?,d/8 .r

d?,s はイメージデータの全バイト数を不定長の 10 進数 ASCII テキスト表現で送信することを表わしています。 \d?,d/8 はイメージデータの横幅をバイト単位の 10 進数 ASCII テキスト表現で送信することを表わしています。従って、 send_bit_image のコードとしてプリンタへ送られるコードは、例えばこれから送るイメージデータの横幅が 280 ドットでイメージデータに対して圧縮を施したりしなければ、

9B 32 38 30 3B 33 35 2E 72

となります。コードを何も設定しない (空のコードを設定する) 場合には項目名 +‘:’ のみを記述します。

例 :

     skip_spaces   :

プリンタコードの定義が長い場合には複数行に分けて記述することが出来ます。後続する行の行頭を空白文字ではじめてください。

例 :

     bit_image_mode  : sttjob\SP c\x0d \x0a
                       sttpage\SP p\SP a4\x0d \x0a
                       unitdef\SP i\x0d \x0a
                       trnsl\SP 0\SP 81840\x0d \x0a

11.5 dviprt の出力コード生成手順

11.5.1 文書の構成

DVI ファイルはdviprt 内部でビットマップイメージに変換され、これがさらにプリンタコードへと変換されるわけですが、この、ビットイメージ→プリンタコード変換の観点から見た「文書の構成」について考えてみます。

縦 pins ドット、横数バイト (8 の倍数ドット) のブロックを「ユニット」と呼ぶことにします。 dviprt がプリンタコードを生成する際の基本単位はこのユニットです。

dviprt がビットイメージを扱うときの最小単位は幅が minimal_unit バイトのユニットです。この最小単位のユニットがページの幅の分だけ横に並んだものが「行」、その「行」がページの高さの分だけ縦に並んだものが「ページ」です。ページが、縦 pins ドット間隔、横 minimal_unit 間隔の格子で区切られているところを想像していただけばよいでしょう (cf. 11.5 p.13)。この一つ一つのマス目を、左上から順に ( 11.5 p.13 の番号のように) 処理していきます。なお、 minimal_unit よりもページの幅のほうが狭ければ行全体を最小単位のユニットとし、同様に行頭から minimal_unit 幅で行を分割していって行末に minimal_unit よりも小さな幅のイメージしか残らなかった場合 (つまりページの横幅が minimal_unit で割り切れない場合) にはその残り全部を 1 つのユニットとします。 \underline{11.5. dviprt の出力コード生成手順 13}

[figure: ページ高; ページ幅; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; ⋯; pins ドット; minimal unit×8 ドット]

図 11.5: 文書の構成

11.5.2 出力コードの生成

11.5.2.1 一般的な手順

dviprt は出力コードのサイズを最適化するために次のような条件を満たすプリンタコードを生成します。

• 空白の部分があればビットマップの印字命令の代わりに水平スキップ命令 (横方向の移動命令) を使う。 • 行全体が空白であれば縦方向の移動命令 (改行命令) を使う。

• 行末の水平スキップは無駄であるので行なわない。

• 同様にページ末尾の改行は無駄であるので行なわない。

これらのことを実現するため文書は次に示す手順で検査され出力されます。この説明の中で特に大事なのは bit_image_mode、 send_bit_image などのプリンタコード型の項目の値がどのタイミングで出力されるのかということと、 minimal_unit や maximal_unit などの項目の値が出力されるビットイメージデータにどう影響するのかということです。これらの点に特に注意して説明を読んでください。

説明中に現れる HSKIP 、 V SKIP 、 DSIZE、はそれぞれその段階で未出力の、横方向の方向のスキップ幅、改行数、ビットイメージの幅、です。「幅」は 8 ドット単位の値です。

ビットイメージ化された文書は次のような手順でプリンタコードに変換されます。

1. プリンタの初期化

    bit_image_mode を出力します。

2. 各ページの出力次の手順によって各ページを出力します。

(a) dviprt 内部のページ単位の情報を初期化未出力の縦方向のスキップ量 (すなわち改行数) を 0 に初期化します。以下の説明ではこの量を V SKIP と表わすことにします。

(b) ページ上部から順に各行を出力。各行の出力手順については後述します。

(c) 改ページ

最終ページでなければ form_feed を出力。

3. プリンタの復帰処理

normal_mode を出力します。

各行は、以下の手順で出力されます。

1. dviprt 内部の行単位の情報を初期化未出力の印字ユニットの横幅、横方向のスキップ量、をそれぞれ 0 に初期化します。以下の説明では、これらの値をそれぞれ DSIZE、 HSKIP と表わすことにします。

2. 空白の検査、ビットイメージの出力、空白部分のスキップ次の手順を行の左端から順に右端 (行末) まで繰り返す。

(a) 行の左側から順に、幅 minimal_unit のユニットを取り出す (cf. 11.5 p.13)。 minimal_unit よりも少ないデータしか残っていなければ、その残り全てを取り出す。

(b) ビットイメージとして出力するデータのバッファリング取り出したデータに空白以外のデータが含まれていれば未出力の印字ユニットにこれを加え、加えたデータの横幅だけ DSIZE を増やす。出力はまだ行なわない (手順 2c または 3 でまとめて出力する)。

(c) ビットイメージの出力取り出したデータが全て空白データであった場合、もし DSIZE > 0 であれば、次の手順により未出力の印字ユニット (cf. 11.6 p.15) を出力する。 i. 垂直方向の移動

V SKIP の分だけ line_feed を出力後 V SKIP を 0 にリセットする。 ii. 水平方向の移動

HSKIP の分だけ横方向にスキップ (すなわち skip_spaces を出力) し、 HSKIP を 0 にリセット。 HSKIP > maximal_unit ならば maximal_unit 以下の量に分割して出力する。

iii. NON_MOVING の処理

upper_position の項目に NON_MOVING の記述があれば HSKIP に DSIZE の値を代入。 iv. ビットイメージの出力

以下の手順を DSIZE > 0 の間繰り返すことによって未出力の印字ユニットを出力する。この手順によりビットイメージが maximal_unit 以下の幅に分割されて出力されることになる。 A. 幅 DSIZE の印字ユニットのうち幅 maximal_unit のユニットを取り出す。

DSIZE < maximal_unit であれば残りのデータ全てを取り出す。

 B. send_bit_image を出力。

C. 取り出したユニットを upper_position に設定された内容に従って加工し、出力する (cf. 11.7 p.15,

11.8 p.15)。

 D. after_bit_image を出力。

E. 出力したユニットの幅だけ DSIZE の値を減らす。 v. 取り出した空白データの幅だけ HSKIP を増やす。

3. 未出力のビットイメージデータの出力行末までこれらの処理を繰り返した後、未出力の印字ユニットが残っていれば手順 2c と同じ手順で出力する。

4. 改行 V SKIP を 1 増やす。改行コードの出力はまだ行なわない (手順 2(c)i で行なう)。

\underline{11.6. プリンタ定義ファイルの記述に関する注意点 15}

[figure: minimal unit; 空白データ; DSIZE × 8 ドット; HSKIP × 8 ドット; ×8 ドット; 処理済みデータ; 未出力ユニット; 空白データ; pins ドット]

図 11.6: 印字ユニット

ただし、手順 2b で行なわれる空白のチェックは、 skip_spaces が空文字列でない場合 (すなわち何等かのコードが指定されている場合) にのみ行なわれます。当然ですが、 skip_spaces の命令が無ければ横方向のスキップが行なえないからです。結果として空白データも印字ユニットの一部として出力されることになります。

  また、 upper_position が LEFT_IS_HIGH、または LEFT_IS_LOW のもので、かつ bit_row_header が指

定されている場合には、縦 1 ドット分のデータ毎に、そのデータの先頭に bit_row_header を付加して出力します (cf. 11.8)。

改行や水平スキップは印字データを出力する直前にのみ出力されることになりますからこの手順は次のように考えることも出来ます。

• 空白データは出力しない。

• 従って印字命令には印字位置を合わせるための移動命令 (水平移動や改行、改ページ) を先行させる。

⋯

⋯

              send bit image
                                                                   pins ドット
                                                                    after bit image

⋮ ⋮

⋯

イメージの横幅

⋮

図 11.7: 出力コード

⋯

⋯

⋯
⋮

      send bit image
                       bit row header

イメージの横幅

⋮ ⋮

                                                                            pins ドット
                       bit row header

⋮

                       bit row header

                                 図 11.8: bit row header

11.6 プリンタ定義ファイルの記述に関する注意点

ここではプリンタ定義ファイルを新たに記述する際の注意事項を例を挙げて述べます。

after bit image

[figure: pins ドット; 1000 ドット; 200 ドット; 400 ドット; 400 ドット (maximal unit×8); 1 回目の出力; 2 回目の出力; 3 回目の出力]

図 11.9: 一度に小さいイメージしか扱えないプリンタ

11.6.1 maximal unit

この項目はプリンタの印字可能領域の最大幅を差すものではありません。しばしば混同されるようですので注意してください。印字可能領域の最大幅は、 dviprt のコマンドラインオプションのうち新サイズオプションであれば-MW、そうでなければ-W を用いて指定します。

maximal_unit は、一度にプリンタに送ることが出来る横方向の送り幅 (バイト単位) です。横方向の送り幅とは前述したようにビットイメージの横幅や横方向のスキップの移動幅のことです。ここでは例として横 1000 ドットのイメージをプリンタに送る場合を考えます。

• 一度に幅 400 ドットのイメージまで扱えるプリンタの場合イメージを 400, 400, 200(ドット) の幅に分割して、計 3 回に分けてプリンタに送信する必要があります (cf. 11.9)。この 400, 400, 200 ドット幅のイメージデータそれぞれに対して send_bit_image, after_bit_image, bit_row_header が付加されて出力されることになります。このようなプリンタでは、

例 :

    maximal_unit    : 50

と指定しておきます。バイト単位であることに注意してください。

• 一度に十分広い幅のイメージを扱えるプリンタの場合十分に広い幅のイメージ、つまりプリンタの最大印字可能幅以上の幅のイメージ、を一度に扱えるプリンタでは maximal_unit は十分に (必要以上にでも可) 大きく指定しておきます。現在あるプリンタのほとんどはこの条件を満たします。例えば次のように設定しておきます。

例 :

    maximal_unit    : 10000

11.6.2 minimal unit

skip_spaces が空のとき、空白データかどうかのチェックは行なわれませんから minimal_unit の値は結果として出力コードに影響を与えません。このことを利用して、 PBM フォーマットでの出力など空白のイメージデータをスキップ命令や改行で置き換えるべきでない場合に対応できます。

似たような設定に minimal_unit を十分に大きく設定しておく、というものがあります。例えば、

例 :

     minimal_unit    : 10000

のようにする場合です。この場合行全体が最小単位として扱われますので、

• 行全体が空白の場合

この行のデータは改行命令に置き換えられます。

• 行に空白以外の部分がある場合行全体をビットイメージとして出力します。

つまり、空行を改行命令に置き換えるということは行なわれますが空白のユニットをスキップ命令に置き換える、ということは行なわれません。

以下では minimal_unit の値と出力コードのサイズの関係について述べます。従って skip_spaces に何等かの命令が定義されていて空白データのチェックが行なわれる場合についてのみ考えます。

minimai_unit は、空白データかどうかを調べる際の最小の単位ですから、この値が小さいほど、ビットイメージの印字命令の代わりにスキップ命令が出力される頻度が増すことは前に述べました。

一行の印字を考えた場合、出力されるプリンタコードはスキップ命令とビットイメージの印字命令が交互に並んでいます (maximal_unit が小さい場合には必ずしもそうはなりませんがここでは考えません)。

ここで出力コード全体のバイト数に大きく影響するのがこの印字命令のうちイメージデータを除いた部

分、すなわち skip_spaces、 send_bit_image、 bit_row_header および after_bit_image のバイト数

です。スキップ命令が多く使われるほど出力されるイメージデータそのものの大きさは小さくなりますが、その代わり印字命令とスキップ命令の切替時に出力されるコード、つまり上記の 4 つの項目で定義されるプリンタコードが出力される頻度が増します。

例として pins = 48 のときにイメージ 8 ドット、空白 8 ドット、イメージ 8 ドット、というビットイメージを印字する場合を考えます。

  skip_spaces が 2 バイト、 send_bit_image が 10 バイト、 bit_row_header と after_bit_image が 0

バイトのとき出力されるプリンタコードのバイト数は、

  • minimal_unit = 1 のとき

(10 + 48) × 2 + 2 = 118 バイト

  • minimal_unit = 10 のとき

10 + 3 × 48 = 154 バイト

と、 minimal_unit が小さいほうが有利です。

  一方、これとは異なって skip_spaces が 2 バイト、 send_bit_image が 5 バイト、 bit_row_header が

4 バイト、 after_bit_image は 0 バイトのときには、

  • minimal_unit = 1 のとき

(5 + 4 × 48 + 48) × 2 + 2 = 492 バイト

  • minimal_unit = 10 のとき

5 + 4 × 48 + 3 × 48 = 341 バイト

と、逆に大きくなってしまいます。これは bit_row_header が大きく影響しているためです。

  一般には、 bit_row_header が定義してある場合や send_bit_image と after_bit_image のバイト数

の合計が pins に比べて極端に大きい場合には minimal_unit を 1 よりも少し大き目に定義しておくほうが出力コードの大きさは小さくなります。出力コードのサイズが最適になるような minimal_unit の値のおおよその目安は length (strings) をstrings のバイト数として、

    { length (send bit image) + length (after bit image) + length (skip spaces) }/pins +
                                                              length (bit row header)

と表わされます。

以上のことは出力データのサイズのみに注目した場合の最適値について述べたものです。実際にはプリンタの機械的動作の速度、印字結果の品質、プリンタ命令の精度なども考慮すべき要素です。これらとのかねあいで最も適した値を選んでください。

11.6.3 トップマージンが無視される場合の対処

ページのトップマージンが無視される場合にはページの先頭で出力されるプリンタコード、すなわち bit_image_mode と form_feed に対し以下のような何種類かの変更を試してみてください。

• 改ページコードを加える。

• 横 1 ドット幅の空白のビットイメージやタブやスペースなどの空白文字の印字を行なうコードをつけ加えておく。

ただし、このときこのコードによって印字位置が移動してしまったのを元に戻すために復帰コード (同じ行の行頭に移動する命令 (多くのプリンタでは 0D。絶対位置指定での水平位置 0 への移動でも可) をその直後に追加してください。

11.6.4 旧仕様との互換性

現在のプリンタ定義ファイルの仕様は旧仕様の上位互換になっており、新しいoptcfg.exe でも旧仕様のプリンタ定義ファイルはそのまま処理できます。しかし、拡張によって旧仕様のいくつかの機能は必要なくなったり、より一般的な項目・表現によって置き換えが可能になったりしています。

ここではそのような機能が現仕様においてどのように置き換えることができるのかということを述べます。

11.6.4.1 HEX MODE

従来 upper_position の項目で HEX_MODE を指定することによりビットイメージデータを 16 進テキストで出力できていましたが、これは項目 encode で HEX を指定することと等価です。

11.6.4.2 constant

項目 constant を使った数値の出力については書式指定の「式」を使って同じ結果を得ることができますのでこの説明では触れていません。 optcfg.exe やdviprt は constant を使ったプリンタ定義ファイルも受け付けますが、新たにプリンタ定義ファイルを作成する場合には constant は使わないようにしてください。

11.6.4.3 書式指定

プリンタコード型の項目の書式指定には従来 D、 DD、 DDD、 T、 M、という書式オプションが用意されていました。現在の仕様でもこれらは引き続き使用可能ですが、これは旧仕様に従って記述された*.src との互換性のためです。現在の仕様では式による表現に置き換えることが出来ますので新しくプリンタ定義ファイルを記述する際にはそちらを使用するようにしてください。

これらの書式オプションはそれぞれ以下のような式による表現で代替えが可能です。

従来新仕様

      D     d/2 または d>1
      DD    d/4 または d>2
      DDD   d/8 または d>3

T     d*“pins の値/8” または d*v または s

      M     d*“constant の値” または d*c

実際、 optcfg.exe でこれらの書式オプションを含んだ*.src を処理すると自動的に等価な「式」に変換します。どのような式に変換されるかはoptcfg.exe のオプション-r を使って*.cfg を逆変換することによって知ることが出来ます。

索引

after_bit_image, 4, 14, 17
bit_image_mode, 4, 13
bit_row_header, 4, 15, 17
constant, 18
dpi, 5
encode, 5
form_feed, 5, 14
HEX_MODE, 18
HIGH_BIT, 2
LEFT_IS_HIGH, 2
LEFT_IS_LOW, 2
line_feed, 5, 14
LOW_BIT, 2
maximal_unit, 4, 14, 16
minimal_unit, 3, 12, 14, 16
NON_MOVING, 3, 14
normal_mode, 4, 14
optcfg.exe, 1, 18

pins, 3, 12

send_bit_image, 4, 14, 17
skip_spaces, 5, 16, 17
upper_position, 2
y_dpi, 5

エスケープシーケンス, 8 データ圧縮, 5, 10 ピン配列, 2 プリンタ定義ファイル, 1