0番染色体

科学は全世界を照らす光である

TeXで簡単プログラミング♪

今回は TSG Advent Calendar 2015 の7日目の記事として投稿しています.昨日は SECCON お疲れ様でした.明日は cookies146氏 の予定でした.
なお,本稿は必ずしも プログラミングサークル TSG 関係者向けに書いたというわけではなく,プログラムを書くすべての人を対象にしています.要するに,あらゆるプログラマ向けの TeX on LaTeX の入門記事(のつもり)です.

LaTeX で文書作成をする多くのユーザにはあまり馴染みがないかもしれませんが,TeX はプログラミング言語です.大事なことなので繰り返します.TeX はチューリング完全性を有する関数型プログラミング言語です.

にもかかわらず,実際のところ TeX 言語 *1 を使ってプログラムを書いたことがあるという人はそれほど多くありません.

確かに,TeX はそもそも「プログラムを書くこと」を目的に開発された言語ではなく,また表現能力にも限界があるのでリアルタイムに顔認識をしてメガネをかけるお洒落な人工知能鳴子をインターフェースとする画期的な音ゲーを開発するのに向いているとはとても言いがたいです.

しかし,理系であれば多くの人が文書作成に LaTeX を用いているはずなので,論文やレポート執筆時にするような「ちょっとした計算」であれば,LaTeX の編集画面から移動せずに計算ができるので非常に便利です.あるいは,普通の「文書を書くためのマクロ」であっても,多少の条件分岐やループ構造が使用できる方が,そうでない場合よりもずっと柔軟なものを作成することができます.さらに,「任意言語の課題」を TeX (on LaTeX) で解くと,ほとんどの言語で実装した人に対して「○○での実装は甘え」などと主張することができます(主張出来るだけです.因みに実行時間の話になると,まず勝ち目はありません.).

課題の TeX 実装はさておき,とにもかくにも TeX on LaTeX でちょっとプログラムが書けると何かと便利です.そして,その方法は意外と簡単です.本稿では,そんな TeX on LaTeX の基礎の基礎を解説し,さらに TeX on LaTeX を少しばかり拡張する拙作のパッケージを紹介した上で,いくつかの(ある程度)実用的なマクロを例に実践的な TeX on LaTeX プログラミングを提示することを試みます.

*1:単に “TeX” というと(どういうわけか)LaTeX と勘違いする人がいるので,LaTeX ではない素の TeX,特にプログラミング言語としての TeX を指す場合には “TeX 言語” と表記されることがあります.

続きを読む

\relax の使い方 12連発

今回は TeX & LaTeX Advent Calendar 2015 の2日目の記事として投稿しています.初日の昨日は ZR氏 でした.明日は p_typo氏 の予定です.

\relax はその名の通り「TeX をリラックスさせる」命令です [1] .もう少し具体的に言うと,\relax は「何もしない」命令です.そのため,(La)TeX のソース中の適当な箇所に \relax を書き込んでも,多くの場合何も起こりません.例えば

\relax ああ,\relax とても\relax 緊張\relax する.\relax

などと書いたとしても,まるで \relax など存在しないかのように「ああ,とても緊張する.」と出力されるだけです.

ここで初めて \relax の機能を知った方は「そんな命令が何の役に立つというのだ」と思われることでしょう.しかし,実際にはこれが大いに役立ちます.TeX 言語のコード中では \expandafter と並んでよく用いられているぐらいです(当社調べ).したがって,\relax は今年の Advent Calendar のテーマ「今さら人に聞けない "TeX" のキホン」にまさしく適合する話題です.

「TeX 言語? いやいや,私は普通の LaTeX ユーザなので……」と思ったそこのあなた! このページを閉じるのはまだ早いです.本稿のすべての項目とは言いませんが,いくつかの項目は(TeX 言語を扱わない)一般の LaTeX ユーザでも知っておいて損のない話です.特に,今後「簡単かつ実用的なマクロ」を書く可能性のある人にとっては是非知っておいて欲しい内容と言えます.いずれにせよ,本稿は「TeX 言語を一切使ったことのない人」でもわかるようになるべく丁寧な説明を心がけたので,最後までお付き合い願えると幸いです.

なお,本稿では「一般的な \relax の使用法」のみならず「\relax である必然性はないが,しばしば \relax が用いられる事例」や「絶対にこういう使い方をすべきでない」ものまでリストアップしています.こうした注意はその都度指摘していきますが,読者諸氏におかれましても,すべてを鵜呑みにすることのないよう注意してお読みいただければと思います.

続きを読む

TeXで暗号化(3) バーナム暗号

前回からかなり間が空いてしまいましたが,シリーズ「TeX で暗号化」の第3回です.

前回までの記事(第1回第2回)では,それぞれシーザー暗号とアフィン暗号を扱い,いずれも暗号化・復号化方法を示した後にそれらが比較的簡単に「解読」できることを TeX のコードを記しながら述べてきたわけですが,今回は絶対に「解読」できない最強の暗号・バーナム暗号を扱いたいと思います.

続きを読む

TeX de Quine!!

最近『あなたの知らない超絶技巧プログラミングの世界』なる本が発売され,好評なようです.

あなたの知らない超絶技巧プログラミングの世界

あなたの知らない超絶技巧プログラミングの世界

その影響を受け,私の周辺ではちょっとしたQuine *1 ブームが到来しています.ということで,今回はTeX/LaTeXで「なるべく短いQuine」を作成することに挑戦してみました.

*1:Quineとは,実行すると自らのソースコードを出力するプログラムのことです.

続きを読む

ThinkPadにUbuntuを導入しMacライクな環境を構築したメモ

先日,大学からそこそこスペックのよいPC *1 を貸与されました.しかし,初期状態ではOSが(Windows 7しか)インストールされておらず使い物にならなかったので,Ubuntu 14.04 LTSを導入してみました(デュアルブート).本記事は,そのときにやったことを記録しておくメモです.単なる"メモ"なので説明は雑かつ外部サイト依存的であるということを予めご了承ください.

なお,行った設定や導入したソフト等は基本的に個人的な趣味で選んだものであるため,一般性はまったくありません.ただ,私用PCがMacBookであるため,方向性としてはなるべく普段のMac環境に近づけることを目指しています.

*1:スペック詳細:Lenovo, ThinkPad X1 Carbon, Windows 7 Prpfessional, Intel Core i7, 8GB RAM, 120GB SSD.

続きを読む