にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

このブログについて

文字・フォント・プログラム・技術・趣味などについて、Twitterでは書きづらい長い内容などをまとめるためのブログです。基本的には自分用のメモとして書いている部分が多いです。

リンク等

Pixiv http://pixiv.me/nixeneko
Tumblr http://nixeneko.tumblr.com/ 絵。Pixivアカウント持ってなくても見れます
Pleroma @nixeneko@nixeneko.info Mastodonとかやってる人はフォローしてください
Twitter @nixeneko  
MediaMarker http://mediamarker.net/u/nixeneko/ 主に文字・言語関係の蔵書
GitHub https://github.com/nixeneko プログラム用、あまり使ってない
ナナシスID ZhRYMnA
デレステID 421820148

同人誌(無料公開)

http://nixeneko.hatenablog.com/entry/c88_russian_alphabethttp://nixeneko.hatenablog.com/entry/c90_greek_latin_cyrillichttp://nixeneko.hatenablog.com/entry/20170811_dentyu

8mmフィルムの簡易テレシネを行う

8mmフィルムで制作された自主制作アニメ作品を簡易的にデジタル化する機会があったので、再度やるときのためにメモとして試行錯誤の記録を書いておく。

8mmフィルムとは

ビデオが普及するまでは、映像はフィルムで撮られていた。
大学サークル等での自主制作アニメーションにおいては、主に8mmフィルムが使われていたらしい(アニメーションに限らずだと思うが)。

8mmフィルムと呼ばれるものにもいくつかの規格があるが、自主制作アニメーションで使われるのは富士フィルムシングル8であったようだ。これは構造上、多重露光といった特殊な撮影に必要な巻き戻しができるのがシングル8だけだったためである。
他にはコダック社のスーパー8という規格があり、現像後はシングル8と互換性がある(フィルムの厚みが違う程度)。このためスーパー8用の機材が現像後の工程ではシングル8でも使える。このほかにも非互換なレギュラー8という規格もあったが省略。

簡易テレシネとは

テレシネとは、フィルム映像をビデオ信号に変換することを指す。
8mmフィルムは幅が8mmのフィルムで、一秒辺り24コマ(16コマという設定もある)が記録される。そのため、一コマ一コマをスキャンして映像として再構成するというのが一番フィルムの情報を失わずデジタル化することができる訳ではある(ちゃんとした8mmフィルムテレシネサービスではそうしている)のだが、個人でやるのは難しい。
その代わり、フィルムを映写機で映写し、それをカメラでビデオ撮影することによってデジタル化をするというのが簡易テレシネである。直接スキャンするのに比べて画質は悪いにしろ、何が写ってるかは把握できる。

映写

使用した機材は次のもの。

f:id:nixeneko:20200227110018j:plain
ELMO ST-180

  • 映写機: ELMO ST-180
  • ビデオ撮影用カメラ: Pentax K-50 (レンズは50mmの短焦点レンズ)

映写機は内部のベルトが溶けてベトベトになっていたため、次のページを参考にアルコールで清掃し、新しいベルトを装着した。

映写機にフィルムをセットする時に、爪の引っ掛かりが悪かったりして何回やってもオートローディングがうまくいかない場合があった。この場合、ロードするフィルムの先端を、真ん中をちょっと膨らませ気味にきれいに切ってやることでうまくロードできるようになる場合があった。しかしこれもたまたまうまくいっただけで逆効果の可能性もある。
f:id:nixeneko:20200227205651j:plain

フィルム自体を切りたくない場合は、白リーダーフィルムをつなぐ。フィルムをつなぐためにはスプライサーとスプライシングテープが必要。
白リーダーフィルムは次のようにスーパー8用のものをebayで購入したが、日本で通販しているところもある。

また、一度上映中にプーリーのベルトを溶着した部分が切れてしまい、フィルムが進まなくなってしまった時があった。このとき、ハロゲンランプの熱ですぐに画面が溶けだして、フィルムが焦げる独特の匂いが漂った。何かあったときにすぐに電源を切れるようにしておかないと、作品を台無しにしてしまう可能性がある。
www.youtube.com
こんな感じにフィルムが沸騰するのが見える。

撮影

4つ切りサイズ(379×539mm)の白画用紙を買ってきて壁にテープで貼り、スクリーンとした。
映写機はちゃぶ台の上に乗せて壁に投影し、なるべく画面が正方形になるような位置に調整し、それが収まるようにスクリーンを設置した。

映写機をカメラで撮影し、ちらつきがなくなるように24fpsに調整しようとしたが、電源入れたてとしばらく動かして温まってからでは速度が変わるため、そんな神経質にならなくてもいいかもしれない。それよりも、ある程度ビデオカメラの絞りを絞った方が上下を動くバーが見えなくなり効果的かもしれない。

一眼レフカメラは小型の三脚に固定し、動画撮影機能で撮影した。この時、フルHD(1920×1080)の24fps(となってるけど実際は23.97fpsだった)で記録。手ブレ補正は切る。絞りはやや絞り気味にしてシャッター速度が速くなりすぎないようにし、ちらつきを軽減させる。
音声はヘッドフォン出力からパソコンのオーディオインターフェースにつないで録音し、後で映像に音を合わせることにした。
露出は固定せず、絞り優先自動露出にした。露出を固定した方が良い結果が得られる可能性があるが、フィルム毎に露出を調整しないといけないため、全体を通してそこそこ見れる結果になる自動露出とした。

カメラで撮影した先頭でこれから映写する作品タイトルを喋って記録しておいたが、これは編集の際に役に立った。タイトルをカメラで映すのでもいいと思う。

音声

映写機には音声のステレオミニジャック出力があったため、そこからPCに接続し、音声はPCで録音した。

音声が記録された8mmフィルムは音声がフィルムの両脇に2トラックあり、バランスよくミックスした状態で上映しないと音が偏った感じになるっぽい。映写機に2つのトラックの音のバランスを調整するつまみがあり、それを弄って調整する。音のバランスはフィルムごとに調整する必要がありそう。次の動画のように売られていたフィルムには音声バランス調整用の映像がついていたようである。
www.youtube.com
(via 簡易テレシネ – こもれび倶楽部)

映写機の音声には全体に「ブーン」というハムノイズが乗っている。
映写機のボリュームが小さすぎるとノイズに埋もれてしまうし、大きすぎると今度は録音時にクリッピングが発生し音割れが起きる。作品ごとに音量等は異なるので、試行錯誤して探るしかないかもしれない。

ハムノイズはAudacityなどで除去できる。音声はAudacityで正規化を行ってからハムノイズを除去した。

Adobe Premiereでの調整

映像は23.97fps(カメラの映像に合わせる)、サイズは1280×960とした(4:3)。
映像と音を配置、シーケンスを映像に合わせるか聞かれるので合わせない、エフェクトコントロールタブから、モーション→位置・スケールを弄ってだいたい画面サイズに合わせる。
その後、エフェクト→ビデオエフェクト→ディストーション→コーナーピンを映像にドラッグアンドドロップ
エフェクトコントロールでコーナーピンを選択、ピンの場所を弄って投影された画面を変形させ、4:3のフレームにフィットするようにする(今回はPC閲覧用のため、セーフティゾーンを考慮せず、画面ぎりぎりにした)
映写機の電源を入れる際にノイズが発生するので、それを基準にして映像と音声の同期をするとよさそう。

このブログについて

文字・フォント・プログラム・技術・趣味などについて、Twitterでは書きづらい長い内容などをまとめるためのブログです。基本的には自分用のメモとして書いている部分が多いです。

リンク等

Pixiv http://pixiv.me/nixeneko
Tumblr http://nixeneko.tumblr.com/ 絵。Pixivアカウント持ってなくても見れます
Pleroma @nixeneko@nixeneko.info Mastodonとかやってる人はフォローしてください
Twitter @nixeneko  
MediaMarker http://mediamarker.net/u/nixeneko/ 主に文字・言語関係の蔵書
GitHub https://github.com/nixeneko プログラム用、あまり使ってない
ナナシスID ZhRYMnA
デレステID 421820148

同人誌(無料公開)

http://nixeneko.hatenablog.com/entry/c88_russian_alphabethttp://nixeneko.hatenablog.com/entry/c90_greek_latin_cyrillichttp://nixeneko.hatenablog.com/entry/20170811_dentyu

TrueType命令で回転するvariable fontを作る

TrueType命令で遊ぶシリーズ。

  1. 初めてのTrueType命令: Windowsでは見えないフォントをつくる - にせねこメモ
  2. フォントサイズに合わせて回転するフォントを作る(1) - にせねこメモ
  3. PPEM・ポイントサイズを表示するフォント - にせねこメモ
  4. TrueType命令で三角関数(sin, cos)を計算する - にせねこメモ
  5. フォントサイズに合わせて回転するフォントを作る(2) - にせねこメモ
  6. TrueType命令で擬似乱数: 線形合同法 - にせねこメモ
  7. TrueType命令でビット演算 - にせねこメモ
  8. アウトラインがぶれるフォント - にせねこメモ

概要

文字が回転するvariable fontを作った。variable fontの変化軸の値をTrueType命令で読み取り、その値に応じてTrueType命令を使ってグリフを回転させている。テストページはこちら。たぶんMacでは動かない。

実行例

f:id:nixeneko:20200202112434p:plain
実行結果の例

序論

OpenType font formatのversion 1.8からvariable font機能が追加された。2016年9月のことである。これにより、変化軸を設定して、それに沿って変化するフォントを作成できるようになった。基本の形の情報と変化した形の差分情報を持たせていて、レンダリング時に変化軸の値を変化させると、形が補間される。3DCGを知っているのであれば、モーフターゲット等と呼ばれる機能を想像するとよい。例えば、セリフ体とサンセリフ体を設定してそれらを切り替えたりその中間にするだとか、文字の太さ(ウェイト)やエックスハイトを自在に変化させることが(ちゃんと設定すれば)可能になる。

このvariable fontへのソフトウェアの対応が最近進んできたので、これを利用して文字の回転を指定できるフォントを作ってみたい。

フォント作成時に設定した変化軸の値は、レンダリング時にユーザー側で変化させることができるが、この値を新規に追加されたTrueType命令GETVARIATIONを利用して読み出すことができる。
このため、以前作成した、TrueType命令を利用してフォントサイズに応じて回転するフォントを改変することによって、文字が回転するvariable fontを作ることができる。

Variable fontについて

variable fontについての概要をつかむには次の記事がよい。

これを読みながらメモしたツイートのまとめが次である。
twitter.com
TrueTypeベースのvariable fontに必須のものは次の通り。

  • 'STAT'テーブル…フォントスタイルをattribute valuesの集合で表現するもの
  • 'fvar'テーブル…フォント内で使われる軸を定義。named instanceの情報も含む。
  • 'gvar'テーブル…バリエーションの変化差分

編集

TTX/FontTools

フォントの編集には、OpenTypeフォントバイナリと編集に便利なXMLとを相互変換できるユーティリティであるTTX/FontToolsを用いる。これは、pythonとpipが入っている環境で

pip install fonttools

とすれば簡単に導入できる。

使用方法としては、

ttx font.ttf

とするとフォントファイルfont.ttfの内容をXML形式でダンプしたfont.ttxが出力される。反対に

ttx font.ttx

とするとfont.ttxをフォントバイナリに変換する。名前が被る場合は#1などの連番suffixがつく。

尚、今回はTTXのバージョンは4.2.5を利用した。.ttxファイルはTTXのバージョンによって書式が変更されていたりするので、別のバージョンでダンプした.ttxファイルを.ttfに再変換するのは避けた方がよさそうに思う。

Variable fontのサンプル

ここで、variable fontのサンプルがアドビによって提供されているので、覗いてみて、参考にする。

GitHubのページのreleaseからAdobeVFPrototype.ttfをダウンロードしてきて、ttxを使ってXMLファイルにコンバートし、variable fontに必須なテーブルである<STAT>, <fvar>, <gvar>をみて参考にした。もちろん、それ以外にもvariable fontで使うテーブルは含まれている(HVAR, MVAR, avarなど)のだが、今回の目的には使わない。

作成

さて、回転するvariableフォントの作成に入る。

のページで作成したフォント

をダウンロードしてきて、TTXで.ttxファイルに変換する。

ttx Arotate.ttf

すると、Arotate.ttxファイルが出来上がるので、これをテキストエディタで開いて編集していく。


まず、<name>の下に、変化軸やインスタンスの名前に使う文字列データを最低限追加しておく。WindowsMac用に2回同じ値を定義した。

nameIDは、0~255は用途が決まっている(または予約されている)ので、256~32767を使う*1

    <namerecord nameID="259" platformID="1" platEncID="0" langID="0x0" unicode="True">
      Rotation
    </namerecord>
    <namerecord nameID="260" platformID="1" platEncID="0" langID="0x0" unicode="True">
      Regular
    </namerecord>
    <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
      Arotate-Regular
    </namerecord>

    <namerecord nameID="259" platformID="3" platEncID="1" langID="0x409">
      Rotation
    </namerecord>
    <namerecord nameID="260" platformID="3" platEncID="1" langID="0x409">
      Regular
    </namerecord>
    <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
      Arotate-Regular
    </namerecord>

そして、variable fontの体をなすための次のコードを<ttFont></ttFont>の下に追加する。

  <STAT>
    <Version value="0x00010001"/>
    <DesignAxisRecordSize value="8"/>
    <!-- DesignAxisCount=1 -->
    <DesignAxisRecord>
      <Axis index="0">
        <AxisTag value="ROTT"/>
        <AxisNameID value="259"/>  <!-- Rotation -->
        <AxisOrdering value="0"/>
      </Axis>
    </DesignAxisRecord>
    <!-- AxisValueCount=1 -->
    <AxisValueArray>
      <AxisValue index="0" Format="2">
        <AxisIndex value="0"/>
        <Flags value="2"/>
        <ValueNameID value="19"/>  <!-- Regular -->
        <NominalValue value="400.0"/>
        <RangeMinValue value="350.0"/>
        <RangeMaxValue value="450.0"/>
      </AxisValue>
    </AxisValueArray>
    <ElidedFallbackNameID value="0"/>  <!-- Regular -->
  </STAT>

  <fvar>
    <!-- Rotate -->
    <Axis>
      <AxisTag>ROTT</AxisTag>
      <Flags>0x0</Flags>
      <MinValue>-180.0</MinValue>
      <DefaultValue>0.0</DefaultValue>
      <MaxValue>180.0</MaxValue>
      <AxisNameID>259</AxisNameID>
    </Axis>

    <!-- Regular -->
    <!-- PostScript: Arotate-Regular -->
    <NamedInstance flags="0x0" postscriptNameID="261" subfamilyNameID="260">
      <coord axis="ROTT" value="0.0"/>
    </NamedInstance>
  </fvar>

  <gvar>
    <version value="1"/>
    <reserved value="0"/>
  </gvar>

STATはフォントスタイルの定義であり、fvarはフォントで使われる変化軸の定義である。それっぽくなるように適当に設定した。

fvarでは変化軸を一つ(ROTT)定義し、あとはそれっぽい値にしている。変化軸はASCII文字4文字からなるタグで指定する。タグはイタリック、幅、ウェイトなどのためにいくつか登録されたものもあるが、自分で定義することもできる。フォント作者が勝手に作ったタグはアルファベット大文字で始まりアルファベット大文字と数字のみからなると決められている*2
また、回転角を指定する軸なので、-180°~180°を指せるように軸の設定をした。

gvarは変化する部分を定義するテーブルだが、ほぼ空っぽである。これでは変化軸に沿って値を変えてもグリフは変形しないはずであるが、変形はTrueType命令に任せることにするのでこうなっている。

次にTrueType命令の改変を行う。
TrueType instructionで変化軸の値の取得するために、GETVARIATION命令が追加された。OpCodeは0x91。
GETVARIATION命令を実行すると、変化軸の数だけ現在のノーマライズされた座標の値(-1.0~1.0ということだろう)がスタックに積まれる(形式は2.14の固定小数点数)。積まれる順番は'fvar'に定義されているものと同順で、'fvar'の最初に定義されているものが最初にpushされる。
新規に追加されたこの命令であるが、もちろん対応していない処理系では扱うことができず、未定義命令としてエラーになってしまう。なので、互換性のため、'fpgm'あるいは'prep'においてIDEF命令によって互換の命令を割り当てる必要がある(未定義命令でないものはIDEFによって上書きされない)。つまり、今回は変化軸が1個なので、GETVARIATION命令と同じ個数pushする次のような命令を追加する必要がある。

      PUSHB[ ] 145             /* OpCode 0x91, GetVariation */
      IDEF[ ]
      PUSHB[ ] 0   /* Number of axes in this font = 1*/
      ENDF[ ]

…と仕様書にはあるのだが、現在Windows 10において、これを書くとGETVARIATIONがうまく動かないみたいなので書かない。代わりにGETINFOでバージョンを取得し、GETVARIATIONに対応した42以上ならばGETVARIATIONを実行、それ以外なら0を返すようにすることにする。

      PUSHB[ ]
      1 
      GETINFO[ ] /* Get version */
      PUSHB[ ]
      42
      GTEQ[ ] /* version >= 42 */
      IF[ ] 
      GETVARIATION[ ] /* returns a 2.14 fixed number corresponding to the axis */
      ELSE[ ]
      PUSHB[ ]
      0
      EIF[ ]

GETVARIATIONによって得られる変化軸の値はF18Dot14で-1.0~1.0に正規化される。今回は入力軸は回転角度で-180~180が-1.0~1.0に正規化されている。
TrueType命令で三角関数(sin, cos)を計算する - にせねこメモで作成した三角関数は入力としてスタックトップからF26Dot6の角度[°]を受け取るので、-1.0~1.0(F18Dot14)→-180.0~180.0(F26Dot6)への変換が必要。つまり、180.0を掛けた後、256.0で割ってやればよい(あるいは、180/256=0.703125を掛ける)。

PUSHB[ ]
45      /* 180/256 */
MUL[ ]

変化軸の値を変更する度に'prep'は呼び出されるはずなので、以前の回転フォントにおいて回転の角度をStorage Areaに書きこんでいた部分を、この命令で置き換える。

これらをまとめると、<prep>は次のようになる。

  <prep>
    <assembly>
      PUSHB[ ]
      1 
      GETINFO[ ] /* Get version */
      PUSHB[ ]
      42
      GTEQ[ ] /* version >= 42 */
      IF[ ] 
      GETVARIATION[ ] /* GetVariation: returns a 2.14 fixed number corresponding to the axis */
      ELSE[ ]
      PUSHB[ ]
      0
      EIF[ ]
      PUSHB[ ]
      45      /* 180/256 */
      MUL[ ]
      PUSHB[ ]	/* 1 value pushed */
      4
      CALL[ ]	/* CallFunction */
      PUSHB[ ]	/* 2 values pushed */
      2 3
      ROLL[ ]	/* RollTopThreeStack */
      WS[ ]	/* WriteStore */
      SWAP[ ]	/* SwapTopStack */
      WS[ ]	/* WriteStore */
    </assembly>
  </prep>

これをTTXで.ttfファイルに変換すると出来上がりである。

サンプル

回転を確認できるようにテストページを作成した:

Windows 10のFirefox, Chrome, Edgeで動作を確認している。MacはTrueType命令を無視するはずなのでたぶん動かない。

ダウンロード

できたフォントのダウンロードはこちら:

*1:Name IDs 256 to 32767, inclusive, are reserved for font-specific names such as those referenced by a font’s layout features. https://docs.microsoft.com/en-us/typography/opentype/spec/name

*2:Foundry-defined tags must begin with an uppercase letter (0x41 to 0x5A), and must use only uppercase letters or digits. https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg

セブンイレブンのコピー機・冊子印刷攻略情報

セブンイレブンコピー機は小冊子印刷ができる。PDFまたは複数の画像ファイルを読み込んで小冊子となる様に面付して印刷してくれる。

使い方について、詳しくは次の記事を参照。
www.doujinshi-print.com


以下はセブンイレブンコピー機でPDFを印刷しようとした時に引っかかった内容をまとめておく。2019年12月現在の状況。

  • モノクロ印刷の場合はデータをモノクロで作成しておく。不必要に解像度を上げない。
    • 印刷はモノクロなのにもかかわらず、600dpi以上の解像度でフルカラーのPSDファイルを配置したPDFファイルを小冊子印刷しようとしたところ、30分経っても全部出力されない、ということがあったので、解像度を下げる、PDFをグレースケールデータにするなどしてデータを小さくしておいた方がよい。
  • メディアに巨大なファイルは入れない方がいい
    • 普通紙プリントを選択すると、画像一覧を表示するために画像を読み込む。この時、巨大なPDFファイル等があると、画像を読み込み中と出たまま読み込みに時間かかって待たされる。300MBのPDFファイルを読み込むのに20秒ほど。不必要なファイルは入れないのが吉。
  • 小冊子印刷では原寸印刷ができない
    • A5のデータをA4に冊子印刷する際、原寸印刷はできず、強制的に「ちょっと小さめ」を選択させられ、データ原寸よりやや縮小して印刷される。他のサイズでも同様。
    • 公式サイトにあるテンプレートは仕上がりサイズより一回り小さいサイズとなっていて、ちょっと小さめの影響を回避できるので、セブンイレブンコピー機で印刷するのが決定している場合はこれをもとに作るのがよさそう。
    • 縮小が発生すると、原稿にトーンを使っている場合はモアレが発生する可能性がある。トーンを使う代わりにグレースケールで塗ることでも回避できる。
  • 1部目の出力には時間がかかる
    • 小冊子印刷するとき、印刷を開始すると最初に「ページ処理中」と表示されて長めに待たされる。9.2MBのPDF (24ページ)を印刷した時は印刷完了まで5分程度かかった。待たされるのは1部目を出力している時だけで、2部目以降はすぐに印刷された。
  • 1ページ毎のJPEG/TIFFの場合、最大32ページ。全ページを1ファイルにまとめたPDFファイルの場合最大99ページ。


情報を募集しております。

タイ語におけるハイフネーションについて

タイ語組版でハイフネーションってあるの?…一応ある。
自分でもタイ語ではハイフネーションをしないものだとばっかり思っていたが、実際に用例がある。タイ語にもハイフネーションがあるとはっきり書いてあるサイトが見当たらなかったので、ここに書いておく。

ハイフネーション

英語やロシア語等の組版では、単語の途中で改行する場合に、行末にハイフンをつけて続きを次の行に送るハイフネーションと呼ばれる操作がある。特に、長い単語が含まれる場合に、行長を一定にするために使われる。
例:

We, therefore, the represen-
tatives of the United States
of America...

タイ語にハイフネーションはない?

タイ語でもハイフネーションはあるのだろうか?
モリサワの発行する英中韓組版ルールブックタイ語では、次のように書かれている。

行揃えは、「均等配置(最終行左揃え)」が基本ですが、デザインによっては「左揃え」や「センター揃え」が使われることもあります。
この際、注意したいのは単語の間では改行を行なわない、ということです。タイ語にはハイフネーションのような考え方がないので、単語の区切りや改行してもよい位置などを確認しながら作業をするとよいでしょう。

タイ語 英中韓組版ルールブック(PDF) (2019/10/22閲覧)

このように、大抵は文章は均等配置(ジャスティファイ)され、行末のハイフンを全く用いない本も多い。


しかし、「ハイフネーションのような考え方がない」というのは言いすぎではないかと思う。実際の印刷物に、ハイフネーションを行った例がみられる。

タイ語ハイフネーションの実例

手元の本から見つけた例を挙げる。

タイ語辞書の例。

f:id:nixeneko:20191117005729p:plain
สุทธิ ภิบาลแทนによるพจนานุกรมประจำตัวนักเรียน (学生向け辞書)。2007年出版。


f:id:nixeneko:20191117002026p:plain
p11. เครื่องตกแต่ง (装飾品)の途中で改行されている。


f:id:nixeneko:20191117000440p:plain
p13. กระเจอะกระเจิง (群から離れて), พรรณไม้ (木の種類)の途中で改行されている。


f:id:nixeneko:20191117003239p:plain
p291. บรรณาธิการ (編集者)の途中で改行されている。


f:id:nixeneko:20191117003652p:plain
พระมหาพิชัยมงกุฎ (プラマハーピチャイモンクット; 王冠の名前), เจ้าแผ่นดิน (国王), พระราชทาน (お下賜になる)の途中でそれぞれ改行されている。

タイ語組版では普通句読点は使われないが、辞書では分かりやすくするためにピリオド、コンマといった英語風の句読点を使うことがあるらしい。

文芸書の例「窓際のトットちゃん」

f:id:nixeneko:20191117010607p:plain
黒柳徹子『窓際のトットちゃん』のタイ語版。Butterfly Book House (สำนักพิมพ์ผีเสื้อ)によって1983年に出版されたもの。


f:id:nixeneko:20191117011753p:plain
p39. สนุกสนาน (面白い)の途中で改行されている。


f:id:nixeneko:20191117011838p:plain
p39. โต๊ะโตะจัง (トットちゃん)の途中で改行されている。


f:id:nixeneko:20191117185414p:plain
p43. โรงเรียน (学校)の途中で改行されている。


f:id:nixeneko:20191117185827p:plain
p101. ประกอบ (組み立てる)の途中で改行されている。


f:id:nixeneko:20191117190346p:plain
p141. คุณครูใหญ่ (校長先生)の途中で改行されている。


f:id:nixeneko:20191117190654p:plain
p157. คุณครูใหญ่ (校長先生)の途中で改行されている。


f:id:nixeneko:20191117191135p:plain
p199. เด็กหญิง (女の子)の途中で改行されている。

これらを見ると、この本では「学校」などといった基礎的な語(複合語)でもハイフネーションがされていることがわかる。

多言語組版研究会の報告から

第4回多言語組版研究会の発表資料(東南アジアの文書スタイルの現地調査結果)において、次のような報告がある。
タイ国内でもっとも広く読まれている新聞であるThairat社と、タイ語組版について2003年にディスカッションした内容として、次のように書かれている。

(1) ハイフン
タイ語起源の単語では、基本的にハイフンは使用しない。ハイフンが使用されるのは、1語が長くなる傾向があるパーリ語サンスクリット語起源の単語だけに適用するのが通例という。その際も、ハイフンを挿入するのは自動化されておらず、手動で入れる。
新聞という媒体の特色と思われるが、ハイフンは、1段記事の場合だけに使用し、2段以上の記事では使うこともあるができるだけ避けるのが通例であると説明された。

3.2 現地調査報告1(報告書3.3.3.2) (DOC) (2019/10/22閲覧)

これは2003年時点のことなので現在では異なっている可能性もあるし、また出版社・出版物等によってポリシーも異なってくるだろうと考えられる。

タイ王立協会による説明

タイの王立協会(Royal Society;旧Royal Institute)が約物(punctuation)の使用規則を定めている。ハイフンの使い方は次のページにある。

これによると、

  1. 音節または複合語が分かれて次の行に続く際に行末に書く(=ハイフネーション)
  2. 押韻構成に従って音節を区切る際に、語全体を示すために使う
  3. 読み方を示す場合に、音節の区切れに書く
  4. 語の前または後ろもしくは前後を一部とりのぞいたものを示すために使う
  5. 「~まで」の意味で、時間・数量・場所の幅を示す
  6. ISBNなどのコードの数字のまとまりを区切るのに使う
  7. 語にどの文字(子音・母音・声調記号)が使われているかを示すために文字・記号の間に挟んで広げるために使う

以上7つが挙げられている。

(1)のハイフネーションの例を引用すると

        คณะกรรมการกำหนดหลักเกณฑ์เกี่ยวกับการใช้ภาษาไทย มีการ
ประชุมทุกวันพฤหัสบดี เวลา ๑๐.๐๐ น. ณ ห้องนันทนาการราชบัณฑิตย-
สถาน ราชบัณฑิตยสถาน.

となっていて、王立協会“ราชบัณฑิตยสภา”の途中で改行されたためハイフンが挿入されているのがわかる。

他に王立協会の約物の使用方法を定めたのを見ると、タイ語では一般的に使われないピリオドやコンマなども解説されており、王立協会が定めているから一般に広く使われているとは言い難いかもしれない。

漫画の改行の例

改行の極端な例として、漫画が考えられる。特に日本漫画の翻訳など、縦に細長いフキダシに台詞を入れたものがあり、横幅が狭いので一行一語でほぼ縦書きのようになっていることもある。しかしながらハイフネーションがされているのは見ない。手元の本で見つけた例を挙げる。

ゆるめいつ」の例

saxyunゆるめいつ』3巻 タイ語版. Zenshu, 2014.

f:id:nixeneko:20191118220507p:plain
p32. ซาเอะ (サエ; 人名)が途中で改行されている。


f:id:nixeneko:20191118214710p:plain
p51. คริสต์มาส (クリスマス)が途中で改行されている。


f:id:nixeneko:20191118215711p:plain
p86. มายองเนส (マヨネーズ)が途中で改行されている。

ひめゴト」の例

佃煮のりおひめゴト』1巻 タイ語版. Boomtown, 2014.

f:id:nixeneko:20191118221352p:plain
p64. อุนโกะ (運子; 人名)が途中で改行されている。


f:id:nixeneko:20191118221936p:plain
p74. โอดะ มิตสึนากะ (織田光永; 人名)の光永の途中で改行されている。


以上を見るに、外来語や人名でもハイフンをつけずに途中改行が許されている。
漫画では(なるべく避けられるにしろ)あまり気にせず語中でも改行をしていて、ハイフンをつけないようだ。

まとめ

タイ語組版において、ハイフネーションは、使われる本もあれば使われない本もあるが、使わない方が多い。使用する場合でも、可能なら使用を避けるものであるようだ。

お願い

文章を組んだもので、語の途中で改行をしていてかつ行末ハイフンを書かない例を見つけたら教えてください。
また、拙いタイ語力で書いているので、間違い等あればご指摘いただければ幸いです。

ノートPCのCPU速度が0.38GHz固定状態になる問題

Windows 10の載ったノートPCを使っていたら、ある日突然動作が遅くなってしまった。リカバリすれば大丈夫かと思い、OSを「このPCを初期状態に戻す」により初期化してみたが治らなかった。

システム:

タスクマネージャを開いてみたところ、CPUの速度が0.38 GHzに張り付いて、使用率は14%のまま推移している。これはおかしい。

f:id:nixeneko:20190524220926p:plain
タスクマネージャー。CPUの速度が0.38 GHzになっている

また、Windows 10をセーフモードで起動してみたところ、CPUの速度が2.71 GHzとなり、正常に動いているようだった。


ネットを検索したところ、次のようなサイトがみつかった。
Solved: CPU frequency stuck at 0.38GHz on battery - HP Support Community - 6979093

これによると、解決法は次のようにするとよいらしい。

  1. 「デバイス マネージャー」を開く
  2. ファームウェア」→「システム ファームウェア」を右クリックし、「ドライバーの更新」を選択
  3. 「ドライバー ソフトウェアの最新版を自動検索」を選択

あとはウィザードに従い、再起動すると、正常に戻った。

f:id:nixeneko:20190524223848p:plain
治った時のデバイスマネージャー。速度が2.71 GHzとなっている

(2019-06-19追記)
一度は直ったものの、しばらく使っているとまた同じ現象に悩まされるようになった。システムファームウェアのドライバを元に戻したりするとまた復活したりするのだが、しばらくすると元に戻ってしまうようだ。

設定→システム→バッテリー→「バッテリー残量が次の数値を下回ったときにバッテリー節約機能を自動的にオンにする」をオフにして再起動したところ、2.71GHzの速度で動くようになった(気がする)。

(2019-06-28追記)
「バッテリー残量が次の数値を下回ったときにバッテリー節約機能を自動的にオンにする」をオフにしてても0.38 GHzになったので関係ない気がする…。

ハードリセットを行ったところ、速度が速くもどった。しばらく様子見する。
Windows OS 搭載のノートパソコンでのハードリセットを行う方法 | サポート 公式 | ASUS 日本

Twitterで旧字が化ける? CJK互換漢字という罠

概要

Twitterに投稿するとCJK互換漢字が対応する統合漢字に化けるので、投稿時に化けないStandard Variant形式と互換漢字とを相互変換するページを作成した: 互換漢字-異体字セレクタ コンバータ

はじめに

Twitterで「社」(U+FA4C)、「羽」(U+FA1E)などの一部の旧漢字を投稿しようとすると、「社」(U+793E)、「羽」(U+7FBD)に化ける。

Twitterに次の文字列を投稿すると

神(U+FA19)と神(U+795E)
福(U+FA1B)と福(U+798F)
羽(U+FA1E)と羽(U+7FBD)
既(U+FA42)と既(U+65E2)
梅(U+FA44)と梅(U+6885)
社(U+FA4C)と社(U+793E)
練(U+FA57)と練(U+7DF4)
者(U+FA5B)と者(U+8005)

こうなる:


左側の字が右側の字と同じになっている。


これは一体どういうことなのだろうか? 実は、Unicodeの問題である。

CJK互換漢字

これらの化ける文字は、UnicodeにおいてCJK互換漢字という領域に収録されている。互換漢字に対し、基本となる漢字はCJK統合漢字と呼ばれる。CJKはChina, Japan, Koreaの略で、各国で微妙に字体が違っても、同一とされた*1漢字は国に関わらず一つとし、原則として重複収録はしない方針となっている。
しかし、CJK互換漢字は名前の通り、互換性を保つために収録された漢字である。それまでの文字コード等との互換性を保つ関係*2で「同じ文字を重複して収録した」扱いであり、CJK統合漢字の中に対応する漢字をもつ。

Unicode正規化

ここで、Unicodeは検索等の利便性のために、「Unicode正規化(normalization)」という処理を提供している。これは、記号付きのアルファベットなど、二種類以上のコード列で表すことができる文字列を適切に比較したりするために重要な処理である。しかし、CJK互換漢字に対してUnicode正規化を行うと、対応するCJK統合漢字に「化けて」しまう*3

Twitter投稿時のUnicode正規化

Twitterは、2015年から投稿時にUnicode正規化を行うようになった*4。そのため、CJK互換漢字をTwitterに投稿すると対応するCJK統合漢字に置換されてしまい、CJK互換漢字を投稿することはできなくなった。

Standardized Variant

とはいっても、Unicode正規化によってCJK互換漢字が化けてしまうと困る。そういった場合のために、Unicode異体字セレクタという仕組みを使ってCJK互換漢字相当の漢字を表現できる枠組みが作られた(2013年9月制定のUnicode 6.3)。これによって表現されたものをStandardized Variantとよぶ。これは、Unicode Character DatabaseのStandardizedVariants.txtの後半に定義されている。
この仕組みを使うと、Unicode正規化を行っても化けないため、Twitter等にCJK互換漢字の字形の漢字を投稿することができる(ただし、正しい形で表示されるかは環境による)。

互換漢字↔Standardized Variant変換器

CJK互換漢字はともかく、Standardized Variant形式を入力することは不便なので、CJK互換漢字とStandardized Variant形式を相互に変換するページを作成した。

TwitterにCJK互換漢字に含まれる字形を投稿したい場合等に利用していただきたい。

Standardized Variantの実際の表示


Standardized Variantで表現されたものは、環境によるが互換漢字の字形で表示される。手元のWindows 10環境では、Firefoxでは互換漢字の字形で表示されたが、Chromeではそうはならなかった。
f:id:nixeneko:20190316185449p:plain
Firefoxで見たStandardized VariantによるTwitter投稿結果
(20190318追記)これを正しく互換漢字の字形で表示するためにはフォントが対応している必要がある*5Chrome等では対応フォント以外で表示すると互換漢字の形で表示できない。(6.0 Marshmallow以降の)Androidのデフォルトフォントである源ノ角ゴシックは対応しているので、Androidでは正しく互換漢字の字形で表示される。一方、Firefoxは独自に互換漢字の字形で表示するような実装をしている可能性があり、フォントによらず表示できるようだ。Standardized Variant (というより異体字セレクタ)を使った投稿をする場合は、このようにフォントやソフトウェアの対応が微妙であり、必ずしも狙った形で表示されないことに留意する必要がある。(追記終)

ちなみに、ちゃんと変換できているかなどは、

などのページで確認できる。

*1:細かい字体の違いを無視し同一とみなすことを包摂(unification)という。

*2:「ラウンドトリップ変換(round-trip conversion)の確保」といい、既存の文字コード(Shift_JISなど)からUnicodeに変換し、その後元の文字コードに再度変換したときに、内容(文字コード列)が同一になるように保証されている。

*3:Unicode正規化における等価性は正準等価と互換等価という2種類がある(Unicodeの等価性 - Wikipedia)のだが、CJK互換漢字については正準等価となっている。正準等価は見た目も機能としても同じものに対して適用されるべきものなので、互換漢字という見た目が異なるものに対して適用されているので問題となっている。Unicode正規化には種類があり、互換等価については対象としないものもあるが、正準等価は常に対象になる。

*4:厳密な時期はこちらで推定されている: TwitterにUnicode正規化が導入された時刻の推定 by zeeksphere - Togetter

*5:https://twitter.com/monokano/status/1106927404579061761