2015の24日目の記事であるRe:VEIW、LaTeXでPDFを作るんなら、そもそもRubyもRe:VIEWそのものも不要じゃない?そこでRe:VIEW記法を直でコンパイルするTeXを作ってみた(ここから本編)今年の自分の仕事を軽く振り返ってみたところ、前職での最後の出版物となった『エクストリームプログラミング』をRe:VIEWを使って制作したり、無職になってから声を書けていただいた同人サークルTechBoosterの書籍制作でRe:VIEWが圧倒的に利用されていたり(年末のコミケで新刊解説書も売ってるよ!)、これまでになくRe:VIEWとの因縁めいた縁を感じる一年だった気がします。そこで、なにかRe:VIEWに関連したネタで記事が書けたらいいなあと思いました。2015のためのネタとして、Re:VIEWとTeXがもっと仲良くなれるかもしれない方法を考えてみました。2015の昨日12月23日の担当はdoraTeXさん、明日最終日の担当はzr_tex8rさんです。Calendarには「今さら人に聞けない、TeXのキホン」という重点テーマが設定されています。Re:VIEWがTeXのキホンとは思えない。そこで、とりあえず形だけでも重点テーマを消化すべく、まずはTeXのキホンのひとつといえるアクティブ文字について説明することにします。Re:VIEW風のシンタックスで書けるTeXを作ってみた」まで読み飛ばしてかまいません。アクティブ文字とはTeXとかLaTeXには、俗にいうマクロとかコマンドと呼ばれるものがあるのはご存じですよね。バックスラッシュとか円記号の後ろに英文字が並んでるやつです。このマクロとかコマンドを使って、ページに出力する要素の構造を指定したり、繰り返し入力する手間を省いたり、特殊な記号を入力したり、装飾を施したり、絵を描いたりできるのでした。このマクロやコマンド、ほとんどの場合は「\から始まる文字列」(専門用語ではコントロールシーケンス)という形式の名前で定義するんですが、実はもう一つ方法があって、それが本節のテーマであるアクティブ文字です。ようするに、単なる文字がまるでマクロやコマンドのように定義済みの内容に展開される機能がTeXにはあって、それをアクティブ文字と呼んでいます。アクティブ文字「~」(チルダ)アクティブ文字の代表例は「~」(チルダ)です。ふつうのTeX環境における「~」には、HTMLにおける&nbsp;と同じく、ノーブレークスペースという機能が割り当てられています。改行されるのは嫌だけどアキが欲しいような場所に「~」を挿入することで、TeXの組版処理を制御できます。「Figure」と「1」の間で改行されず、アキも入るこの挙動が、実はTeXの実装でハードコードされている機能ではなく、次のような感じでアクティブ文字「~」として「定義」されているというわけです。}\catcodeというのが文字の種類(カテゴリコードと呼ばれています)を変更するためのTeXプリミティブで、「13」がアクティブ文字のカテゴリコードです。\catcodeで文字のカテゴリコードを13に変更すると、通常のコントロールシーケンス(バックスラッシュで始まる文字列で作れるやつ)とまったく同じ要領で、\defを使って動作を定義できます。好きな文字をアクティブ文字に変更してみようもちろん、自分で好きな文字をアクティブ文字に変更して、その動作を好きなように定義することも可能です。」に展開できると楽ができそうですよね。書きやすく!\end{itemize}\endgroupあるいは、文中の「8」という文字をすべて雪だるまにすると楽しそうですね(scsnowmanパッケージマジ便利)。V8!\endgroup問題は、こんなふうに気軽に「*」や「8」の意味を変えてしまうと、「*」や「8」という文字を本来の意味で使えなくなってしまうことです。「*」は、文章中で使えないだけならまだしも(それだけでも困る場面はあるでしょうが)、\section*{連番なしの節タイトル}のような一般的なコマンドで使えなくなってしまうのは困ります。実際、上記の2例では、\begingroupと\endgroupを使うことで、これらがアクティブ文字として有効になるスコープを制限しています。そんなわけで、こんなに便利で楽しいアクティブ文字ですが、ふつうにTeXやLaTeXで文章を書くときに利用できるものは最初に紹介した「~」のみです。(改行文字を段落の終わりとして再定義して特定の環境内で暗黙に利用しているようなケースはあります。)Re:VIEW風のシンタックスで書けるTeXを作ってみたアクティブ文字で、なにかもっと面白いことはできないでしょうか。前の節では、「*」という文字を再定義して\itemのように使う方法を紹介しました。考えるとこれは、Re:VIEW記法における箇条書きのシンタックスそのものです。したら、アクティブ文字をさらに駆使することで、バックスラッシュと波カッコというTeXやLaTeXの記法(悪名高い)に縛られずに原稿を執筆できるところまで持っていけるのではないでしょうか。いや持っていけるに違いない。長い前置きはこれくらいにして、ここからはさまざまなRe:VIEW記法をTeXで実装していくことにしましょう。Re:VIEWの箇条書き記法をTeX上で再現してみます。新しい段落が「*」で始まったらitemize環境に入り、新しい段落が出てきたら抜けて、その間に出てくる「*」は問答無用で\itemにするが、それ以外の「*」はそのまま印字する、という動作なら、*をアクティブ文字にしてこんな感じに書けそうです。\else*\fi}TeXやLaTeXのシンタックスは捨てることにしたので、ほかのコマンドに「*」が出てくる心配はいりません。冒頭で\catcode`\*=\activeとして実際に文書を作成してみましょう。この実装だと、同じ行に「*」が二回出てくるとおかしなことになったり、あとに何かしら段落が存在しないと意図しない結果になったりします。本当ならもっと作りこむべきなのでしょうが、そもそも軽量マークアップ言語なんて制作者の技術的な都合で仕様が決まるものなんだから、ここはそういう仕様ということにして先に進みます。Re:VIEWのインラインコマンドRe:VIEWには@<command>{content}という形式のインラインコマンドがあります。これを同様にアクティブ文字を濫用して実装してみましょう。\ifx\bfreview\reviewname\textbf{#2}\fi}\endgroupこちらはTeXの記法に近い(?)ので比較的安直に実装できます。上記では等幅にするコマンド(@<code>{...})と太字にするコマンド(@<b>{...})だけを定義していますが、必要に応じて好きなものを追加してください。章見出しや節見出しRe:VIEWでは「=」で行を書き始めると個数に応じて階層的なヘッダになります。これをTeXで実装しましょう。めんどくさいですが、処理自体は素直なものです。\fi\reset@header@cnt}\def\review@chapter#1\par{\edef\chapstring{#1}\chapter[]{\chapstring}}\def\review@section#1\par{\edef\sectstring{#1}\section[]{\sectstring}}\def\review@subsection#1\par{\edef\subsectstring{#1}\subsection[]{\subsectstring}}現状だとページの柱や目次に章タイトルを出力できないなどの問題は残っていますが、とりあえずできたということにします。見出し行があるだけでずいぶんマークアップ言語っぽくなりますね。Re:VIEWの環境Re:VIEWでは//foo{から//}のような書式で特殊なスタイルのための環境を設定できるようになっています。これもLaTeXの環境の記法に似ているので簡単に実現できるかなと思ったんですが、そもそもTeXには真のパターンマッチがないので、ややトリッキーな仕掛けが必要でした。review@#1\endcsname}\endgroup\long\def\review@list#1{\begin{alltt}#1\end{alltt}\endgroup}\long\def\review@quote#1{\begin{quote}#1\end{quote}\endgroup}\long\def\review@read#1{\begin{quote}#1\end{quote}\endgroup}\def\review@footnote#1{\footnote{#1}\endgroup}ここでちょっと悩ましいのが、よく似た記法を持つ//footnoteのようなRe:VIEWコマンド(波カッコがない点に注意)の存在です。これにも対応するには本気でパーザを書くことになりそうなので、//footnoteコマンドでもコンテンツは波カッコで囲むということにします。この時点でRe:VIEWとは互換性のないシンタックスになってしまっていますが、軽量マークアップ言語なんて制作者の技術的な都合で仕様が決まるものなんだから(ryあとなんかallttの中の改行処理がうまくいってないとか、入れ子への対応が不十分とか、課題は残ってるけど深追いしない。間で実行するだけでも面白いといえば面白いのですが、どうせなら、.reファイルから直接PDFを組版できる独立したコマンドがあると便利ですよね。いうわけで、上記のマクロたちをフォーマットとしてまとめておきました。syntaxhttps://github.com/k16shikano/revtexいちおう補足しておくと、TeXの文脈でフォーマットといったら、initexを使ってダンプする(あるいはダンプした)ファイルのことです。そのフォーマットをデフォルトで利用するrevtexという新しいTeXの実行ファイルを作ることで、Re:VIEWっぽい記法の原稿を直接コンパイルできるようにしようというわけです。日本語を組版したいので、ベースにするのはuplatexコマンドとします。uplatexの実行ファイルをrevtexという別名で用意し、上記のフォーマットをかませて使うように設定すれば、こんなふうにTeXで直接、ほぼRe:VIEW記法の原稿をコンパイルできるようになります。マルノウチ・スゴイタカイビルその頂から退廃的な高密度ネオン看板が瞬く地獄めいた都市の喧噪を見下ろす影がひとつ急降下した。すごい「こんにちはニンジャ・スレイヤー=サン。」そういって敵は姿を見せぬまま@<code>{UNIX}端末にログインした。インガオホーこんにちはダークニンジャ=サン。revtex.fmt...いうまでもありませんがRubyもRe:VIEWも不要です。最後にdvipdfmxが何か言ってますが、無視する方向で。生成されたPDFを以下に張っておきます。fin」という行を書いておく必要があります。TeXは組版をするとき、\endというプリミティブで原稿ファイルの終端に到達したことを知るのですが、Re:VIEWにはそのための記法がないので、こうしてお茶を濁しているわけです。思い込んでいたら、e拡張には\everyeofなるそのまんまなプリミティブがあると教えてもらいました。プリミティブを使えば実現できる。24これを使うと、確かに最後の行が不要になるので、ひそかにあきらめていた行コメントも実現できました。(追記おわり)免責と今後の展望auxによる参照解決とか、エスケープとか、いろいろさぼってるので実用品ではありません。これ以上Re:VIEW対応率をあげようとか、バグを直そうとか、そういう予定もたぶんありません。Markdownっぽいのを実装するほうが面白そうかも。TopicTeX芸には欠かせない説明不要の名著。日本語訳もあるが入手は困難。原著者のサイトで英文なら全部読める。1TeXの実装TeX芸の北極。文字「1」をアクティブ文字にすることで、文字通り「1」のみでTeXコンパイル可能な文書を作る。xmltexの実装XML文書をTeXでコンパイルするという、海外のTeX芸のひとつ。Re:VIEWフォーマットのドキュメントこれ以外にもいろいろ隠しコマンドがあるらしい。出版される前の本の内容は、通常は著者や編集者に代表される「制作サイド」の人間にしか読まれない。専門性の高い本であれば査読とか監修といったプロセスを有識者にお願いすることはあるけど、そうしたお願いをするときには有償だったりカバーや袖に名前を出したりすることが多いので、これも「...職務経歴書いろいろあって職務経歴書を作成してみることにしました。機能を使うのが一番お手軽です。編集をお手伝いしました。Blogger.自己紹介Unknown詳細プロフィールを。