2008年12月10日水曜日

OSXでWindows上のプリンタに印刷

■ 前説

我輩のIT環境は,マシンが Windows2000,WindowsXP,MacOSX Tiger の3台に対し,プリンタは Canon LBP3300(レーザープリンタ)の1台のみ.普段はプリンタを 2000に USB 接続しておき,プリンタの共有をオンにして XP からも印刷できる様にしてある.

以前,OSX のプリンタ設定に「Windowsプリント」という項目があるのに気づいて「こりゃすげー」と感動し,早速試してみたがだめだった.「プリンタの機種」の一覧に Canon プリンタのリストは表示されるが,肝心の LBP3300 が存在しないのだ.この一覧に表示される機種だったら Windows に接続されていても難なく印刷できるのかと思うと(真偽の程は定かでない)大いに残念だが,無いものは仕方ない.

※確か,gimp-print ドライバをインストールしたら一覧に表示されるプリンタが増えたと記憶している.

そもそもこのプリンタは CAPT という Canon 独自のプロトコルを使うので,いささか特殊である.Canon の提供するドライバが「Windowsプリント」に対応していないようなので Windows 上のプリンタで印刷することはまず無理であろう.そう思いつつも,幾つか考え付く方法を試してみたが,やはりOSXが「Windowsプリント」を可能にするのか仕組みが分からないままあがいても仕方が無いので,結局あきらめた.

そういう訳で,OSXでプリンタを使うときは,わざわざUSBケーブルを Windows から Mac に繋ぎ直して印刷するという面倒なことをせざるをえなかった.それが面倒なので普通は,Macのファイルを PDF や PS にして Windows に持っていき,Windowsから印刷する,という方法に甘んじることにした.

それから1年ほどたったが,こういう使い方はやはり面倒である.OSX から Windows 上のプリンタで印刷したいという思いは消えない.

そこで,あらためて調査したところ,Mac から Windows 上のプリンタに出力できる方法があることを発見.実際に試したところ,紆余曲折はあったものの最終的に筆者の環境でも実現することができた.以下,その要約.

■ 設定手順

Windows 上で Ghostscript と RedMon を組合せてやると,Macからも印刷できる.原理は次の通り.

Windows上に仮想PSプリンタを作り,Macからはネットワーク経由でこのプリンタにアクセスする.仮想PSプリンタに来たデータは Ghostscript が橋渡しとなって現実のプリンタに送られる.
詳細な解説や設定手順は以下のページに詳しい.

【参考ページ】
1. WindowsマシンにつながったWindows専用プリンタでWindows用ドライバを使ってLinuxマシン(やMacから)から印刷を行う方法
2. Windows機を仮想PSプリンタ・サーバにする by 小川弘和
3. MacOSXからWindows経由でのプリンタ印刷 by くいくい
  [2009/10/2 追記]本家消失.Googleキャッシュのコピー
4. Windows 機を仮想 PS プリンタにする by たちゃな@巫研
5. Ghostscript + GSview + RedMon によるPostScript互換プリンタで印刷 by <不明>
6. Windows用ドライバしかない非ポストスクリプトプリンタをLinuxのCUPS経由で使う by <不明>
7. [fol] Re: gs driver for ESC/PageS?
8. MacOS X 10.3 (Panther) + MacOSXからWindows共有プリンタに印刷

筆者の2000には Ghostscript が既に入っているので,新たにインストールしたのは RedMon のみ.

上記1~3のサイトを参考に仮想プリンタを設定し,Windows 上でこの仮想プリンタに出力してみたがうまくいかない.相当試行錯誤した結果,筆者の環境では以下の設定により動作するようになった.

1.rspファイルの作成

Ghostscript に渡すパラメータを書いたファイル(拡張子 'rsp')を準備し,好きな所に置いておく.以下は筆者の設定例.
ファイル "LBP3300.rsp'' の中身
-q
-dBATCH
-sDEVICE=mswinpr2
-dNOPAUSE
-dSAFER
-sPAPERSIZE=a4
-r600
-sOutputFile="\\spool\Canon_LBP3300"

Ghostscript の lib フォルダや fonts フォルダを指定するオプションは記述する必要がなかった.環境設定で既にパスを通してあるからだろう.

2.仮想PSプリンタのポートを構成

仮想PSプリンタの出力ポート RPT1 の「ポートの構成」の設定
〔注〕太字の部分が実際に入力する事項
〔注〕path_name は当該ファイルのパス

Redirect this port to the program:
C:\path_name\gswin32c.exe

Arguments for this program are:
@C:\path_name\LBP3300.rsp -

Output:
Program handles output

Run:
Hidden, Run as User チェック

また,仮想PSプリンタのドライバには "Apple LaserWriter Pro 600" を用いた.
最初は "Apple Laser Write II NT" を選択していたが,これは解像度600dpi に対応していないようだったので,採用を取りやめた.

3.レジストリの追加

参考ページ7に書かれた通りに,レジストリを変更する.
具体的には,レジストリエディタ regedit を使って,
[HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Devices]
"EPSON LP-800S"="winspool,LPT1:"
といったエントリを追加する.なお regedit の使用は危険なので十分注意.

4.Mac側でプリンタを設定

参考ページ3の通りに設定すればヨシ.

■ 実行結果

本当に OS X から Windows 上のプリンタに印刷できるようになった!!!

参考ページ3には「範囲指定で印刷すると最初のページしか印刷されない」とあったが,筆者の場合そのような問題は生じなかった.
また,プリンタが動き出す時間も,Mac にプリンタを直接つないだ場合より短くなった.
すばらしい!!
RedMon様々である.

両面印刷やページレイアウトなど,LBP3300 の機能が活用できないという問題があるが,それはまたいつか考えよう.無理かもしれないし.

参考ページ4にある通り,LPD (line printer daemon) を動かすと,仮想PSプリンタをIPプリンタとして使用することもできる.これも動作検証済み.
 

2008年12月4日木曜日

enumerate環境のカスタマイズ

jsarticle.cls使用時のenumerate環境内で,複数行にわたる段落が
1.昔々ある処にお爺さんとお婆さんが住んでいました.お爺さ
んは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆
さんが川で洗濯していると・・・
のようになり,字下げされない.これはイヤだ.どうにも気に食わない.
1.昔々ある処にお爺さんとお婆さんが住んでいました.お爺さ 
んは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆さ 
んが川で洗濯していると・・・
のようにしたい.そこでカスタマイズすることに.

enumerate 環境のカスタマイズ例は以前「list環境前後の空白を調整する方法」でもやった.この環境のベースになっているのは list 環境なので,list 環境関連のパラメータを設定しなおす必要がある.list 環境のカスタマイズについては吉永徹美の LaTeX 研究室の例も参考になる.

list 環境で使用されるパラメータは下表の通りであるが,重要なのは,これらのパラメータを本文中で

\setlength{\itemsep}{1zw}

のように設定しても反映されないということ.プレアンブルで list 環境を再定義する必要がある(他にも方法があるのかどうか私は知らない).

パラメータ 説明
\itemindent ラベルの前に入るスペース。
\labelsep ラベル右端から項目までの長さ。負の値も可。
\labelwidth ラベルを含めたボックス幅。
\listparindent 一項目内の、第2段落以降で用いられるインデント量。
\leftmargin 左マージンから項目内容までの長さ。負の値は不可。
\rightmargin 右マージンから項目内容までの長さ。負の値は不可。
\parsep 各段落間のスペース。
\itemsep 新規項目の前に\parsepと共に入る行間スペース。
\parskip 段落の前に入る縦方向スペース。デフォルトは、ゼロ。
\topsep 前の段落と第一項目までの距離、次の段落と最後の項目までの距離。
\partopsep \parskip\topsepを加えた長さ。

いずれも \setlength\addtolength により値を設定する.
上表は以下の情報を参考に作成.pLaTeX2e handbook熊澤先生のページ


図にすると,こんな感じ↓になるんではなかろうか.なお,解釈が間違えているかも知れないので悪しからず.


それでは,実際のカスタマイズ結果.

jsarticle.cls ではlist 環境を次のように定義している.
\def\@listi{\leftmargin\leftmargini
  \parsep \z@
  \topsep 0.5\baselineskip
  \itemsep \z@ \relax}
\let\@listI\@listi
\@listi
ここには \itemindent\listparindent などが設定されていないので,それを追記した上で,プレアンブルに書いておけばよい.例を示す.

\def\@listi{\leftmargin\leftmargini
 \itemindent 1zw      % 追加
 \parindent\itemindent   % 追加
 \listparindent\parindent % 追加
 \parsep \z@
 \topsep 0.5\baselineskip
 \itemsep \z@ \relax}
\let\@listI\@listi
\@listi

なお,理由は不明だが \labelsep は本文中で設定した値がちゃんと反映されるので,上の例では list 環境の定義内では値を設定しなかった.

この定義を用いると
1.昔々ある処にお爺さんとお婆さんが住んでいました.お爺さ 
んは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆さ 
んが川で洗濯していると・・・
のようになり,目的が達せられる.

1.昔々あるところにお爺さんとお婆さんが住んでいました.お爺
さんは山へ芝刈りに,お婆さんは川へ洗濯に行きました.お婆さ
んが川で洗濯していると・・・


しかし,これで話は終わらない.list環境をプレアンブルで再定義しても,それが small環境内のenumerate環境には反映されないことが発覚したのだ. jsarticle.cls を覗いて small 環境の定義を見てみて驚いた.

\newcommand{\small}{%
 \ifnarrowbaselines
  \@setfontsize\small\@ixpt{11}%
 \else
  \@setfontsize\small\@ixpt{13}%
 \fi
 \abovedisplayskip 9\p@ \@plus3\p@ \@minus4\p@
 \abovedisplayshortskip \z@ \@plus3\p@
 \belowdisplayskip \abovedisplayskip
 \belowdisplayshortskip \belowdisplayskip
 \def\@listi{\leftmargin\leftmargini
       \topsep \z@
       \parsep \z@
       \itemsep \parsep}}

となっているのだ.なんと,smallの定義内で list環境が独自に定義されているではないか.これにはやられた.footnotesizeについても同様だった.何ゆえ一々定義するのか不明だが,そうなっている以上, small 環境内の list 環境をカスタマイズしたければ small 環境も再定義するしかない.先と同様に

 \itemindent 1zw      % 追加
 \parindent\itemindent   % 追加
 \listparindent\parindent % 追加

の三行を追加することにより,問題が解決した.
それにしても何故,jsarticle では文字サイズを変えるたびに list 環境を再定義してあるのだろうか(jarticle.cls の場合どうなっているのかは面倒だから確認していない).謎である.