Fibonacci 数列で TikZ してみた

あべのりさんが [id:abenori:20120422] で、脱 Xy-pic 宣言をしていたので、ぼくも真似してみた。いや、ぼくの場合は、某職場以外で PSTricks を使わない宣言をしたほうがいいな(わら

今日の気分は…、

なので、Fibonacci 数列を題材にしました。

ただ単に、Fibonacci 数列をそのまま出力するのはつまらないので、diagram にしてみました。まぁ、某数学分野の K 理論入門書などで、Bratteli diagram wikipedia:en:Bratteli_diagram としてしばしば見かける例だけど(汗

%#!lualatex fibdiag
\documentclass{article}
%\def\pgfsysdriver{pgfsys-dvipdfm.def} % for dvipdfmx
\usepackage{tikz}
\usetikzlibrary{arrows}
\pagestyle{empty}
\begin{document}

\makeatletter
\newcount\FibDiag@counter
\newcount\FibDiag@temp
\newcount\FibDiag@F
\newcount\FibDiag@G
\newcount\FibDiag@oldF
\newcount\FibDiag@oldG
\def\FibonacciDiagram#1{%
  \FibDiag@counter=#1  
  \FibDiag@temp=\z@
  \FibDiag@oldF=\@ne
  \FibDiag@oldG=\z@
  \FibDiag@F=\@ne
  \FibDiag@G=\@ne
  \begin{tikzpicture}[arrows={->},auto]
     \node                (F1) {1};
     \node [right of=F1]  (G0) {1}; 
  \FibDiag@loop
  \end{tikzpicture}
}

\def\FibDiag@loop{%
  \let\FibDiag@next=\FibDiag@loop
  \FibDiag@temp=\FibDiag@F
  \FibDiag@F=\FibDiag@G
  \advance \FibDiag@G by \FibDiag@temp
  %
  \node [below of=F\the\FibDiag@F] (F\the\FibDiag@G) {\the\FibDiag@G};
  \node [right of=F\the\FibDiag@G] (G\the\FibDiag@F) {\the\FibDiag@F};
  \draw (F\the\FibDiag@oldF) -- (F\the\FibDiag@G);
  \draw (G\the\FibDiag@oldG) -- (F\the\FibDiag@G);
  \draw (F\the\FibDiag@F)    -- (G\the\FibDiag@F);
  %
  \ifnum \FibDiag@counter=\z@
    \let\FibDiag@next=\relax
  \else
    \FibDiag@oldF=\FibDiag@G
    \FibDiag@oldG=\FibDiag@F
    \advance \FibDiag@counter by \m@ne
  \fi  
  \FibDiag@next  
}
\makeatother
%\FibonacciDiagram{100}
\FibonacciDiagram{10}
\end{document}

こいつを e-TeX 拡張が有効な LaTeX でタイプセットすると、以下のような出力を得る。

pTeX プリミティブだけを検索しちゃった(てへぺろ

@munepixyz でつぶやいていたコレ↓の雰囲気をまとめてみました。

こんな感じの検索サービスっぽいのを作ってみました。

入力フォームに、たとえば「k」を打ち始めると、最近の検索エンジンでよくあるような候補を先読みします。

さらに、「kan」を打ち続けると、こんな感じで候補が絞られます。

この状態で、ボタン [ Show ] を押しますと、「kan」を含む pTeX プリミティブが出力されます。

いつでもどこでも pTeX primitives と仲良し!

iPhone で、いつでもどこでも pTeX primitives と仲良しになれます。


もちろん、iPad でもいいですよ。

いまんところは、私的利用!?

ASCII MEDIA WORKS さんの ASCII Nihongo TeX (Publishing TeX) に掲載されている 拡張プリミティブとレジスタ の文章には、当然、著作権があります。

したがいまして、元文章から XML 化したデータを使って、勝手に公開するわけにいきませんね。サービスに対して、転載、利用の許可を得るか、リンクや引用にして、わたしが解説を書くかしないといけませんね。

このサービスを「辞書ツール」という感じで捉えると、ユーザの方の手元で私的利用の範囲で、うまく活用できないか、ただいま妄想中でございます。

妄想は、大きく持とう!

現状、上記のような簡単なサービス内容ですが、Features は色々と考えられます。

  • TeX, eTeX, pdfTeX, LuaTeX などの組版エンジンのプリミティブに対しても、同様に xml データを作成することで、共通する名前などの検索や並べて比較ができる。
  • LaTeX, pLaTeX に対して、latex.ltx などのマクロや amsmath パッケージなどの主要パッケージのマクロに対しても、同様に xml データを作成すると、さらに広がる。ToL(TeX on LaTeX*1)するときに、primitive を意識できて便利!
  • XML 化により、翻訳ツール gettext + po4a 経由で、他の言語に翻訳化が追従しやすい。他のアプリケーションなどにも、XSLT により変換が可能。

上記以外にも、アプリにしたり、Chrome 拡張機能などにもできたりと、妄想は膨らみます。

実際に、わたくし自身がちまちまと試作しつつ作りながら、手元で使っていて便利だったので、TeX/LaTeX の Quick Reference をサービスとしてできたら、面白そうですね。TeX ユーザの集い 2012 のネタにもなるし(わら

ではでは、妄想の続きは、そのうちにでも。

*1:Tales of LaTeX という人もいる :) →わたし

続・初めての ConTeXt Mark IV

前々回に、「初めての ConTeXt Mark IV」[id:munepi:20120408:context] を紹介しました。

その後、ZR さん経由で W32TeX 開発者である角藤さんからのお得情報を教えてくださいました。ZR さんの「ConTeXt で日本語する件について」 [id:zrbabbler:20120416:1334595982] で、そのお得情報が言及されていますので、合わせて参照ください。

欧文と和文のフォントを分ける

今日は、前々回に利用した simplefonts モジュールにおいて、欧文と和文のフォントを分けた例を紹介します。例文は、上記の ZR さんのところから、拝借しました。

%#!context hoge-t
\mainlanguage[ja]
\language[ja]
\setscript[hanzi]

\usemodule[simplefonts]
%%D Default fonts (from t-simplefonts.tex)
%\setmainfont        [Latin Modern Roman]
%\setsansfont        [Latin Modern Sans]
%\setmonofont        [Latin Modern Mono][features=none]
%\setmathfont        [Latin Modern Math]
%\sethandwritingfont [Latin Modern Roman] % neither handwritten nor calligraphic are available
%\setcalligraphicfont[Latin Modern Roman] % for Latin Modern but I need a default font for them

\setcjkmainfont[ipaexmincho]
\setcjksansfont[ipaexgothic]
\setcjkmonofont[ipaexgothic]

\starttext
\def\AboutConTeXtInJapanese{%
\ConTeXt(この中の X は /ks/ と読む)は \TeX\ 上に構成された文書生成
システムである。
最新版の「MkIV(マーク4)」は \LuaTeX\ エンジンのみをサポートし、
「MkII(マーク2)」は \pdfTeX\ と \XeTeX\ をサポートする。
(\XeTeX\ に対して「MkIII」が計画されていたが結局作られなかった。)}
\stoptext

上記の ConTeXt 文章を適当なファイル名で保存して、context でタイプセットすると、以下のようになります。

これで、欧文と和文のフォントをそれぞれ Latin Modern と IPA ex に指定できました。でも、普通の日本語組版としては程遠いですね :)

それは、またおいおいやっていきます。

形式的なフォント名

simplefonts モジュールを使ったときに、デフォルトで Latin Modern が指定されていました。ここでは、形式的なフォント名に対して、Latin Modern がどのような表示になるかを眺めてみます。

%#!context symbfnt-t
\usemodule[simplefonts]
%%D Default fonts (from t-simplefonts.tex)
%\setmainfont        [Latin Modern Roman]
%\setsansfont        [Latin Modern Sans]
%\setmonofont        [Latin Modern Mono][features=none]
%\setmathfont        [Latin Modern Math]
%\sethandwritingfont [Latin Modern Roman] % neither handwritten nor calligraphic are available
%\setcalligraphicfont[Latin Modern Roman] % for Latin Modern but I need a default font for them

\starttext
\def\PangramExample{%
The quick brown fox jumps over the lazy dog.}
\def\SymbolicFontTitle#1{%
  \leavevmode\framed[frame=off, bottomframe=on, topframe=on]{\vbox{#1}}}

\startluacode
symbfnt = {
    -- { name = "Blackboard", sty = "\\bbd", alt = "" }, -- Used by the \\bbd macro
    -- { name = "Calligraphic", sty = "\\cal", alt = "" }, -- Used by the \\cal macro
    -- { name = "Fraktur", sty = "\\frak", alt = "" }, -- Used by the \\frak macro
    -- { name = "Gothic", sty = "\\goth", alt = "" }, -- Used by the \\goth macro
    -- { name = "OldStyle", sty = "\\os", alt = "" }, -- Used by the \\os macro
    -- { name = "MPtxtfont", sty = "", alt = "" }, -- The default font for MetaPost
    { name = "Calligraphy", sty = "\\cg", alt = "\\tf" },
    { name = "Handwriting", sty = "\\hw", alt = "\\tf" },
    -- { name = "MathRoman", sty = "\\mm", alt = "\\mr" },
    -- { name = "MathRomanBold", sty = "\\mm", alt = "\\mr\\bf" },
    -- { name = "MathItalic", sty = "\\mm", alt = "\\mi" },
    -- { name = "MathItalicBold", sty = "\\mm", alt = "\\mi\\bf" },
    -- { name = "MathSymbol", sty = "\\mm", alt = "\\sy" },
    -- { name = "MathSymbolBold", sty = "\\mm", alt = "\\sy\\bf" },
    -- { name = "MathExtension", sty = "\\mm", alt = "\\ex" },
    -- { name = "MathExtensionBold", sty = "\\mm", alt = "\\ex\\bf" },
    -- { name = "MathAlpha", sty = "\\mm", alt = "\\ma" },
    -- { name = "MathAlphaBold", sty = "\\mm", alt = "\\ma\\bf" },
    -- { name = "MathBeta", sty = "\\mm", alt = "\\mb" },
    -- { name = "MathBetaBold", sty = "\\mm", alt = "\\mb\\bf" },
    -- { name = "MathGamma", sty = "\\mm", alt = "\\mc" },
    -- { name = "MathGammaBold", sty = "\\mm", alt = "\\mc\\bf" },
    -- { name = "MathDelta", sty = "\\mm", alt = "\\md" },
    -- { name = "MathDeltaBold", sty = "\\mm", alt = "\\md\\bf" },
    { name = "Mono", sty = "\\tt", alt = "\\tf" },
    { name = "MonoBold", sty = "\\tt", alt = "\\bf" },
    { name = "MonoItalic", sty = "\\tt", alt = "\\it" },
    { name = "MonoBoldItalic", sty = "\\tt", alt = "\\bi" },
    { name = "MonoSlanted", sty = "\\tt", alt = "\\sl" },
    { name = "MonoBoldSlanted", sty = "\\tt", alt = "\\bs" },
    { name = "MonoCaps", sty = "\\tt", alt = "\\sc" },
    { name = "Sans", sty = "\\ss", alt = "\\tf" },
    { name = "SansBold", sty = "\\ss", alt = "\\bf" },
    { name = "SansItalic", sty = "\\ss", alt = "\\it" },
    { name = "SansBoldItalic", sty = "\\ss", alt = "\\bi" },
    { name = "SansSlanted", sty = "\\ss", alt = "\\sl" },
    { name = "SansBoldSlanted", sty = "\\ss", alt = "\\bs" },
    { name = "SansCaps", sty = "\\ss", alt = "\\sc" },
    { name = "Serif", sty = "\\rm", alt = "\\tf" },
    { name = "SerifBold", sty = "\\rm", alt = "\\bf" },
    { name = "SerifItalic", sty = "\\rm", alt = "\\it" },
    { name = "SerifBoldItalic", sty = "\\rm", alt = "\\bi" },
    { name = "SerifSlanted", sty = "\\rm", alt = "\\sl" },
    { name = "SerifBoldSlanted", sty = "\\rm", alt = "\\bs" },
    { name = "SerifCaps", sty = "\\rm", alt = "\\sc" },
  }

for i = 1, table.getn(symbfnt) do
   mmode = string.match(symbfnt[i].name, "^Math")
   context("\\SymbolicFontTitle{")
   context(symbfnt[i].sty .. symbfnt[i].alt .. " " .. symbfnt[i].name)
   context("}")
   context.par()
   context(symbfnt[i].sty .. symbfnt[i].alt .. " \\PangramExample")
   context.par()
   context("\\vskip\\baselineskip")  
end
\stopluacode

\stoptext

上記の ConTeXt 文章を適当なファイル名で保存して、context でタイプセットすると、以下のようになります。

「アレ?変数 mmode とかあるけどー…」というツッコミは歓迎します :) こちらもそのうち、ネタとともにやりませう。

Lua コードの埋め込み方は、Programming in LuaTeX - ConTeXt wiki にも説明があります。\@tfor とかしなくてもいいんですよ(わら



今日は、ここまで。

さて、次回はー、日本語を考慮した体裁など、今日の続きの内容になりますか、もしくは、URW 基本 35 書体についてなにか記しておきましょうか。

お腹が減ってきたので、ではでは。

本日、 #TeXCafe を初開催してみました

ということで、思いつきで #TeXCafe を初開催してしまいました。

#TeXCafe のテーマは、利用者、現場、開発者の情報共有がテーマです(キリっ*1 基本的には TeX に関することを何かやろうということを想定しています。

TeX について雑談したり、開発作業をしたり、クラスファイルを設計したり、マクロを書いてスタイルファイルを作ったり、お絵かきしたりなどなど。もちろん、TeX 環境の構築やインストールのやり方、GUI による製作環境なども OK です。

また、組版やフォント、デザイン、印刷に関すること、最近なにかと話題の電子書籍も何でもありです!むしろ、私がいろいろと教わりたいので :)

以下、twitter からいくつか関連の話題を。

本日の #TeXCafe

本日は、あらかじめ宣言していたとおり、とある TeX 関連ドキュメントの翻訳をやっていました。このネタは、ここらへん po4a を騙して ConTeXt 文章を翻訳する(ネタ) - I’m just another TeXnician. です。

つぎに、今朝届いた Herbert Voss さんの LaTeX Quick Reference*2 を読んでいました。

Latex Quick Reference

Latex Quick Reference

何がすごいって、本書の紙質が割といいなーと思ってパラパラめくっていると、8 章パッケージにおいて 8.7 array と 8.8 xcolor の節がカラー印刷されているという(笑 また、本書には、最近の pdfTeX や XeTeX、LuaTeX などの新しい組版エンジンについて、言及していることも注目すべき点です。

まだ、3 章までしか目を通していないので、全章に目を通すには、しばらくかかりそうです。

次回の #TeXCafe ってあるの?

反響があったので、次回もやりましょう!

場所は、どこでもやります。大型連休中に関西へ行くので、関西で #TeXCafe 開催も妄想中です。

#TeXCafe 開催のときは、お気軽にご参加くださいませ。

*1:いつもわたしが言っている言葉です、ハイ。元ネタは texconf09 のときに喋ったスライド http://f.hatena.ne.jp/munepi/texconf09/

*2:余談:LaTeX Quick Reference の表紙にある絵を見て、B-CAS の黒カードに見えたあなた、魔が差していますよ(わら

単項演算子 - に関するちょっとしたメモ

[ruby-list:48703] 単項演算子 - に関する違和感 という投稿に、ちと目が止まった。

気になったので、Ruby, Perl, Python, PHP, GNU bash, GNU bc にて、「-4%3」「(-4)%3」「-(4%3)」を、とりいそぎ調べてみた。

Ruby Perl Python PHP GNU bash GNU bc
$ irb $ perl -ne 'print eval($_)."\n"' $ python $ php -a $ echo $(( )) $ bc
-4%3 2 2 2 -1 2 -1
(-4)%3 2 2 2 -1 2 -1
-(4%3) -1 -1 -1 -1 -1 -1

Ruby については、 znz さん id:znz から Class: Numeric (Ruby 1.9.3) を教えてもらいました。ありがとうございます。

ぐぐってみると、こんなプログラムはいやだ: 負の剰余 - bkブログ に、C (GCC 3.3.5)、Java (Sun JDK 1.5.0_05), GNU Emacs 22.0.50.2 の結果がありました。

a \equiv b\quad \pmod n での b の正負を、na かのどちらのそれに合わせるかですね。ぶっちゃけ、|a| \equiv b\quad \pmod{|n|} となるような b\quad (> 0) を取ったときに、b の結果が処理系に依って違ったら、大変なことになるわけです(笑

Adobe Reader 9.5.1 日本語版もどきをインストールしてみた

Adobe Systems 社さんが Adobe Reader 9.4.3 以降に日本語版を全然出してくれない (>_<) 2012 年 4 月 14 日現時点で「Adobe Readerの最新バージョンおよび旧バージョンのダウンロード」http://get.adobe.com/reader/otherversions/ を見ても、英語版のみ 9.5.1 がリリースされている。

ということで、Adobe Reader 9.5.1 英語版に、Adobe Reader 9.4.2 日本語版からいくつかのファイルを抜き出して、コピーすることで、Adobe Reader 9.5.1 日本語版もどきにしてみました。



手順は、以下のとおりです。
1. Adobe ReaderRPM を取得します。

wget -N http://ardownload.adobe.com/pub/adobe/reader/unix/9.x/9.5.1/enu/AdbeRdr9.5.1-1_i486linux_enu.rpm \
    http://ardownload.adobe.com/pub/adobe/reader/unix/9.x/9.4.2/jpn/AdbeRdr9.4.2-1_i486linux_jpn.rpm

2. Adobe Reader 日本語版を削除して、英語版をインストールします。

sudo apt-get remove AdobeReader_jpn
sudo apt-get install AdbeRdr9.5.1-1_i486linux_enu.rpm

3. AdbeRdr9.4.2-1_i486linux_jpn.rpm を展開して、いくつかのファイルを抜き出して、インストールします。

mkdir AdobeReader_jpn-9.4.2
cd AdobeReader_jpn-9.4.2
rpm2cpio ../AdbeRdr9.4.2-1_i486linux_jpn.rpm | cpio -id
for x in \
/opt/Adobe/Reader9/Browser/HowTo/JPN/Browser_Plugin_HowTo.txt \
/opt/Adobe/Reader9/Reader/IDTemplates/JPN/AdobeID.pdf \
/opt/Adobe/Reader9/Reader/IDTemplates/JPN/DefaultID.pdf \
/opt/Adobe/Reader9/Reader/Legal/ja_JP/License.txt \
/opt/Adobe/Reader9/Reader/Messages/ENU/RdrMsgENU.pdf \
/opt/Adobe/Reader9/Reader/Messages/JPN/RdrMsgJPN.pdf \
/opt/Adobe/Reader9/Reader/help/JPN/ReadMe.htm \
/opt/Adobe/Reader9/Reader/intellinux/plug_ins/Annotations/Stamps/JPN/Dynamic.pdf \
/opt/Adobe/Reader9/Reader/intellinux/plug_ins/Annotations/Stamps/JPN/Hanko.pdf \
/opt/Adobe/Reader9/Reader/intellinux/plug_ins/Annotations/Stamps/JPN/SignHere.pdf \
/opt/Adobe/Reader9/Reader/intellinux/plug_ins/Annotations/Stamps/JPN/StandardBusiness.pdf \
/opt/Adobe/Reader9/Reader/help/JPN/ReadMe.htm \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/Accessibility.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/AcroForm.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/Annots.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/DVA.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/DigSig.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/EFS.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/EScript.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/HLS.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/MakeAccessible.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/Multimedia.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/PDDom.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/PPKLite.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/RdLang32.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/ReadOutLoud.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/Reflow.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/SaveAsRTF.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/SearchFind.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/SendMail.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/Spelling.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/SynchronizerApp.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/checkers.JPN \
/opt/Adobe/Reader9/Reader/intellinux/sidecars/wwwlink.JPN \
/opt/Adobe/Reader9/Resource/CIDFont/KozMinPr6N-Regular.otf \
/opt/Adobe/Reader9/Resource/CMap/83pv-RKSJ-H \
/opt/Adobe/Reader9/Resource/CMap/90ms-RKSJ-H \
/opt/Adobe/Reader9/Resource/CMap/90ms-RKSJ-UCS2 \
/opt/Adobe/Reader9/Resource/CMap/90ms-RKSJ-V \
/opt/Adobe/Reader9/Resource/CMap/90msp-RKSJ-H \
/opt/Adobe/Reader9/Resource/CMap/90msp-RKSJ-V \
/opt/Adobe/Reader9/Resource/CMap/90pv-RKSJ-H \
/opt/Adobe/Reader9/Resource/CMap/90pv-RKSJ-UCS2 \
/opt/Adobe/Reader9/Resource/CMap/90pv-RKSJ-UCS2C \
/opt/Adobe/Reader9/Resource/CMap/Add-RKSJ-H \
/opt/Adobe/Reader9/Resource/CMap/Add-RKSJ-V \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-90ms-RKSJ \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-90pv-RKSJ \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-H-CID \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-H-Host \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-H-Mac \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-PS-H \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-PS-V \
/opt/Adobe/Reader9/Resource/CMap/Adobe-Japan1-UCS2 \
/opt/Adobe/Reader9/Resource/CMap/EUC-H \
/opt/Adobe/Reader9/Resource/CMap/EUC-V \
/opt/Adobe/Reader9/Resource/CMap/Ext-RKSJ-H \
/opt/Adobe/Reader9/Resource/CMap/Ext-RKSJ-V \
/opt/Adobe/Reader9/Resource/CMap/H \
/opt/Adobe/Reader9/Resource/CMap/UCS2-90ms-RKSJ \
/opt/Adobe/Reader9/Resource/CMap/UCS2-90pv-RKSJ \
/opt/Adobe/Reader9/Resource/CMap/UniJIS-UCS2-H \
/opt/Adobe/Reader9/Resource/CMap/UniJIS-UCS2-HW-H \
/opt/Adobe/Reader9/Resource/CMap/UniJIS-UCS2-HW-V \
/opt/Adobe/Reader9/Resource/CMap/UniJIS-UCS2-V \
/opt/Adobe/Reader9/Resource/CMap/UniJIS-UTF16-H \
/opt/Adobe/Reader9/Resource/CMap/UniJIS-UTF16-V \
/opt/Adobe/Reader9/Resource/CMap/UniKS-UTF16-H \
/opt/Adobe/Reader9/Resource/CMap/UniKS-UTF16-V \
/opt/Adobe/Reader9/Resource/CMap/V \
//opt/Adobe/Reader9/Resource/Linguistics/LanguageNames2/DisplayLanguageNames.ja.txt \
/opt/Adobe/Reader9/Resource/Linguistics/LanguageNames2/DisplayLanguageNames.ja_JP.txt \
/opt/Adobe/Reader9/Resource/Linguistics/LanguageNames2/DisplayLanguageNames.ja_JP_TRADITIONAL.txt \
  ; do 
      sudo mkdir -p $(dirname $x)
      sudo cp -af .$x $x
  done

これで本当に良いのかしらん?(笑 CMap ファイルやフォントたちは無害ですが、再び日本語版がリリースされるときは、あらかじめ 3 でコピーしたファイルたちを消しておく方が良いかもしれません。

この手順は、FedoraCentOS など、RPM パッケージ管理をしているディストリビューションであれば、同様です。

Vine Linux 向けに、上記の手順にそったインストールをおこなう install-assist-AdobeReader_enu パッケージを用意しようかしらん?

おまけ

AdobeReader_jpn-7.0.9 から KozGoPro-Medium.otf も入れとくと、代替フォントとしてウマー\(^o^)/

wget -N ftp://ftp.adobe.com/pub/adobe/reader/unix/7x/7.0.9/jpn/AdobeReader_jpn-7.0.9-1.i386.rpm
mkdir AdobeReader_jpn-7.0.9
cd AdobeReader_jpn-7.0.9
rpm2cpio AdobeReader_jpn-7.0.9-1.i386.rpm | cpio -id
sudo cp -af ./usr/local/Adobe/Acrobat7.0/Resource/CIDFont/KozGoPro-Medium.otf /opt/Adobe/Reader9/Resource/CIDFont/

po4a を騙して ConTeXt 文章を翻訳する(ネタ)

前回、「初めての ConTeXt Mark IV」 [id:munepi:20120408:context] の最後に、ちらつかせていたネタを少し晒します。

po4a http://po4a.alioth.debian.org/ とは、何でも po を経由して翻訳しちゃえというツールです。これをつかって、ConTeXt 文章を翻訳できないかという、ネタですw 現時点で無理のある作業をしているので、あくまでもネタです。

というのも、現時点の po4a version 0.41 では、「po4a-gettextize -f context」ができません*1。そこで、po4a を騙して ConTeXt 文章をなんとかして po 化して、翻訳します。騙すなんて、ヒドイwww

po4a の騙し方は、以下のとおりです。

  1. 「po4a-gettextize -f latex」を実行する前に、「\startMARKUP ... \stopMARKUP」を「\begin{MARKUP} ... \end{MARKUP}」に置換します。
  2. po4a を実行します。
  3. 「\begin{MARKUP} ... \end{MARKUP}」を「\startMARKUP ... \stopMARKUP」に戻します。

ねっ、po4a を騙しているでしょ? :) まぁ、Locale::Po4a::ConTeXt.pm を書けば (ry :)

簡単に騙せるサンプル

たとえば、以下のような ConTeXt 文章を doc/thisisapen.tex として保存します。

\usemodule[simplefonts]
\setmainfont[hiraginominchopronw3]

\starttext

This is a pen. 

\stoptext

doc/thisisapen.tex を「\starttext ... \stoptext」を「\begin{text} ... \end{text}」に置換して、Work/thisisapen.tex として保存します。

$ mkdir Work
$ perl -p -e 's@\\start([A-Za-z]+)@\\begin\{\1\}@g; \
      s@\\stop([A-Za-z]+)@\\end\{\1\}@g' doc/thisisapen.tex > Work/thisisapen.tex

以下の内容を po4a.cfg として保存します。

[po_directory] po
[po4a_alias:latex] latex opt:"-f latex -M UTF-8 -L UTF-8 -o no_wrap=text -k 0"
[type:latex] Work/thisisapen.tex $lang:doc-$lang/thisisapen.tex

ja.po のひな形となる thisiaapen.pot を生成します。

$ po4a-gettextize -f latex -M UTF-8 -L UTF-8 -o no_wrap=text -m thisiaapen.tex -p po/thisiaapen.pot

po/thisiaapen.pot の中身はこんな感じです。

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2012-04-09 22:56+0900\n"
"PO-Revision-Date: 2012-04-09 22:56+0900\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#. type: Plain text
#: Work/thisisapen.tex:3
msgid "\\usemodule[simplefonts] \\setmainfont[hiraginominchopronw3]"
msgstr ""

#. type: text
#: Work/thisisapen.tex:7
#, no-wrap
msgid "This is a pen."
msgstr ""

「po/thisiaapen.pot を po/ja.po としてコピーする」または、「$ touch po/ja.po してから $ po4a po4a.cfg する」のどちらかを実行します。

po/ja.po を適当なエディタで開いて、さっそく翻訳します。

#. type: text
#: Work/thisisapen.tex:7
#, no-wrap
msgid "This is a pen."
msgstr "これはペンです。"

po/ja.po を保存してから「$ po4a po4a.cfg」を実行すると、doc-ja/thisisapen.tex に翻訳された文章が生成されています。後処理として、「\begin{text} ... \end{text}」を「\starttext ... \stoptext」に置換します。

$ perl -pi -e 's@\\begin\{([A-Za-z]+)\}@\\start\1@g; \
               s@\\end\{([A-Za-z]+)\}@\\stop\1@g' doc-ja/thisisapen.tex

最終的に doc-ja/thisisapen.tex はこのようになります。

% This file was generated with po4a. Translate the source file.
%
\usemodule[simplefonts] \setmainfont[hiraginominchopronw3]

\starttext

これはペンです。 

\stoptext

できたぉ!

今日は、ここまで!

でも…

実際に ConTeXt 文章を parse するとなると、ConTeXt の表現は、LaTeX のそれと大きく違います。当たり前ですが(笑

試した ConTeXt 文章のうち、うまく po4a を騙せなかったものとして、いくつかあげます。

  • \starttyping ... \stoptyping
  • Lua コードが入った ConTeXt 文章。とくに、% が Lua コードで意味を持つ場合。

結局、Locale::Po4a::ConTeXt.pm を書かないと (ry :)

さて、次はー、何を書こうかしらん。「続・初めての ConTeXt MkIV」がよいかしらん? :)

*1:[Po4a-devel] Support for ConTeXt http://lists.alioth.debian.org/pipermail/po4a-devel/2010-December/002006.html No!!!!! See Locale::Po4a::LaTeX.pm and お前がヤレ!:)