2012-01-01から1年間の記事一覧

TextCtr のフォーカスがオン・オフになったとき背景色を動的に変化させる(wxHaskell)

TAB キーでTextCtrlを移動してフォーカスがON、OFFになたとき、または、マウスでTextCtrlを選択してフォーカスがON、OFFになたときに背景色を変化させたい。 現在どの wxTextCtrl に入力しているか明確にするために、フォーカスがオンになっている wxTextCtr…

Haskell から nkf を直接使って文字コードを変換する。

Cinnamonのインストールが出来たら使ってみます。 NKFの使い方については「Rubyist Magazine 標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv」のNKFの部分に丁寧な説明があります。 -- 「標準添付ライブラリ紹介 【第 3 回】 Kconv/NKF/Iconv」より --…

nkf を使用した文字コード変換ライブラリCinnamonのインストール

CinnamonはHaskellからnkfを呼び出し、文字コードを変換するためのライブラリです。便利なライブラリなのですがエラーが発生するため、そのままではインストール出来ません。修正してインストールする手順をまとめました。 こちらよりcinnamon-0.2.tar.gz を…

nkf を使用した文字コード変換ライブラリCinnamonのUCS4->UTF8の変換

nkf を使用した文字コード変換ライブラリCinnamon についてUCS4⇔UTF8の変換にてバグらしきものを発見したと指摘があります。指摘されているのは UCS4 の1文字を Utf8 の複数バイトに変換する ucs4CharToUtf8Chars 関数です。文字列を変換して比較し、ucs4Cha…

Haskell でSJIS文字列に変換したときのバイト数を得る。

Haskell でSJIS文字列に変換したときのバイト数を得る。 ターミナルに表を表示するときには固定幅フォントを使いますが、アルファベット、半角カナの混じった日本語を使って表を表示すると表が乱れてしまいます。 幅が半角フォントは全角フォントの半分です…

COM を学ぶ(11) : HaskellでExcel(ワイド文字列バージョン)

Haskell から COM を呼ぶ場合 HaskellからSJISに変換した後に MultiByteToWideChar、 WideCharToMultiByteを使用していましたが、Haskell はUcs4、COMはUTF16を使っていますので、日本語で使う分には文字コードを変換する必要はありません。 SysAllocString …

char wchar_t BSTR 文字変換テスト

Haskell から COM を呼ぶ場合 HaskellからSJISに変換した後に MultiByteToWideChar、 WideCharToMultiByteを使用していましたが、Haskell はUcs4、COMはUTF16を使っていて、日本語で使う分には文字コードを変換しなくても良いはずです。 そこで、WideCharToM…

COM を学ぶ(10) : SysAllocString を使って BSTR を作る。

Haskell から COM を呼ぶ ために MultiByteToWideCharを使わないでSysAllocStringで行うためのテストです。 SysAllocString で BSTR を作りますが、SysAllocStringはバイナリの文字列長を含まないワイド文字列の先頭アドレスを返します。読み取るときはCWStr…

オプションに -dAutoRotatePages=/None を指定しないと意図しないところで180度回転する。(ps2pdf)

GhostScriptには色んな機能がありパラメータが複雑です。ps2pdfはPostScript から PDFを生成する機能に特化したツールで内部でGhostScriptを呼んでいます。 GhostScriptのコマンドで書くとこんな感じ。 gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile…

Vector 用ツール

リストには関数が多数定義されていて便利なのですけれども、速度はVectorにかないません。 そこで Vector を便利に使うための関数を作って集めていきます。 catMaybes の Vector バージョン catMaybes を各要素がMaybe型のリストに適用するとNothing の要素…

スタックに渡された値を辞書に登録する様子

スタックに積んで渡された値を辞書に登録するとローカル変数のように使えて便利です。 登録は以下のような手続きで行います。 /valueName exch def スタックの値を登録するのに exch でスタックの順番を入れ替えて def しています。 その様子を見てみます。 …

文字の輪郭を描く

「PostScript実習マニュアル 3.8.12 文字列の輪郭」に文字列の輪郭の輪郭を描く例があります。 (文字列) false charpath false は、塗りつぶすのに適したパスを作成するか、線を描画するのに適したパスを作成するかを示すもので、この場合は線を描画するのに…

枠内におさまるように文字列の横幅を自動調整2(PostScript)。

PostScriptで表を作るとき、長い文字列でも枠からはみ出さないように文字列の横幅を自動調整して印字する手続きを作りましたが、今度は同じ機能ですが、横幅をスタックにつんで渡すバージョンです。辞書によるローカル変数を使っていますのでコードがすっき…

文字列を指定された幅の文字列に分割して配列に入れる。

表の枠内に印字するときに1行に収まらないときは改行するというのは作りました。 今度は1行に収まるときは縦位置を中央に、2行、3行と増えても縦位置を中央に印字したいのです。 そのために文字の幅に応じて文字列を分割し、配列に入れて表示する手続きに渡…

指定された幅の文字列と残り文字列に分割する。

%!PS-Adobe-3.0 2.834645669 2.834645669 scale newpath /vPosition 297 20 sub def % A4 297mm /newLineHight 12 def /Left 20 def /Space 3 def /hPosition Left Space add def /newline { /vPosition vPosition newLineHight sub def hPosition Space add…

配列にオブジェクトを追加する。

配列にオブジェクトを一個追加する手続きです。 % 配列にオブジェクトを追加する。 % stack : obj array /s3dict 1 dict def /addToArray { s3dict begin /obj exch def % 追加するobj /baseArray exch def % 受け取った配列 /baseLen baseArray length def …

二つの文字列を連結する手続き(PostScript)

スタックに詰まれた二つの文字列を連結する手続きです。 % stack : string string /s2dict 1 dict def /joinString { s2dict begin /str exch def /strBase exch def /baseLen strBase length def /strLen str length def /newString baseLen strLen add str…

PostScript でフラクタル

PostScript TUTORIAL and COOKBOOKの72ページ。72 Chapter 7: LOOPS AND CONDITIONALS に再帰でフラクタルを描くサンプルがあります。パラメータを変えると図形も変ります。 /depth 0 def /maxdepth 15 def /down {/depth depth 1 add def} def /up {/depth …

PostScriptでフィボナッチ数列を計算

PostScriptで再帰が出来るのだからとフィボナッチ数列を計算してみました。 %! /fib { dup 0 eq { pop 1} {dup 1 eq { pop 1 } { dup 1 sub fib exch 2 sub fib add } ifelse }ifelse } def 0 1 20 {fib ==} for else へ値を渡すのには dup によりスタックの…

PostScriptの配列が構築される様子

PostScriptの配列が構築される様子が面白い。 配列の先頭の'['はスタックにマークを作るためのオペレータです。 '['が実行されるとスタックにマークオブジェクトが作られます。 PostScriptの配列が構築される様子を見てみます。 GS>[ % マークオブジェクトが…

PostScript で再帰により階乗計算をする様子

PostScript TUTORIAL and COOKBOOKの70ページ。70 Chapter 7: LOOPS AND CONDITIONALS に再帰で階乗計算の結果を印刷するサンプルがあります。その階乗計算の部分。 /factorial %stack: n --- n! (after) { dup 1 gt {dup 1 sub factorial mul} if } def pri…

loop で無限ループを作りexitで脱出する(PostScript)

repeat、forが繰り返す条件を指定して手続きを呼ぶのに対し、loopは無限ループを作り実行中に条件を判定して脱出します。 GPL Ghostscript 9.06 (2012-08-08) Copyright (C) 2012 Artifex Software, Inc. All rights reserved. This software comes with NO …

100 /xpos exch def という動作(スタックマシンの動作)

スタックに 100 が積まれているときに /xpos exch def という動作はどのようになるのか追ってみます。 %!PS-Adobe-3.0 GPL Ghostscript 9.06 (2012-08-08) Copyright (C) 2012 Artifex Software, Inc. All rights reserved. This software comes with NO WAR…

PostScript でShift-JISの1バイト文字、2バイト文字判定

先の「文字列が枠内におさまるように自動改行しながら印刷する(PostScript)」はEUC-JPバージョンでした。これを Shift-JIS で行うには1文字と残りの文字列に分けるための判定方法を変更する必要があります。 Shift-JISの半角文字は0x80〜0x9F、0xE0〜0xFF を…

PostScript で 機種依存文字でも文字化けのないPDFを作る(Windows限定)。

今までは以下の理由でEUC-JPのフォントを使ってきました。 Shift-JIS は0x5cを含む文字が文字化けを起こす。 UTF-8 はデフォルトでインストールされていないこともある。 日本語文字列出力を参考に、EUC-JPでテキストを作り、/Ryumin-Light-EUC-H のように E…

ps2pdf で Windows TrueTypeフォントを使う。(PostScript )

Cygwin + Ghostscrpit + Windows TrueTypeフォントに Ghostscrpit で Windows TrueTypeフォントを使う方法が掲載されていました。 GhostscrpitはC:\Program Files\gs\gs9.06\lib\cidfmap に記載されているフォント使いますので、ここにフォントを追加します…

文字列が枠内におさまるように自動改行しながら印刷する(PostScript)。

PostScriptで表を作るとき、長い文字列でも枠からはみ出さないように自動改行しながら印刷します。 %!PS-Adobe-3.0 % EUC-JP で記述すること。 2.834645669 2.834645669 scale % これでポイントだった単位がミリになります。 newpath /Ryumin-Light-EUC-H fi…

1バイト、2バイト、3バイト文字の入り乱れたEUC-JP文字列を1文字ずつ出力する(PostScript)。

文字列を出力して行末に達したときは、改行して次の行の先頭から表示しなければなりません。 行末に達したかどうかは currentpoint で現在の位置を求め、 stringwidth で印刷しようとする文字列の幅を求めれば良いのですが、長い文章全体の幅を求めても意味…

文字列が枠内におさまるように文字列の横幅を自動調整する(PostScript)。

PostScriptで表を作るとき、長い文字列でも枠からはみ出さないように文字列の横幅を自動調整します。 %!PS-Adobe-3.0 2.834645669 2.834645669 scale newpath /vPosition 297 20 sub def % A4 297mm /Space 3 def /CellW 100 def /ADJW CellW Space 2 mul su…

PostScript の文字列長、文字幅

PostScript で日本語の文字列を扱う場合、半角文字は1文字を長さ1と数えますが、全角文字は1文字を長さ2として計算します。 %! /Ryumin-Light-EUC-H findfont 20 scalefont setfont % 文字列の長さ (1) length == % -> 1 (日) length == % -> 2 (abcあいう) …