CSSとperlの小ネタめも

電子書籍がらみ。HTMLとCSSでどうやって表示・表現すればいいんだろうと調べたことをメモしておこう。
【横書き】
1M(1メガバイトは)は、2の20乗バイト(2<span style="font-size:0.6em;padding-botto:0em;vertical-align:top">20</span> = 1048576バイト)です。
この文字の右肩に小さくついてる「20」ってどうすんだ、画像にしてくれなきゃ無理だろ、と思わず担当者にメールしようとして思いとどまった。調べた。
右肩に小さくつけたい文字をspanタグで囲み、spanタグにスタイル指定
font-size:0.6em padding-bottom:0em vertical-align:top
フォントサイズを小さくして、下側のpaddingを0にして、表示の基準ラインをトップにする
(padding-bottom は指定しなくて大丈夫っぽいけど…どうして指定してあったんだろう)
【縦書き】
縦中横をperlで一括処理する。
単純に、すべての半角アルファベットに縦中横のタグをつけるのは簡単な正規表現。
このあたりに → 『ルビのため perl unicode正規表現』
縦書きなのにやたら英単語が混じると、単語の長さによって縦中横になったりならなかったり、とても読みにくい。ということで、アルファベットの縦中横について
・アルファベット一文字は縦中横にする
・英単語は縦中横にしない
英単語をとりあえず別形式にエンコードして保護しておく。
「tab+アルファベットの10進数」
タブだったら原稿に混じり込む可能性は少ない。タブ+数字というのはまず出てこないだろう。
$line =~ s!([a-zA-Z][a-zA-Z]+)!&encode_alpha_words($1)!eg;
sub encode_alpha_words{
my $args = shift;
my $ret;
foreach (split(//, $args)){
$ret .= sprintf qq{\t%s}, ord($_);
}
return $ret;
}
一文字のアルファベットに縦中横を定義したクラスを指定。
$line =~ s!([a-zA-Z])!<span class="tcy">$1</span>!g;
タブ+10進数にしておいたアルファベットの英単語を元に戻す
$line = &decode_alpha_words($line);
sub decode_alpha_words{
my $args = shift;
$args =~ s/\t([0-9]+)/pack("C",$1)/eg;
return $args;
}
(上記、正規表現のところをいじれば、アルファベット2文字までは縦中横にする、3文字以上の単語はそのままにする、なんてことも出来る。でも、中途半端な設定は読みにくくなるだけ)
ていうか、そもそも、アルファベットの英単語や数字が入り乱れる「実用書」なんて縦書きである必要は感じない。底本が縦書きであっても、電書にする時には横書きで十分。縦書きの底本は全角半角アルファベットがその時々で別々。正直とても読みにくい。小説でもないのになんでまた縦書きにしたんだろう。謎だ。

