Mac emacs PostSrcipt印刷 日本語文字化け対策2023-01-22

Machine : MacBookPro (2019)
OS Ventura 13.1

Install
emacs 28.2
TexShop 5.10
Printer CANON G5030

emacsから印刷する際に、postscriptを指定すると日本語が文字化けしてました。
長めのソースを印刷する場合など、emacsが色付けしてくれているそのままを印刷できると読みやすくて嬉しいのです。
ネットを見たら悩んでいる人は多いらしく、いろんな記述がありましたが、印刷がモノクロだったり、結局文字化けがあったりで私の環境ではなかなか上手くいきませんでした。
ns-printなら文字化けしないのですが、フォントが大きくてその分紙の無駄が多いし、何より美しくありません。
(ps-print-buffer)や(ps-spool-buffer)してからの(ps-despool)なども試したのですが、全て印刷出力のところで文字化けしてしまいます。
なんとかたった一つだけ、次の手順で処理すれば文字化けせずに美しい印刷ができました。
M-x ps-spool-buffer-with-faces とやって、できた*PostScript*というバッファに移動し、そのバッファに名前をつけて保存し、それをTexShop付属のps2pdfにてPDF化してから印刷するという手順です。


この一連の処理をショートカットキーに登録して呼び出せるようにしました。
https://club.jidaikobo.com/knowledge/129.html   <--このサイトの記述を参考にさせてもらいました。時代工房さんの2013年頃の記述ですが、2023現在は途中のフォントの設定は不要になっています。
最後の部分に記載されていたemacs-lispのソースを流用させていただきました。

.emacs.d/init.el に次の記述を入れました。
(global-set-key (kbd-"s-P")
       (lambda ()
       (interactive)
       (when (and
             (yes-or-no "PSprint current buffer?")
             (or 
             (<== (length (buffer-string)) 25000)
              (and (> (length (buffer-string)) 25000)
                 (yes-or-no "Buffer is large. It'd use lots of paper. Still do it?"))))
               (ps-spool-buffer-with-faces)
;;               (sleep-for 3.0)
               (set-buffer "*PostScript*")
               (write-file "psprint.ps")
               (shell-command-to-string
                 (mapconcat #'shell-quote-argument
                  (list "ps2pdf" "psprint.ps") " "))
                 (mapconcat #'shell-quote-argument
                  (list "lpr" "psprint.pdf") " "))
                )))
(setq ps-paper-type 'a4small)

[Shift]+[Command]+[P]キーでインタラクティブにpostscriptでカラー印刷します。
編集しているファイルと同じフォルダーにpsprint.ps とpsprint.pdfという二つのファイルが作成されます。psprint.pdf がプリンタに送っている本体ですので、必要な場合は名前を変えて保存しておいてください。
途中の行にある3秒スリープはコメントアウトしてありますが、大きなファイルを印刷する場合に必要かと思って残しています。私の環境では25Kbyteまでやってみて不要でした。
最後の行は、印刷サイズでa4を指定すると何故かヘッダ上部が欠けて印刷されていたので、a4smallにしてみたらいい具合におさまりました。私の環境だけかもしれませんので不要でしたら入れなくていいです。

pd.append が使えなくなるのでその対策2023-01-31

これまでの自分のアプリを実行すると以下のワーニングがたくさん出て、いずれpd.appendは使えなくなるからそのかわりにpd.concatを使えとのこと。
 FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

私のソフトでは横に大きな(41カラム)データフレームに対して、数項目しかデータを持たな行を追加する際 pd.Serial を作ってそのカラム名をインデックスとして pd.append で行に足し込んでいた。

これと同じことが pd.concat でできるのか調べてみたらできて、案外簡単に実装できた。

訂正前
①s = pd.Series([curmon,'GAS',c[5],c[1]+'('+c[0]+')'], index=['日付','区分','出金','摘要'] , name= Cindex)
②df = df.append(s)

訂正後
① s = pd.DataFrame(data=[[curmon,'GAS',c[5],c[1]+'('+c[0]+')']], columns=['日付','区分','出金','摘要'])
 ②df = pd.concat([df,s],ignore_index = True, axis =0)

要は、データをシリアル化してやり、それぞれのデータをどの列に入れるかをcolumnsで指定してデータフレーム化してやると問題なく行追加できる。問題はこの訂正場所がソフト中に8箇所もあるという点。でも emacs だとそれが俊速でできてしまうという追加のお話。

まず①行目
最初に検索バッファにpd.Seriesをセットしておいて、
C-s <ret><ret> M-b M-d DataFrame C-f  [  C-M-n  ] C-f C-f  M-d  columns  C-e M-b M-b M-d M-d <bs>
これで1行分完了、これを必要数繰り返すだけ。
やっていることは、検索移動とワード単位の削除や対応括弧への移動とを組み合わせてをやっているだけだけど、こうやって文字で書くと長いけど、キーは単語打ち込み以外は10回程度なので大したことない。
2行目は固定処理なのでそのまま行を入れ替えれば終わり。

やっぱ emacs はええなぁ、使えば使うほど指に馴染む。先達に感謝。