Enscriptのトラブル(Courierの字抜)の解決策

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript により印刷イメージのPS(PostScript)を生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをGhostscript付属のps2pdfでPDF化すると,どうしても等幅フォントCourierがひどく文字抜けします.アルファベットに関しては,ざっと見て大文字だけ抜けるのかと思えばそうでもなく小文字も多数抜けています.また数字は “1” 以外全部抜けているようです.

This image has an empty alt attribute; its file name is %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-17-13.14.45.png

解決策

enscriptに与えるソースファイル内で,フォント名を “Courier”, “Courier-Bold” などから,それぞれ, “Courier-New”, “Courier-New-Bold” などに変更するだけです.

これだけで,enscriptとps2pdfで正しいPDFができます

This image has an empty alt attribute; its file name is 20240315-good-480x358.png

動作確認できたdistro

  • Slackware ARM (32bit) 15.0
  • Slackware AArch64 current
  • Raspberry Pi OS (64bit) Bookworm
  • Debian AMD64 Bookworm
  • Debian AArch64
  • Manjaro AMD64
  • Manjaro ARM(64bit)

Desktop環境はすべてKDE Plasma Desktopです.PDFの確認はOkularで行っています.

印刷も問題ありません.
Raspberry Pi OSでなく,UEFIブート用の本家Debian.Raspberry Pi OS (64bit)のもとで動く仮想マシン(KVM/QEMU)で稼働.

Enscriptのトラブルの解決法(冗長)

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript (PS=Postscript形式の出力)により印刷イメージのPSを生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをPDF化すると,どうしても等幅フォントCourierが文字抜けします.全部が出ないわけでなく,ざっと見て大文字だけかと思えばそうでもなく,また数字は “1” 以外全部抜けているようです.

解決策

Slackwareにおいては “Courier New” のTrue Typeフォント(TTF)をインストールするだけ

もう少し厳密に言えば,enscriptに与えるフォント名を “Courier”, “Courier-Bold” などから, “Courier-New”, “Courier-New-Bold” などに変更する必要があります

フリーのCourier Newフォントの取得

あちこちにありますが,Fonts Geekというサイトから,Courier NewとCourier New Boldをダウンロードしました(ついでにMonacoも).

Linuxのホストへのインストール

Slackware ARM 15.0のホストにTrue Typeフォントをインストールする手順を探してインストールします./usr/share/fonts/TTFにコピーしてから,テーブルファイルをupdateするコマンドを実行するような方法だと思いましたが,そのとおりでした.

ダウンロードしたフォントのファイル名は, “Courier New Bold.ttf”などスペースが入っていますが, “Courier-New-Bold.ttf” のように,スペースをハイフンに変えました.また, “Regular” は削除しました.

Updateには,mkfontdirmkfontscaleコマンドを使います.

以上でこれまで通り,enscriptとps2pdfで正しい印刷イメージができます.

動作確認できたdistro

上記は,Slackware ARM (32bit) 15.0ですが,Slackware AArch64 currentでも確認できました.

その後,Raspberry Pi OS (64bit) + KDE Plasma Desktopの環境でも試してみました.Debian系で Courier New のTrue Typeフォントをインストールする正攻法は,

apt install ttf-mscorefonts-installer

のようです.これで,Slackware同様にenscriptに与えるフォント名を “Courier-New”, “Courier-New-Bold” などとすることで,正常なPDFができるようになりました.

確認したのは,Slackware ARM (32bit) 15.0のみですが,たぶん,AMD64でも大丈夫だと思います.
むしろ,こちらが必要です.
32bit版.

Enscriptとの格闘(見当外れ)

→ 正しい見解

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript (PS=Postscript形式の出力)により印刷イメージのPSを生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをPDF化すると,どうしても等幅フォントCourierが文字抜けします.全部が出ないわけでなく,ざっと見て大文字だけかと思えばそうでもなく,また数字は “1” 以外全部抜けているようです.

試しにCourierをTimesに変えてみると,全部文字が出ますのでフォントに依存した問題のようです.残念ながらEnscriptに備えられたフォントの中で等幅のものはCourierしかないので,別の等幅フォントをインストールして動くかな,というのが,ここまでの経緯と現在の考えです.

Courierはデータを等幅で印刷するのに非常に優れています.これに代わる等幅フォントがないかとネットでいろいろ調べましたが,少なくとも筆者の趣味に合うものはありませんでした.

そこで,あとの作業が混乱しそうな気もしますが,フリーで出回っている “Courier New” を追加インストールしてみることにしました.Enscriptに大昔, “Monaco” を追加インストールした経験があるはずですが,なんの記録も残っていませんので,ゼロからの出発となります.

想定している手順

  1. フリーのCourier New のTrue Typeのフォント(TTF)をネットで探し出す(たぶん “Courier New.TTF”)
  2. TTFからAFMを作成(事前の調べではLinux用のツールは見つかりませんでしたが,オンラインで変換するサイトが複数あるようです)
  3. Courier New.TTFを正しい方法でホストにインストールする
  4. AFMを/usr/share/enscript/afmに追加し,font.mapを編集する
  5. 自作Perlスクリプトを編集して,これまで “Courier” と指定していたところを “CourierNew” と指定するようにする.
  6. 祈ってパールスクリプトの出力をenscriptにかける
  7. ps2pdf (Ghostscriptの付属品)でPDFに変換して,文字抜けがなければめでたしめでたし

実践

フリーのCourier New

あちこちにありますが,Fonts Geekというサイトから,Courier NewとCourier New Boldをダウンロードしました(ついでにMonacoも).

Linuxのホストへのインストール

Slackware ARM 15.0のホストにTrue Typeフォントをインストールする手順を探してインストールします./usr/share/fonts/TTFにコピーしてから,テーブルファイルをupdateするコマンドを実行するような方法だと思いましたが,そのとおりでした.

ダウンロードしたフォントのファイル名は, “Courier New Bold.ttf”などスペースが入っていますが, “Courier-New-Bold.ttf” のように,スペースをハイフンに変えました.また, “Regular” は削除しました.

Updateには,mkfontdirmkfontscaleコマンドを使います.

AFMファイルの作成

AFMは, “Adobe Font Metrics” というらしいです.Enscriptにはこのファイルが必要です.

事前の調査では変換ツールが見つかりませんでしたが,改めて調べると,ttf2afmというツールがSlackware ARM 15.0のホストにインストール済みでした

出力のファイル名については,/usr/share/enscript/afm内の例に習って,例えば “Courier-New-Bold.ttf” に対応するafmは "cnb.afm" としました.

AFMファイルのインストールとmapの修正

さて,AFMファイルができたので,/usr/share/enscript/afmにコピーします.

同じディレクトリーにあるfont.mapの内容に習って追加したAFMファイルを記述します.

祈って実行

自作のPerlスクリプトで,これまで “Courier” としていたところを “Courier-New” と置き換えて実行し,出力ファイルをenscriptで処理してみます.

成功!

うまくいきました.ただし,Monacoに関してはライセンス上の成約からフォントを組み込めないとかメッセージが出ましたが,出力に全く問題ないので良しとします.

PSファイルは,Ghostscript付属のps2pdfでPDF化しています.

等幅でないので,表はぐしゃぐしゃですが😅
32bit版.
pdfTeXの一部とman pageに書いてありますが,TeX系はインストールしたつもりはないので出所については詳しくわかりません😅

RPi3寿命近いか

長いこといわゆる自作パソコンを公私で使ってきました.最後に組み立てた “私” のほうは第4世代のIntel Core i7 4790Sを積んだデスクトップ機で,メモリーは32GB,ビデオカードは今日誰でも知ることになった “NVIDIA社” のGTX-750Tiです.

Core i7 4790SはWikipediaによれば2014年発売ということですから,組み立てたのはその年か翌年くらいなはずで,10年近く経つわけです.

全く元気で,メインのOSはManjaro AMD64にして,Debian aarch64の仮想マシンを含む,多数の仮想マシンのホストにしています

経験からMBの寿命が近づいたサインは,LANポートの故障,ディスクコントローラーの故障,メモリーエラーなどが出ることです.LANポートの故障やディスクコントローラーの故障は,PCIカードを差して代替しますが,その状態では寿命が近いので新しいMBとCPUと,メモリーなどの物色・購入に着手しました.

そうこう考えると,ほぼ毎日電源をONにしているのに,現用の “自作PC” は非常によく動いてくれてます.最近のGaming PCとは格段の差があるとは思いますが,クロックは3.2GHz (最大4.0GHz)で,あとから買ったMac mini (Space Grey, 2018,Intel Core i7 8700B 6-core)と比べて体感速度は遜色ありません

Raspberry Piも最初のものから,2, 3, 3+, 4, 5と買ってきました.Raspberry Pi 3 Model B+ (RPi3+)については,壊れてもう一台発注したと言う記事が当BLOGに残っていて1台は生きていますから,少なくとも都合2台は買ったことになります

今回Raspberry Pi 3 Model B (RPi3)が,不調になってきました.

最初は今年はじめくらいだったと思います.ルーターから数十cmという至近距離に置いて,防犯カメラから送られるRTSP(Real Time Streaming Protocol)による動画を表示させていますが,Wi-Fiでネットに繋がらなくなりました.テレビの裏においてDVIでテレビにつないでいますが,どうしてもテレビの裏はほこりっぽく,気がつけば基板はほこりまみれになっていました.強制空冷のファンがほこりを呼び込んで,この場所に置くにはふさわしくなかったようです.

このときはほこりを吹き飛ばすことで復活しました.そして,ほこりっぽくなりにくい環境で動いていたRPi3+と入れ替えました.RPi3+は熱を金属ケースに逃がすファンレスタイプです.ほこりっぽいところにはこちらのほうが向いているように思います.

RPi3はほこりの少ない方に持ってきましたが,またWi-Fiが繋がらなくなりました.基板を見てもほこりは全然ないので,ソフト的におかしいのかと,RPi3+のSDカードをクローニングして試しましたが同じです.色々悩みましたが,基板をケースから出して,ほこりが付いているようには見えないのですが,ほこりを吹き飛ばすようなことをしたら復活しました.

でも,いままでの経験から寿命は近いと思います.年末年始にかけてRapsberry Pi 5 Model Bを1台購入して,Raspberry Pi 4 Model B (4GB)が1台浮いていますので,RPi3が壊れたら当面はこれを後任に当てることにします.

個人的には,はんだ付けもドリルでの穴あけもせず,ネジを締めてコネクターを差し込むだけで “自作” とはおこがましいと思いますが,世の中そう呼ぶようなのでそうしときます😥
aarch64以外の内訳はAMD64が8,x86 32bitが2で,投げ出したgentooが2 (AMD64とx86 32bit各1)です.
ただし,Mac miniのCPUはモバイル用ですし,OSも違うので厳密な比較は不可能です
たぶん,記事中で発注したものと思われます.
RPiとRPi2も残っていないから故障して捨てたのだと思います.故障しないと捨てない性格なので😅
OSをクローニングしたら/etc/ssh内のkeyを削除して再作成しないと,どこかのレンタルサーバー屋さんみたいに全部のマシンで同じsshの鍵を使うというお間抜けなことになりますので注意が必要です.

Slackware aarch64でいくことに (6)

性急な判断はせずに,しばらく評価を続けることにします.ただ,評価のために1TBのSSDをまるまるあてがうのはもったいないので,かつてRaspberry Pi 4 Model B (RPi4)の評価用に使用してきた500GB SSDに引っ越すことにしました.

現在このSSDはRaspberry Pi 5 Model B (RPi5)に引き継いでいます.約半分をManjaro ARM64(以下単にManjaro)に,残りの半分をRaspberry Pi OS 64bit (RPiOS)に割り振り,RPiOSはSSDからブート,Manjaroは2GBのSDカードにboot部分を書いてあり,差し込んで起動したらManjaroになるようにしています.

RPiOSでは仮想マシンを扱っていてその仮想ディスクイメージがあるのでこれ以上パーティションのサイズを小さくしたくないので,Manjaroの方を半分にすることにしました.

作業はCore i7のManjaro AMD64上で行いました.まずManajroの内容をすべてManjaro AMD64のディスク上にコピーし,Manjaroのパーティションを削除し,半分サイズでもう一度Manjaroのパーティションを作成し,残りをSlackware aarch64ように切りました.

あとはformatしてコピーです.Manjaro AMD64のディスクに一旦退避したRPiOSの内容を半分に減らしたRPiOSのパーティションに,1TBのSlackware aarch64の内容をまるまる500GB SSDの中の新しいパーティションにそれぞれコピーします.rootのコピーが終わったら,microSDカードをvfatでフォーマットして,ここにSlackware aarch64の/boot部分を書き込みます.

ここまではほとんど物を考えずにできますが,ブートするようにそれぞれの/boot/cmdline.txt/etc/fstabを書き換えるのは慎重に行う必要があります.なんか勘違いやケアレスミスをして1度でブートしないことがよくあります.

ブートがうまくいかないのは,たいていcmdline.txtroot=の間違いです. "root="が抜けていたり,その引数が間違っていたりです.

ということで,500GBのSSDをRPi5に接続して,SDカード無しでブートすると,RPiOS,SDカードその1を差し込んでブートするとManjaroに,SDカードその2を差し込んでブートするとSlackware aarch64が起動するようにそれぞれなりました.

しばらく評価を続けます.