「わたしのやてふ環境」独り反省会

昨日開催された研究集会 TeX ユーザの集い 2011 http://oku.edu.mie-u.ac.jp/texconf11 で LT「わたしのやてふ環境」をやってしまいました。今日はその反省会を独りでやります*1

TeXユーザの集い 2011 に、発表時のスライド(PDF ファイル) http://oku.edu.mie-u.ac.jp/texconf11/presentations/yamamoto.pdf が公開されております。LT 中にやった(やろうとしていた(^^;;)Demonstration のスクリーンショットも挿入し、加筆したスライドとなっております。参加できなかった方にも伝わるような感じにしました。本記事と合わせてご覧ください。

LT で意識していたこと

  1. TeX を普通知っている人であれば、「どの方でも楽しんでいただける」
  2. Emacs を知っている人であれば、「あれこれツッコミどころ満載で、ニヤニヤしていただける」
  3. TeXnician の方であれば、「あのマクロはこんなアルゴリズムかな?と妄想していただける」

そんな思いで、ネタ仕込みに全力疾走しておりました。

TeX を知っている方であれば、おそらくどなたでも Knuth 巨匠を知っているでしょう。TeX 文章を書くとき、ほとんどの方は何らかのテキストエディタで入力するでしょうし、入力支援も利用している方も多いでしょう。そこで、単に Emacs というテキストエディタで、真面目に馬鹿で、実用性ゼロな、TeX デモンストレーションを仕込んだわけです。

「わたしのやてふ環境」は…、

YaTeX + Anything + Auto Complete Mode + auto-complete-yatex

です。文章で書くと、「ふつうのやてふ環境をベースに、Anything の統一的なインタフェースにより、既存の Emacs の操作性を革命的に変化させて、Auto Complete Mode による強力な動的補完とそのやてふ拡張を備えた環境です。」となります。なお、手元の OS は、VineSeed x86_64 または、Vine Linux 6 x86_64 です。

Vine Linux でお手軽にやてふ環境を構築

「わたしのやてふ環境」は、Vine Linux であれば比較的簡単に整えられます。apt-get コマンドを利用して、auto-install, auto-complete-mode, yatex パッケージをインストールします。

$ sudo apt-get install auto-install auto-complete-mode yatex
Anything

Anything は、M-x auto-install-batch から anything を選択してインストールできます。id:tomoya さんの もう初心者なんて言わせない、Anything で始まる Emacs 道。 - 日々、とんは語る。 が参考になるでしょう。

Auto Complete Mode

Auto Complete Mode は auto-complete-mode パッケージをインストールするだけで既に終わっております。

YaTeX

YaTeXyatex パッケージをインストールするだけで、ほぼ終わります。

が!!!、Anything の恩恵を授かるためには、1 つ重要な設定を修正しないといけません!vine-default-yatex.el で設定されている、やてふのデフォルト設定でもある begin/end 型環境のショートカットによる補完を無効にする必要があります。つまり、

(setq YaTeX-no-begend-shortcut t)

としないといけません。

実は、Vine Linux 5 がリリースされたとき、vine-default の仕組みを導入しましたが、そのとき yatex パッケージでは (setq YaTeX-no-begend-shortcut t) としていました。そう、私のやてふ設定をそのまま入れていました。ところが、多くのやてふユーザは、デフォルトのやてふのまま使っている方が多く、この設定が受け入れられませんでした*2

以来、begin/end 型環境は、vine-default-yatex でもやてふのデフォルトの挙動と同じく、「ショートカット」による補完にしております。もし Anything がいつの日か Emacs 標準装備になった暁には、やてふの設定も (setq YaTeX-no-begend-shortcut t) にしようと妄想しております (^^

auto-complete-yatex

auto-complete-yatex に書いております。とくに何も難しいことをやっておりません。

また、ac-source-yatex-user-candiates に登録する一例として、いくつかあげておきます。

(setq ac-source-yatex-user-candiates
      (list 
       ;; documentclasses and these options
       "jsarticle" "jsbook" "beamer" 
       "ltjarticle" "iamjatex"
       "Proof" "tombo" "mentuke" "cameraready"

       "Lbox[]{}" "Rbox[]{}" "Pbox{}" "DDbox[]{}" "TDbox{}{}"
       "ruby{}{}"
       "Hang"
       "ignorespaces"
       "phantom" "hphantom" "vphantom"
       "makeatletter" "makeatother"
       "textregistered"
       "setbox" "lower" "raise" "llap" "rlap" "smash"
       "hbox{}" "mbox{}" "fbox{}" "parbox[]{}"
       "fboxsep"
       "hspace*{}";; "hfil" "hfill" "hss" "hskip" 
       "vspace*{}";; "vfil" "vfill" "vss" "vskip" 
       "baselineskip" "onelineskip" "halflineskip"
       "subtitle" "jsubtitle" "esubtitle" 
       "nonumber"
       "noindent" "mathindent" "parindent" "hangindent" 
       "newpage" "Newpage"
       "fallingdotseq"
       "arraycolsep" "arraystretch"
       
       ;; around figure env.
       "figure*"
       "scalebox{1}{\\includegraphics{}}"
       "capwidth" "ecapwidth" 
       "capwidth\\columnwidth" "ecapwidth\\columnwidth" 
       "columnwidth" "textwidth"

       ;; around table env.
       "Hline"


       ;; for numbering macros
       "ENUM{1}" "ENUM{2}" "ENUM{3}" "ENUM{4}" "ENUM{5}" 
       "ENUM{6}" "ENUM{7}" "ENUM{8}" "ENUM{9}" 
       "Enum{1}" "Enum{2}" "Enum{3}" "Enum{4}" "Enum{5}" 
       "Enum{6}" "Enum{7}" "Enum{8}" "Enum{9}" 
       "MARU{1}" "MARU{2}" "MARU{3}" "MARU{4}" "MARU{5}" 
       "MARU{6}" "MARU{7}" "MARU{8}" "MARU{9}" 
       "maru{1}" "maru{2}" "maru{3}" "maru{4}" "maru{5}" 
       "maru{6}" "maru{7}" "maru{8}" "maru{9}" 
       "RN{1}" "RN{2}" "RN{3}" "RN{4}" "RN{5}" "RN{6}" "RN{7}" "RN{8}" "RN{9}" 
       
;; some templetes of preamble

;; some templetes of LaTeX environments
;; figure
"begin{figure}[tb]
\\begin{center}
 \\scalebox{1}{\\includegraphics{}}
\\end{center}
\\caption{}
\\label{}
\\end{figure}"

"begin{figure}[b]
\\leavevmode
\\hbox to \\hsize{%\\hss
 \\begin{minipage}{\\textwidth}
 \\capwidth\\textwidth
 \\begin{center}
  \\scalebox{1}{\\includegraphics{}}
 \\end{center}
 \\caption{}
 \\label{}
 \\end{minipage}\\hss
}%
\\end{figure}"

;; table
"begin{table}[tb]
\\caption{}
\\label{}
\\begin{center}
 \\scalebox{1}{\\includegraphics{}}
\\end{center}
\\end{table}"

"begin{table}[tb]
\\caption{}
\\label{}
\\begin{center}
 \\begin{tabular}{ccc}
 & & \\\\
 \\end{tabular}
\\end{center}
\\end{table}"

;; enumerate
"begin{itemize}
\\item 

\\end{itemize}"

;; enumerate
"begin{enumerate}
\\item 

\\end{enumerate}"

;; minipage
"begin{minipage}[b]{.49\\hsize}

\\end{minipage}"
"begin{minipage}{\\textwidth}

\\end{minipage}"

;; thebibliography
"begin{thebibliography}{99}
\\bibitem{}

\\end{thebibliography}"

;; frame for Beamer class
"begin{frame}{}

\\end{frame}"

"begin{frame}{}
\\begin{enumerate}
\\item 

\\end{enumerate}
\\end{frame}"

"begin{frame}{}
\\begin{itemize}
\\item 

\\end{itemize}
\\end{frame}"

"begin{frame}{}
\\begin{block}{}
\\begin{itemize}
\\item 

\\end{itemize}
\\end{block}
\\end{frame}"

"begin{frame}[fragile]{}{}

\\begin{lstlisting}

\\end{lstlisting}

\\end{frame}"


;; 行列
"left(
\\begin{array}{cc}
 & \\\\
 & \\\\
\\end{array}
\\right)"
"left(
\\begin{array}{ccc}
 & & \\\\
 & & \\\\
 & & \\\\
\\end{array}
\\right)"

;; cases
"begin{cases}
 & \\\\
 & \\\\
\\end{cases}"
	    ))

I am Just Another TeXnician. の元ネタは…、

JAPH = Just Another Perl Hacker(Just another Perl hacker - Wikipedia, the free encyclopedia)です。Just Another Perl Programmer の場合もあります。これは、perl コードで "Just Another Perl Hacker" だけを出力する文化です。

らくだのアスキーアート(AA)や世界地図の AA で、 "Just Another Perl Hacker" や "Hello World" の文字列を出力するなんて、面白すぎます*3

#!/usr/bin/env perl
 
undef$/;$_=<DATA>;y/ODA\n / /ds;@yoda=map{length}split;print chr
oct join('',splice(@yoda,0,3))-111 while@yoda;
__DATA__
         00O00O000O00O0000      000O         DD000000O0
        0DO0000000O0000O00     O00000        00O00000O0O
        0000      0O0         O00  O00       00D     0DO
         00O0     0O0        00D    000      DO0D00000D
          0O00    DOD       000000O00000     000  O00O
 DD0000D000O0     000      0O00O0000D00DO    0OD   D00O000D00O0
 00000DO00O0      000     000O        00D0   O0D    O00000O0DO0
  
 0O000   OD0D   O00O0   0000         DDDO000000      O00O000000
  0O000 O00DDO 00000   0O0D00        00O0O00000O    0O00O000000
   0O0O00OD00000DDD   00O  0D0       DDD     D0O    00O0D
    00000O00000000   O00    DO0      D00D00O000      00D00
     D0O00  O0000   000O000O00DO     000  00O0        0OD00
      O00    000   0O000D000O00O0    000   0D0O000000O00O00
       0      0   0O0D        0000   0O0    0O0000000O000O

そこで、TeX (LaTeX) でも同様なことで遊んでいる人がいるかと思って、ぐーぐる先生に聞いてみたところ、どうやらいないっぽいことが分かりました(分かっておりました)。いつの日か、このネタをやる機会を待っていたところ、たまたま今年の LT 枠がなかなか埋まらなかったこともあり、笑い役担当で実行委員自ら立候補した次第です。

Just Another TeXnician の中身は?

「Just Another」は、「ありきたりの、ありふれた、月並みな」という意味です。

そんな平凡な TeX つかいが、iamjatex.sty を書いてみたわけです。だから、実用性ゼロです(^^ そうそう、iamjatex.sty のライセンスは、public domain にすることにしますので、その代わりに、ぜひとも Just Another TeXnician 文化を TeX でも築けたらと思ったり、思わなかったり(笑

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{iamjatex}
  [2011/10/16 v0.1 defines iamjatex (I am Just Another TeXnician) environment]

\newif\if@iamjatexdebug \@iamjatexdebugfalse
\DeclareOption{debug}{\@iamjatexdebugtrue}

\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{iamjatex}}
\ProcessOptions\relax

%% take verbatim env. from latex.ltx
%% define iamjatex
\begingroup \catcode `|=0 \catcode `[= 1
\catcode`]=2 \catcode `\{=12 \catcode `\}=12
\catcode`\\=12 
|gdef|@xiamjatex#1\end{iamjatex}[|@iamjatex@aa[#1]|end[iamjatex]]
|endgroup
\def\@iamjatex{\trivlist \item\relax
  \if@minipage\else\vskip\parskip\fi
  \leftskip\@totalleftmargin\rightskip\z@skip
  \parindent\z@\parfillskip\@flushglue\parskip\z@skip
  \@@par
  \@tempswafalse
  \def\par{%
    \if@tempswa
      \leavevmode \null \@@par\penalty\interlinepenalty
    \else
      \@tempswatrue
      \ifhmode\@@par\penalty\interlinepenalty\fi
    \fi}%
  \let\do\@makeother \dospecials
  \obeylines \iamjatex@font \@noligs
  \hyphenchar\font\m@ne
  \everypar \expandafter{\the\everypar \unpenalty}%
}
\def\iamjatex{\@iamjatex \frenchspacing\@vobeyspaces \@xiamjatex}
\def\endiamjatex{\if@newlist \leavevmode\fi\endtrivlist}
\def\iamjatex@font{\normalfont\sffamily\Huge}

%% Don Knuth, H. Okumura AA: characters: #@%&X27/1:. 
\newif\if@iamjatexchar \@iamjatexcharfalse
\def\@iamjatex@aa#1{%
 \@iamjatexcharfalse
 \@tempcnta 65\relax
 \def\space{\ }%
 \@tfor\ch@r:=#1\do{%
   \def\@tempchar{X}%is a flag to output ``iamjatexchar''
   \ifx\ch@r\@tempchar\relax
     %%A-Z (65-90)
     \ifnum\@tempcnta>64\relax \ifnum\@tempcnta<91\relax \@iamjatexchartrue\fi\fi
     %%a-z (97-122)
     \ifnum\@tempcnta>96\relax \ifnum\@tempcnta<123\relax \@iamjatexchartrue\fi\fi
     \if@iamjatexchar
       \char\@tempcnta%
       \if@iamjatexdebug $_{(\number\@tempcnta)}$\fi
       \@iamjatexcharfalse
       \@tempcnta 65\relax
     \fi
     %%output \space if \@tempcnta is over 123
     \ifnum\@tempcnta>122\relax
       \if@iamjatexdebug \textvisiblespace\else\space\fi
       \@tempcnta 65\relax
     \fi
   \else
     %%1, 2, 7 are plus factors of \@tempcnta
     \def\@tempchar{1}%
     \ifx\ch@r\@tempchar\relax \advance\@tempcnta\@tempchar\fi
     \def\@tempchar{2}%
     \ifx\ch@r\@tempchar\relax \advance\@tempcnta\@tempchar\fi
     \def\@tempchar{7}%
     \ifx\ch@r\@tempchar\relax \advance\@tempcnta\@tempchar\fi
   \fi
 }%
}


\endinput
簡単な解説

\begin{iamjatex} ... \end{iamjatex} の実体は、基本的に verbatim 環境です。\begin{verbatim} から \end{verbatim} までの間にある文字列をごっそりと \@tfor で回して、あーだこーだとやっているだけにすぎません。

alphabetの出力に利用しているのは、\char'XX です。つまり、\char'65 が「A」、\char'66 が「B」、…、\char'90 が「Z」、\char'97が「a」、…、\char'122 が「z」を使っているだけです。アスキーアート中の数字を足し算していき、X がきたときの総和によって、どの文字を出力するか決めています。

これだけです!

当日に使っていた iamjatex.sty のバージョンは v0.1.1???

アスキーアートを自動で生成するツールを利用したものの、それはベースにすぎず、メッセージを一文字ずつ出力していくために、手作業で全部やらないといけないので、大変に時間がかかりました。

実は、Knuth 巨匠と奥村先生のアスキーアートを作成するのに膨大な時間がかかりまして、出力するメッセージを前日に修正したりしておりました。そのために、当日にタイプセットにかけていた iamjatex.sty のバージョンは、0.1.1 だったりします (^^ 早い話、若干ズルをしたわけです、ハイ!どこをズルしているのか、よーく目を凝らせば、分かるかと思います。

iamjatex.sty v0.1 と v0.1.1 との差分は…、考えてみてください(おぃ

Features???

iamjatex.sty は勢いで作ったので、技術的にとくにすごいことを何もしていません。全面的にアルゴリズムを変えてしまうのがよいでしょう。日本語対応もがんばればできるでしょう。もっと面白い TeX コードで書いてくれる人、待っています!私も暇なときに考えてみます。いや、ホント、実用性ゼロなんで、これ(^^;;

もっと魅力的で、Just Another TeXnician なコードを絶賛募集中です(笑

どうしてデモンストレーションの大部分が失敗したか?(苦笑

何十回もテストをしていたのに、あそこまでグダグダになるとは、想定外でした(^^

原因の一つは、プロジェクタに映したときの解像度が小さすぎたことです。これでは、Knuth 巨匠のお顔も全て表示されません(泣 また、奥村先生のお顔も全部表示できず、残念なことになってしまいました。

もうひとつの原因は、ヘッダにあったコマンド実行の記述が間違っていたことです。たぶん、LT 直前のテスト時に誤って「!」を消してしまったんだと思います。

-%# lualatex test && evince -f test.pdf
+%#! lualatex test && evince -f test.pdf

敢えて言うのであれば、最悪の自体に備えて、デモンストレーションをスクリーンショットした版のスライドも用意しておくべきでした (^^;;

「私は芸人じゃないです!」

大事なことなので、もう一度述べますね。

「私は芸人じゃないです!」

さいごに…、

私のこの LT は、何も技巧がなく、先人のみなさまの偉業を組み合わせただけにすぎません。

Knuth 巨匠、奥村先生、Emacs 開発者のみなさま、Anything をメンテナンスなさっておられる @rubikitch さん(id:rubikitch)、Auto Complete Mode 作者の松山さん、やてふ作者の広瀬さんをはじめ、すべての TeX/LaTeX に関わる方々、Emacs に関わる方々に、あらためて感謝いたします。

奥村先生、ご還暦おめでとうございます。懇親会で、赤ちゃんちゃんこをお召になられたとき、にっこりと笑顔な奥村先生のお顔が印象的でした*4

*1:TeXユーザの集い 2011 自体のレポートは、別途、書く予定です。

*2:vine-users:079475 yatexのコマンド補完 http://ml.vinelinux.org/vine-users/msg29470.html

*3:CPAN 以下にある JAPH があること自体、文化だという証拠です。 http://www.cpan.org/misc/japh

*4:奥村先生が twitpic に上げておられます! 一昨日の #texconf11 で18歳(52進)記念に赤いちゃんちゃんこを贈られ恥ずかしがっているところ@東大生研... on Twitpic