パソコン・インターネット

2018年6月 2日 (土)

Pangoでマイナススペース

Pangoでマイナススペース

はじめに

以前、Pangoにマイナススペースが欲しいと書いたことがあります。Pangoって何のソフト?という記事でした。マイナススペースがあると、余計な空白を詰めるとか、ルビをふったりに使えるからです。前提としてはプログラムを作るんじゃなくて、マークアップだけでやるという話になります。

で、できました。letter_spacing属性に負の数値を指定します。ただし文字の大きさに依存する調整パラメータになってしまいます。

けっこうめんどうなので、順をおって書くことにします。

続きを読む "Pangoでマイナススペース" »

2018年3月25日 (日)

手動で文字間空白をコントロールするフォント

DroidSansJapaneseやDroidSansFallbackと組み合せて使う、手動で文字間の空白をコントロールするためのフォントを作ったので置いておきます。ライセンスはApache 2.0です。

要するにかっこ類が半角幅になったやつですが、その他にもいくつか収録しています。

ダウンロード KozaikuSansJapanese.zip

フォントの指定順は、(1) このフォント、(2) 欧文フォント、(3) DroidSansJapaneseとDroidSansFallbackとすることを想定しています。つまり、このフォントには変更したグリフ以外は入っていません。

おもな内容は次のとおりですが、詳しくは同梱のREADME.txtを読んでください。

  • かっこ類
  • 空白類
  • EM DASHと2倍、3倍EM DASH
  • 3点リーダー、大文字のローマ数字1〜12 (欧文フォントのはあわないので)
  • UIフォントふうの半角カナ
  • 私的領域にルビとして使えるかもしれないフォント
  • 全角幅のCOMBINING DOT ABOVE

使ってみた例1:

Pilot_2

一部のカタカナが半角カタカナになっています。また、日付の年月日と数字の間とか、コロンの前とかローマ数字の前は、SIX-PER-EM SPACEです。

使ってみた例2:

Trade

右端に位置する"。"は全角幅ですが、"」""は半角幅になります。また、"」"と"「"の間はEN SPACEが1つです。

見た目に合わせた調整もしてあって、"」"と")"の間にはSIX-PER-EM SPACEが入れてあり、数字と"ト"の間にはふつうは入れているSIX-PER-EM SPACEが入っていません。"ト"の左側の空白量はもともと大きいからです。

2017年7月20日 (木)

Python3のenumは遅い?

Python3.4からenumがサポートされたというので使ってみたところ、どうも遅いらしいです。

以前自分で作ったテキスト処理スクリプトの字句解析部にステートマシンを使っていたので、そのステートを示す定数をenumに変えたところ、もとの整数の変数で代用したものでは2.1秒くらいの処理だったのが、4.2秒くらいに増加しました。

整数の変数を使ったものはこんなコードです。ちなみにこの関数は1行ごとに呼び出していますが、range(4)を外に追い出してもほとんど速度は変わりませんでした。

def _split_words(line):
    ...
    ( ST_INDENT, ST_FIRST_CHAR, ST_SEARCH_TOKEN, ST_TOKEN ) = range(4)
    ( QT_SINGLE, QT_DOUBLE, QT_BACK, QT_NOTHING ) = range(4)
    st = ST_INDENT
    ...
    for idx in range(len(line)):
        ...
        if st==ST_INDENT:
            ...
            st = ST_FIRST_CHAR
        elif st==ST_FIRST_CHAR:
            ....

enumを使ったものは次のコードになります。forループは1文字ずつ全部まわる動作回数の多いコードになりますが、ステート定数は比較と代入しかしていません。

_split_words_st = enum.Enum('_split_words_st', 'INDENT FIRST_CHAR SEARCH_TOKEN TOKEN')
_split_words_qt = enum.Enum('_split_words_qt', 'SINGLE DOUBLE BACK NOTHING')

def _split_words(line):
    ...
    ST = _split_words_st
    QT = _split_words_qt
    st = ST.INDENT
    ...
    for idx in range(len(line)):
        ...
        if st==ST.INDENT:
            ...
            st = ST.FIRST_CHAR
        elif st==ST.FIRST_CHAR:
            ....

OSはLinuxで、Pythonは3.5.3と3.6.2で確認しました。実行時間は_split_words()関数の呼び出し前後をtime.perf_counter()で囲って測っていますが、8万回くらいある呼び出しそれぞれの実行時間を合計しています。

2017年6月25日 (日)

Pangoと倍角ダッシュ

Pangoと倍角ダッシュ

いまさらの倍角ダッシュ問題。

Pangoが使われる描画で倍角ダッシュをどうできるかという話なのですが、PangoではEM DASH (U+2014)もHORIZONTAL BAR (U+2015)も分割禁止なようです。というわけで、どちらも使えます。

確認したPangoのバージョンは1.40.5-1です。

ちなみに、DejaVuSans (バージョン2.37) はHORIZONTAL BARのほうがつながるやつで、DroidSansFallbackFull (バージョン2.53) はEM DASHのほうがつながるやつです。そしてLato (バージョン2.007) はどちらもつながらないのでした。おっとっと。

TWO-EM DASH (U+2E3A) を使えばすむのでしょうが、DejaVuSans (バージョン2.37) とDroidSansFallbackFull (バージョン2.53) には入っていません。TWO-EM DASHが入った規格 (Unicode 6.1.0 2012年) より古いフォントだからあたりまえだけど。Lato (バージョン2.007) はそれより新しいけど入ってない。

2015年12月29日 (火)

Pangoって何のソフト?

Pangoって何のソフト?

はじめに

Pangoっていったいなんなんでしょう? 作っている人がどう思っているかはともかく、現状どうなっているか調べたものを、(五月雨式ですが)書いておきます。まあ、組版をしてくれるんじゃねーの? ということで日本語組版処理の要件(日本語版)を参考に調べました。

Pangoのマークアップだけで〜の続編みたいなものです。Battle for Wesnoth (以下Wesnoth)のgettext機構だけを使って(要するに食わせる文字列だけが変更できる)、きれいに日本語を出そうというのが動機です。

Wesnothは両端揃えしない設定だったので、Imagemagickを使って両端揃えした時の結果も追加しました。

続きを読む "Pangoって何のソフト?" »

2015年10月29日 (木)

Fontconfigを使って日本語斜体を別フォントに置き換える方法

Fontconfigを使って日本語斜体を別フォントに置き換える方法

はじめに

具体例としては特定のソフトの話なのですが、何かのヒントになるかもしれないのでfontconfigの話として書いておきます。そもそもの動機はPangoのマークアップだけで〜の最後をご覧ください。傍点は結構良かったのですが、怪しげなやりかたなのでいつか人に迷惑をかけそうでした。そこで、自分の設定だけで良くしようと思ったのがこの設定を試した理由です。

続きを読む "Fontconfigを使って日本語斜体を別フォントに置き換える方法" »

2015年9月19日 (土)

Pangoのマークアップだけでルビまたは傍点をつけてみようとした結果

Pangoのマークアップだけでルビまたは傍点をつけてみようとした結果

はじめに

(Pangoの属性を使って実現する方法をPangoでマイナススペースに書きました。この記事はその方法を使うまえの結果です)

結論から言うと、ルビは無理で、傍点は良くない方法ならそれらしく見せられます。

PangoというのはLinuxでよく使われるテキスト描画ライブラリらしいですが、それはHTMLのようなタグで文字種などを変えられます。プログラムを組むともっといろいろできるようですが、やりたかったのは、プログラムを修正せずに食わせるテキストだけ変えてルビを打つことです。具体的にはBattle for Wesnoth (以下Wesnoth)のgettext機構を使って、日本語にルビをうつというものです。以下は具体例で説明します。ちなみにlibpangoのバージョンはよく分かりませんが、多分1.36.8です。

まずWesnothのWMLのマニュアルを見ると[message]と[floating_text]中でpangoのマークアップが使えます。[campaign]のdescriptionとかでも使えるようですが、明記されていません。そしてPangoのマークアップのマニュアルを見ると分かる通り、HTMLのルビ相当のタグはありません。

続きを読む "Pangoのマークアップだけでルビまたは傍点をつけてみようとした結果" »

2014年9月 6日 (土)

poファイル向けEmacs font lock

po-modeを使わない場合に、poファイルにEmacsのfont lockで色を付ける設定をしてみました。Local Variablesを使うものと、最後に自前のモードを作ったのも載せておきます。

最初はLocal Variablesでファイルを読んだ時に自動的に設定されるようにしました。これはevalを使うので読み込み時にunsafeであると警告が出ます。

下のコードを最後msgidのコメントとして書いておきます。

# Local Variables:
# mode: Fundamental
# coding: utf-8-unix
# eval: (font-lock-add-keywords nil '(("^#.*$" 0 'font-lock-comment-face t) ("\"[^\"\n]*\"" . 'font-lock-string-face) "msgid" "msgstr"))
# End:
msgid "Sentinel for poedit."
msgstr "これがないとpoeditがコメントを消してしまう。

poeditは、コメントをmsgidの持ち物と思っているらしく、msgidの直前に書いてないとコメントが消えてしまいました。gettext系のツールはおそらくみんなそうなっています。だから最後のmsgidのコメントとして書いておけばいいでしょう。

続きで、msgcatみたいにたくさん色を使う設定も示しておきます。

続きを読む "poファイル向けEmacs font lock" »

その他のカテゴリー