2015年6月7日日曜日

precompiled preambleを用意して,platexのタイプセットを高速化する

最近dynabook v713を使っていなかったので知人に譲り,これを元手にして,久々にwindowsのデスクトップPCを購入しました.所有しているMacbook Air (mid 2012)に比べてcpuの周波数が2倍,コア数も2倍になったけれど,platex+dvipdfmxによるタイプセットの速度は約60%速くなったくらいで,期待していたほどではありませんでした.TeXがシングルスレッドで動作するようなので,cpuのコア数は速度向上に寄与していないみたいです.

そこでLaTeXのタイプセット速度を向上させる方法がないか検索をしてみたら,
  • precompiled preambleを用意して,preambleの読み込み時間を短縮する.
  • tikzのexternalライブラリを用いて,tikzの絵をいったんpdf化し,それを読み込むことでtikzのタイプセット時間を短縮する.
という方法が見つかりました.

ここでは前者を紹介します.後者も試してみたのですが,可換図を描くライブラリであるtikz-cdのtikzcd環境と相性が悪いらしく,うまく行かなかったため断念しました.


precompiled preambleの作成
howtotex.comというブログの「Faster LaTeX part IV: Use a precompiled preamble」という記事でpreambleをprecompileする方法が紹介されています.まず,preambleを動的な部分と静的な部分に分けます.動的というのは,文章を書き上げる際に書き換えの頻度が高いという意味くらいに捉えておけばよいようです.例えば\includeonlyを使って部分タイプセットしているときは,書き換える頻度が高いので,動的と見なします.
preambleの静的な部分と静的な部分を\endofdumpで分けます.つまり,texファイルの\begin{document}よりも前の部分は次のようになります.

% 静的な部分
...
\endofdump
%動的な部分
...
\begin{document}
私はglossaries.styを使っていますが,\endofdumpより前に\usepackage{glossaries}があるとエラーが起きました.glossaries.styは動的な部分に配置してください.

以下ではtexファイルの名前が「mydoc.tex」であるとします.ターミナルを開いてmydoc.texのあるフォルダに移動し,
eptex -ini -jobname="mydoc" "&platex" mylatexformat.ltx mydoc.tex
と打ち込みます.するとmydoc.fmtというファイルが作成されます.このファイルをprecompiled preambleと言っているようです.元の記事では最初のeptexの部分がpdftexで,&platexの部分が&pdflatexになっています.最初のeptexの部分はplatexでも大丈夫でした.
最後に,フォーマットファイルmydoc.fmtを読み込むために,mydoc.texの最初の部分に%&mydocと記述します.
%&mydoc
...
\begin{document}
mydoc.fmtファイルを作った後はpreambleの静的な部分をコメントアウトしてもいいですし,そのままでもmydoc.fmyのほうを読みにいってくれます.静的な部分を独立したファイルにしてもいいみたいです.

私は上記のコマンドを覚えられそうにないので,シェルスクリプト化しました.

特にtikzを使っている場合は,tikzの関連ファイルの読み込みに時間がかかっていたので,短縮されました.MacBook Air (mid 2012 corei-7)でタイプセットに11秒かかっていた200ページくらいの文章が9.5秒くらいにはなりました.但し,あくまでもpreambleの読み込み速度を上げているだけなので,その分の時間短縮にしかならないようです.つまり本文が長くなっても短縮される時間に変わりはほとんどありませんでした.逆に本文が短くなればなるほど体感時間を速く感じると思われます.

preambleが肥大化している人は試してみるとよいのではないでしょうか.

2015年6月2日火曜日

Windows8.1上でmozc_emacs_helper.exeをコンパイルする試み

NTEmacs Wikiのemacs-mozc を動かすための設定(mozc_emacs_helper コンパイル編)という項目を見たら,mozc_emacs_helperをコンパイルしてGoogle日本語入力と連携させることができるようなので試してみました.

上記のWikiの項目の最後にmozc_emacs_helper.exeのバイナリが置いてあったので,まずはそれを試したもののうまく行かず,自前でコンパイルしてみても,やはり結果は同じでした.という訳なので,コンパイルの詳しい手順は上記のWikiを参考にしてみてください.変えたところといえば,mozcのソースバージョンが変わっているので,提供されているパッチを当てずに,個々のファイルを書き直したくらいでしょうか.実際にmozc_emacs_helper.exeのコンパイルまではうまく(?)いきました.

cygwin上でmozc_emacs_helperの動作確認をしてみると,以下のような結果になりました.

$  echo -e '(0 CreateSession)\n(1 SendKey 1 hiragana)\n(2 SendKey 1 97)' | ./mozc_emacs_helper.exe
((mozc-emacs-helper . t)(version . "1.13.1641.0")(config . ((preedit-method . roman))))
((emacs-event-id . 0)(emacs-session-id . 1)(output . ()))
((emacs-event-id . 1)(emacs-session-id . 1)(output . ((id . "9022697100350878797")(mode . direct)(consumed . nil)(key . ((special-key . kana)))(status . ((activated . nil)(mode . hiragana)(comeback-mode . hiragana))))))
((emacs-event-id . 2)(emacs-session-id . 1)(output . ((id . "9022697100350878797")(mode . direct)(consumed . nil)(key . ((key-code . 97)))(status . ((activated . nil)(mode . hiragana)(comeback-mode . hiragana))))))
どうやら,直接入力からひらがなモードへの切り替えが出来ていないようです.windowsでmozc.elが使えると便利だと思ったのですが,これ以上何をして良いのかわからないので一旦断念します.


この方法は,コンパイル時にbrandingをMozcでなくGoogleJapaneseInputに書き換えたり,バージョンを書き換えたりしていたので,同様の方法がmacにも使えないかと浅知恵で試みたものの失敗に終わりました.誰か詳しい人が挑戦してくれないかな.