2012/12/25

\usepackage[dviout]{graphicx}でエラーが出た話

サブで使っているノートPCにTeXを入れていなかったので,これはいい機会だと思い,W32TeXに付属の簡易インストーラを用いた手動インストールを試みました。
実際にはその前にあべのりさんが公開しておられるTeXインストーラでのインストールをしようかと思ったのですが,細かい設定を自分でやるという手間は体験してみるものかなと思いまして。

さて,W32TeX,GhostScript,GSView,dvioutの4つをインストール後,試しに中間発表の予稿でもコンパイルしようと思ってコンパイルしたところ,次のようなエラーが
 ! LaTeX Error: Unknown option `dviout' for package `graphics'.
 おそらく,プリンアブルに書いた\usepackage[dviout]{graphicx}のことだろうとエラーメッセージから推測できましたが,いかんせん,メインで使っているノートPCや学校の端末室では体験したことのなかったエラーなので,何でこんなエラーが出たのかさっぱり。

ひとまず,エラーメッセージを読み取ってみると,「``graphichs'' パッケージに ``dviout'' なんてオプションはない」とのことなのでgraphics.styを探してみましたよ。
TEXMFMAIN/tex/latex/graphics
にありました。TEXMFMAINというのはディレクトリを簡略化するための表記で,以下のように読み替えてください。
TEXMFMAIN = [TeXのインストールフォルダ]\share\texmf
私は C:\w32tex にインストールしたので C:\e32tex\share\texmf となります。
ただし,人によってはW32TeXのインストールフォルダが違うと思いますので,そのあたりは適宜読み替えてください。

こいつを見ていたら ``dviout'' なるオプションが見つからなかったので,次のコマンドをgraphics.styの54行目付近に入れました。
\DeclareOption{dviout}{\def\Gin@driver{dviout.def}}
とはいえ,他のオプションの内容をコピーして,**.defというのをdviout.defに変えただけです。
素人が危なっかしいことやってるとは自覚あるので,あまりおすすめできませぬ。

これで一応コンパイルが通りましたが,dvioutのオプションはかなり前から使えたはずですが…。

(2013/09/08 追記)
どうやら原因はdviout.cfgとcolor.cfgなるファイルの日付がdviout側とTeX側で違っていたのが原因みたいです。
既に2012/12/17に見つかっていたようで,以下のブログ記事が見つかりました。
graphics package のエラー解決方法 - 考えごと + alpha

2012/12/23

スタイルファイルを作ろう("TeX & LaTeX Advent Calendar")

1. はじめに
本投稿は "TeX & LaTeX Advent Calendar" の参加記事です (http://atnd.org/events/34318)。
はじめに書きましょう。
22日目,遅くなりまして申し訳ありません。
帰宅後更新するつもりでいたのですが,いろいろあって遅くなったため,日付が変わってから書き始めるという失態…。

さて,今日は初心者向けの話の第二弾として,スタイルファイルについて書きます。
ひとまず,すごく大雑把なことしか書きませんが,頑張って加筆修正します。

2. スタイルファイルの作り方
スタイルファイルはいわばマクロ集であったり,文書の書式が書き込まれたファイルのことです。
"***.sty" という名前なのですが,これを作るために特別な知識は必要ありません。
テキストエディタを開き,次の1行をとりあえず書き込んで "my-macto.sty" という名前で保存しましょう。
\ProvidesPackage{my-macro}
これは入れなくても大丈夫なコマンドですが,あなたがプリアンブルでもしも同じ名前のスタイルファイルを "\usepackage" したときにエラーメッセージで教えてくれます。
少し便利ですね。
もしあなたが作ったスタイルファイルはLaTeXでしか使われてほしくないとき(TeXにはないコマンドを使っている時)は
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{my-macro}
と書いておくといいでしょう。これでLaTeX以外でこのスタイルファイルを読み込んだ文書を組版しようとするとエラーが出ます。

3. スタイルファイルに入れるもの
さて,スタイルファイルにはどんなものを入れればいいのか初心者にはよく分からないのではないかと思います。
一般的?には,スタイルファイルには次のようなものを入れておくといいでしょう。
自作のマクロ(図,表,式のラベル参照のマクロなど[1])
書式の設定(余白,文書の幅,タイトルの書式等)
などなど…
まとめてしまいますと,"他の文書でも使いまわすようなマクロ,設定" をスタイルファイルに書き込んでしまいましょう。
一例として,私が授業で教員に例として示された "my-report.sty" というのをgistにアップしました。
https://gist.github.com/4362214
から見れます。
これは,文書の余白を設定するためのコマンドが書かれただけのスタイルファイルです。

これを使いたい時,使いたい文書のプリアンブルにこのように書きましょう。
\usepackage{my-report}
これであなたが "my-report.sty" に書かれた余白の設定で文書を作ることができます。

4. スタイルファイルを使う前に(2012/12/23追加)
さて,大事なことを忘れていました。
新しく作ったスタイルファイルを使うためには,それがTeXにわかる場所に置かれていなければなりません。
一番簡単な方法は,そのスタイルファイルを使うソースコードと同じフォルダに入れておくことです。
でもこれはそのスタイルファイルを使うソースコードのフォルダを作るたびにコピーする必要があるので,面倒くさいと思うかもしれません。

このことについてはTeX Wikiの次のページを見るといいでしょう。
TeX入門/各種パッケージの利用 - TeX Wiki
http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%E5%85%A5%E9%96%80%2F%E5%90%84%E7%A8%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E5%88%A9%E7%94%A8#tc299bdb

5. 終わりに
スタイルファイルはわざわざマクロ定義や書式の設定をコピペする手間を減らしてくれる便利なツールです。
是非自作マクロや書式設定があるなら,スタイルファイルに書き込んでしまいましょう。
そうすることで,わざわざテンプレートをコピペする必要だってなくなります。

2012/12/19

マクロの作り方("TeX & LaTeX Advent Calendar")

1. はじめに
本投稿は "TeX & LaTeX Advent Calendar" の参加記事です (http://atnd.org/events/34318)。
人手が足りず,参加者募集中です。

さて,私の投稿も3回目となりました。
さすがにfp-packageネタは私が疲れたので,今回はマクロについて書こうかと。
とはいえ,初心者な人たち向けです。

2. マクロを作るコマンド
マクロを作ると言えば,正しくは "マクロを定義する" なのでしょうが,マクロを定義するコマンドは "\def" と "\newcommand" の2つあります。
"\def" はTeXで定義されているコマンドなので,LaTeXじゃなくても使えます。
"\newcommand" はLaTeXで定義されているコマンドなので,このコマンドをTeXで使おうとするとエラーが出ます。
とはいえ,TeXを触りだした人々はLaTeXを使っているはずですので,マクロの定義にはどちらを使っても大丈夫です。

違いは,"\def" の場合は既に同じ名前のマクロが存在する場合,上書きします。
"\newcommand" の場合は同じ名前のマクロがあると組版処理をするときにエラーが出るので,既に存在しているマクロを上書きしません。
そういうわけで,新しいマクロを作るときはなるべく後者を使うと良いのでは,と思います。

3. マクロの作り方
新しくマクロを定義するコマンドについて書きましたが,書式は次のとおりです。
\def<マクロ名><引数>{<処理>}
\newcommand{<マクロ名>}[<引数>]{<処理>}
<マクロ名>には新しく定義するマクロの名前が入ります。
たとえば "\hoge" とか "\eltaso" とかです。
基本的にマクロの名前には数字や特殊文字("_","^","&","%"など)は使えません。
(どこかでTeXで配列のようなものを実現しようとしているのは数字使っていた気がしましたが,あれは "\namedef" っていう別のコマンド使ってます。参照:[1],[2])

<引数>にはマクロが取る引数の数を入れます。
"\def" と "\newcommand" とで,引数の表記の仕方が違います。
"\def" の場合,"#1#2#3..." といった感じにし,引数の個数だけつなげます。
"\newcommand" の場合,[3]といった感じで,[]の中に数字を入れるだけです。
どちらの場合も1つのマクロには9個までしか引数が取れないので,"\def" の場合はいくら長くても "#1#2#3#4#5#6#7#8#9" までです。

<処理>にはマクロの処理内容が入ります。
たとえば,"\hoge" というマクロが "ほげほげ" という文字列になるようにしたいときは
\def\hoge{ほげほげ}
とすればいいです。
引数を使う場合,例として,図の参照を考えてみます。
レポートを書くときにはよく "図 ~" とか "Fig ~" という形式にしますが,これをマクロで実現すると
\def\figref#1{図\ref{#1}}
\newcommand\figref[1]{図\ref{#1}} 
 のように記述して,参照するときに \figref{<図のラベル>} のように記述してやると,図1といった感じになります。

例えば私は,図,表,数式の参照に次のマクロを定義して使っています。
\def\figref#1{図\ref{#1}}
\def\tabref#1{表\ref{#1}}
\def\eqnref#1{式(\ref{#1})}
こうすると,いちいち図とか表とか書かなくて済むので少し楽になります。
こういったマクロは1つのスタイルファイルにまとめておくと,いちいちプリアンブルで定義する必要が無いのでまた少し楽になりますが,スタイルファイルについてはこの記事中では触れません。

4. おわりに
マクロを使うと,何回も繰り返し使うようなものをコマンド1つで実現できるようになるため,省力化が期待できます。
とはいえ,ここに書いたことはごく基本的な部分です。
LaTeXについての本は多く出版されているので,マクロの定義についてもっと知りたい場合はそちらを見ると良いかと思います。

また,インターネットで探すと誰かが作ったマクロが見つかる場合もあります。
たとえば均等割付とか。

というわけで,今日はこのくらいで。

TeX & LaTeX Advent Calendar は今も空きがあり,参加者募集中です。
ぜひ参加して下しあ。初心者歓迎のようです。

参照webページ
[1] それでも TeX でプログラミングしたい人のための何か (8) - マクロツイーター
[2] それでも TeX でプログラミングしたい人のための何か (9) - マクロツイーター

2012/12/13

"fp-package"でジャネーの法則("TeX & LaTeX Advent Calendar")

~人生の折り返し地点(半分が経過した年齢)を求める~

1. はじめに
本投稿は"TeX & LaTeX Advent Calendar"の参加記事です (http://atnd.org/events/34318)。


参加人数の都合で,2回目の投稿になりますがやっていきましょう。
あらかじめ書いておきますと,本投稿では数式(画像ファイル)があります。
この画像ファイルの生成には "TeX clip(http://maru.bonyari.jp/texclip/)"を使いました。
数式の画像ファイルを生成できるwebサービスで,数式の入力にはTeXの記法を使います。
こういった記事を今後書くときは重宝するのではないかと思います。

2. ジャネーの法則
ジャネーの法則とは「人間の体感時間は年齢に反比例する」というものです。
同じ1日なのに年齢を重ねると短く感じるようになる,というのを法則にしたものです。
どうやらこの法則に従って考えると,人生の半分が20代の時に終わるらしいのです。
人生の半分といっても結局は体感時間のことです。

本当に20代に人生の半分が終わってしまうのか気になったので,検証してみましょう。

3. モデル化
体感時間は年齢に反比例するというので,体感時間を関数にするとこうでしょう。

 
変数 "t" は年齢,"T_{0}" というのは基準とする年齢です。
考える年齢の範囲は基準とする年齢以上としましょう。
前提として,基準となる年齢の時,体感時間は "k" としましたが,私が計算する時は "k=1" としています。
(体感時間は "Experience Time" とか見えた気がしたので "E_{t}" と書いてます。)

さて,体感時間を関数で表したので,今度は「基準とする年齢からある年数だけ経過した時,体感時間の合計はどれくらいか」を求めましょう。

単なる反比例の式なので自然対数が出てくるだけでこうなります。
これを使えば,ある年齢(例えば生まれたとき,0歳は無理なので1歳ぐらい)から寿命を迎えるまでという範囲における体感時間の合計が求められますね。

ここから先では基準とする年齢を "T_{s}",寿命を迎えるときの年齢は "T_{e}",基準とする年齢から寿命までの体感時間の合計を "T_{total}" などと書きましょう。
「人生の半分をどこで終えるか」というのは次のようになる "t" を探してみればいいわけです。
そして,それぞれの積分の値はどうなるのか求めたのでこれを解いていくと…
…ああ,この数式を使えばよいじゃないですか。
(筆者ははじめ,ループを用いて条件を満たす "t" を求めるという愚行をやっておりました)

4. ソースコード
そういうわけで,改めて書きなおしたソースコードはこちらです。
計算のために "fp-package" を使っているので,導入しないとエラーが出ます。

\documentclass{jsarticle}
\usepackage{fp}

\makeatletter
\def\Janet#1#2{
    \FPmessagesfalse

    \edef\jane@min{#1}
    \edef\jane@max{#2}

    % \jane@max = #2/#1
    \FPdiv{\jane@max}{\jane@max}{\jane@min}
    % \jane@max = (#2/#1)^{0.5}
    \FPpow{\jane@max}{\jane@max}{0.5}
    % \jane@min = #1 * (#2/#1)^{0.5}
    \FPmul{\jane@min}{\jane@min}{\jane@max}

    You are going to spend 50\% of your life when you are \jane@min \ years old. \par
}
\makeatother

\begin{document}
Janet's law

This law describes that the experience time is inversely proportional to age.

\Janet{6}{80}
\Janet{6}{100}
\Janet{1}{100}
\end{document}


5. 実行結果

実行した結果はこうなります。
Excelで計算した結果とあっているのでまあいいでしょう。
気になる人は電卓やExcelでグラフを描いてみたりしてみるといいかもしれません。

6. 終わりに
さて,途中で筆者の失態を晒してしまったわけですが,皆様への教訓ということでここは一つお願いします。

プログラムに実装する前にもっと簡単にできないか考えてみようね。
というとても良い例を示して終わりたいと思います。

○追記
数式の表記について,私の見落としがちらほら見えます。
なんとか見つけ次第修正していきます。

2012/12/04

Numerical Calculation Packages for TeX & LaTeX ("TeX & LaTeX Advent Calendar")

~TeX & LaTeXで数値計算するためのパッケージ~

1. はじめに
本投稿は"TeX & LaTeX Advent Calendar"の参加記事です (http://atnd.org/events/34318)。

12/3 は k16.shikano 氏の "TeXを電卓として使おう(あるいは、TeXでベキ乗根)" です。
12/5 は munepi 氏 (http://d.hatena.ne.jp/munepi/) です。

参加者の皆様が高度なネタを披露されている中,私のような初級者レベルの人間が参加しているというのも恐縮ではありますが,初心者歓迎,いやむしろ初心者来て,というTeX & LaTeX Advent Calendar主催のZR氏の悲鳴に応えたということでここはひとつ。
(本当のところは,開催が宣言されたときに意気揚々と参加したのですが)

さて,本日はTeX/LaTeXで数値計算ができるようになるパッケージを紹介します。
"fp-package" と "rsmath" の2つです。
それぞれのパッケージを私はどこで入手したか,というURLも併記しておきます。

2. fp-package (Fixed point arithmetic for TeX)
入手元(CTAN):http://www.ctan.org/tex-archive/macros/latex/contrib/fp/


固定小数点演算マクロを提供するパッケージ
数値代入,四則演算,条件分岐が主に提供され,ネイピア数の演算(指数関数,自然対数)もある。たしか数値の冪乗もある。
ただしREADMEには
Fixed point arithmetic for TeX with numbers ranging from
-999999999999999999.999999999999999999
to
+999999999999999999.999999999999999999
とあり,扱える数値の桁数は整数部18桁,小数部18桁となっている。

TeX には元々変数と呼べるようなものは,整数型しかありません。
では,どのようにして実数値を扱っているのかと言うと,マクロです。
文字列を展開するだけのマクロに,数値を与えることで実現しております。

fp-packageにある実数値を代入する(設定する)ためのマクロ\FPsetを同じような動作をするマクロで書けば
\def\pi{3.1415926535897932384626...}
ということです(内部での処理は違うかもしれませんが)。
例で示したものは単純に "3.1415926535897932384626..." と置換されるだけのマクロです。
このような "文字列に置換されるだけのマクロ" を実数型変数として使っています。

ちなみに,このfp-packageは条件分岐のマクロの構文がよくないことがZR氏に指摘されています。
(ZR氏のツイートを参照のこと [1], [2])
そういうわけで,[2]にあるように条件分岐を使うときには
\@gobble\if\FPifxx
としましょう。
さもなくば理由のわからないエラーで苦しむことになるかも(私は苦しんだ)。

もし作者がZR氏のツイートを見て修正していたならば,\FPifxxはそのまま使って大丈夫でしょう。

さすがに,円周率xx桁とかネイピア数xx桁求める!とか言わなければ小数部は18桁求められれば十分だと思います。
整数部も18桁まで表現できます。きっと十分すぎるくらいだと思います(1000兆だって13桁程度なんですから大丈夫でしょう)。

3. rsmath
入手元:http://www.geocities.co.jp/AnimalPark-Tama/8129/texmacro/index.html


多倍長整数演算及び初等関数の計算マクロを提供するパッケージ
まだ使っていないので,どんなことができるのかはよくわからないが,ひとまず四則演算のマクロはあるようだ。

まだバグがあるかもしれないらしく,参考としてスタイルファイル中にコメントが入っている。
また,使用例は拡張子を変えてコンパイルと書いてある。
しかし,実際に眺めてみるとどうもそれだけで済みそうにない気がするのだが気のせいか。
実際私はエラーが出た。
というかスタイルファイルを見ていたら「コンパイルするときはここをコメントアウト」みたいなコメントが見える。
あれ,私は疲れているのか…?

などと,酷評してしまったが,作者は(初級者の)私よりもずっとレベルの高い人のはずである。
…すいません。

そんなわけで私はこれを見つつ,実装方法について勉強したいと思う。

4. 最後に
以上,TeX/LaTeXで数値計算するためのパッケージ紹介でした。
とはいえ,私が見つけたものだけですので,他にもいいパッケージがあるかと思います。
CTANなんかで探してみるといいのではないでしょうか。
あるいは,Googleとかの検索サイトで検索してみるのもいいと思います。
実際私はぐぐってrsmathを見つけました。

数値計算と言えばネイピア数と円周率の計算が真っ先に思い浮かぶ人なので,fp-packageを使ってさっそく実装しましたがそれについてはまた後日?
rsmathは見つけた,というだけでまだ使ってません。

では,皆様よきTeX/LaTeX Lifeを。

私の振り返りのような何か ("Kosen Advent Calendar 2012")

~「振り返りのような何か」ではなく「後悔」と書けばいいのに~

本投稿は"Kosen Advent Calendar 2012" (http://atnd.org/events/34507) 参加記事です。
12/3 は たろー 氏の "やるかやらないかの話(Kosen Advent Calendar 2012 3日目)" です。
12/5 は たーちゃる氏の "Play Equipment" です。

0. はじめに
さて,私が4日目担当です。
1日目のさとゆ氏,2日目のタケウチ氏,3日目のたろー氏と,3人分の投稿を読みました。
皆さん様々な経験とか過去を辿っていらっしゃるなぁ,などと感じました。
おそらく,これから書く内容はさとゆ氏やたろー氏の内容とどこか似てる部分があるかもしれません。

本当は「後ろ向きな内容にしない」と決めたんですが,いざ書きだすと「第一稿書き上げた時点で後ろ向き」です。
そこはあらかじめ,ご了承下さい。そしてごめんなさい。
ちなみに第一稿と書きましたが,本記事は11月末頃~12月1日に一回書き上げて,後で何回か読み直して手を入れています。
それはただの私の性分なだけです。

1. 自己紹介
知らない人のほうが多いと思いますので簡単に自己紹介するです。
ねるこです。寝る子とも書きます。本来というかHNの由来は後者です。
お米がおいしいと噂のとある県にある高専にて,専攻科生をやっております。
好きなものはTeX/LaTeX,最近はC言語とTeXでプログラムを作って遊ぶのが日々の楽しみです。
最近は特にTeX/LaTeXプログラミングをこじらせており,生きがいと化しているかもしれません。
将来の夢はTeX/LaTeXで同人誌を出すことです!現在構想練ってます!
(つまりは,いつか参加者を募集するかもしれないということでここはひとつ)
また,別のプログラミング言語にも手を出そうかと考えています。何にしようかねぇ。

2. 本題
さて,本題に入る前にこれを書く際に私に言い聞かせた方向性を示しておきます。
「本科時代の振り返り,そして専攻科での迷い」です。
方向性と言うより,だらだら書いてしまう私のための制限です。
これでもいざ書きはじめると発散し始めて大変なことになります。

実際には,本投稿の核となっているのは「私の後悔」です。
後悔がつらつらと書かれています。特に後半。

2.1. 過去~本科時代~
「コンピュータ関係の仕事に就きたい」と考えていたのはまだやりたいことも見つからず,ただ授業を受け,出された課題をこなすだけの毎日を続けていた中学時代のこと。
親から「コンピュータ関係の仕事をしたいなら高専というものがある」と聞き,地元の普通高校は後回しにして,高専を第一志望として意識しました。懐かしいものです。
当時は「幅広くやってる学科に行っとけばとりあえず選択肢が広いままだし,無難だろう」と考えていました。実際,そのような学科に入学しました。

時は流れて,無事に高専に入学した後,「コンピュータ関係の仕事に就きたい,などというぼんやりとした理想では駄目だし,コンピュータ関係(情報系)はなんだか難しそうだから,将来は電気系の仕事を就こう」と考え直しました。
でも結局やりたいことは見つからずのままで本科を卒業し,とりあえず「学費が安い」とかその辺りの理由で専攻科に進学しました。
なんとも浅はかな理由だし,ここまでは自分の頭で考えず「親からすすめられたし」という考えで進学しております。
ああ,なんとあれな選択であろうか!

結局,情報系の道を選びたいと今は思っている。

2.2. 高専のメリット・デメリット
ここでは高専(本科)という選択肢について考えてみましょう。
まず,高専は中学卒で入学できるので早くから専門に触れますが,同時に自分の進路を狭めることになります。
これは読んで字の通りで,やりたいことが決まっていれば高専と言う選択肢は自分のやりたいことを学ぶための近道であるといえます。
さらに早くから研究があり,学会発表を経験することだってできます。
これは普通高校から大学,大学院に進学する人よりも早く経験が積めるというメリットであります。

そういうわけで,高専のメリットは以下の通りと私は考えます。
  • 早い時期に専門教育が受けられる=学びたいことを学ぶための近道
  • 研究,学会発表を通して問題解決のスキル,自分の成果を相手に伝えるスキルが養える
他にも考えれば出てきそうですが,(だらだら書かないために)ここで一旦切りましょう。
次,高専のデメリットですが,これは以下の通りだと思います。
  • 自分の進路を狭めることになる=取り返しがつきにくい
  • 高専自体が閉鎖的な環境で,外部との交流が少ない
  • 研究でなく,調査・開発に思考が向いている
上2つの説明は省略します。
一番最後について,これは私のことですが,こういう思考が染みついています。
大雑把にいえば,研究は「実験したらこうなった」「では,なぜこうなるのか」と結果から理由を追求していくものです。
調査・開発は「実験したらこうなった」「こういうものを作って評価してみた」と言った感じで結果を出して終わり,というものだと思います。
調査・開発の方に思考が向いてしまう,そんな私のことを卒研の指導教員は「高専生らしい」と言いました。
あの人がそういうので,高専生はこういう傾向なんだろうと思います。
デメリットについても,(だらだら書かないために)ここで一旦切りましょう。

2.3. 現在~専攻科~
先に書いた通り,やりたいことも分からぬまま,とりあえず専攻科に進学したわけです。
そして専攻科では研究がうまくいかず,周囲との差がついている現状に頭を抱える毎日を過ごしてます。
現在もろくに結果が出せていないので,いい加減逃げたいとか思ってます。
ああ,なんと無責任な!

さて,話は少し変わりまして,後期がはじまってから(正確には夏休みの終わりにインターンシップに参加してから)少し自分の将来について考え出しました。
夏休みのインターンシップで安全管理・危機管理について気になったのでそれについて勉強したいと思い大学院のページを調べていた時が10月~11月中旬くらいの話。
TeXでのプログラミングについて気になり,遊んでいたら段々と楽しくなってきて,プログラミングないし情報系の道も気になり始めたのが11月中旬くらい?からの話です。
そして,TeXで遊んだ成果が私の拙作「LaTeXで"千反田える"してみた」シリーズなのであります。

さて,話を戻しましょう。
現在は本科時代に引き続き,デバイス系の研究室にいるのですが,違う分野への興味がわいてきて,今の研究室は(研究がうまくいってないと言う個人的な理由と違う分野の勉強をしたいという欲望から)辛くなっていて,さてどうしようか,という悩みを11月下旬ごろから抱えて今に至るというわけです。
さて,どうしたものかねぇ,などと思いながら,今日も私は研究室で頭を抱えます。
いい加減どうするか決めないとね。

最近TeX/LaTeXで遊んでるとものすごく楽しくて,大学入り直そうかと考えるくらいです。
まあ,もう手遅れなんてどうするにしろ,1,2年程度のブランクは甘んじて受け入れる所存です。

3. まとめ
さて,ここまでは私の本科時代と専攻科での現状について,それと高専のメリット,デメリットについてだらだら書きました。
全体を通して何を言いたいかと言えば「進路についてはよく考えましょう」ということにつきます。
たぶん,改めて読み直すと,そう思える部分がそこかしこにあるのではないでしょうか。

以上で,本投稿はこといたします。
また後日,高専について何かしら書くかもしれませんし,従来通りTeXでひたすら遊ぶだけかもしれません。

2012/11/10

LaTeXで "千反田える" してみた(5)

(前:LaTeXで "千反田える" してみた(4))

~付録A : わたし,気になります~

本記事は「LaTeXで "千反田える" してみた」シリーズの補足記事となります。
つまりは付録的な扱いです。

「LaTeXで "千反田える" してみた」シリーズは以下の通りです。
概略:LaTeXで "千反田える" してみた(1)
命令の解説:LaTeXで "千反田える" してみた(2)
動作の解説:LaTeXで "千反田える" してみた(3)
反省会:LaTeXで "千反田える" してみた(4)


○千反田えるって誰?
<古典部>シリーズの登場人物であり,TVアニメ「氷菓」のキャラクタです。
私は原作を読んだこともアニメを見たこともないので名前だけ知っているというレベルです。

○前にC言語でやって挫折したみたいだけど?
まずは何でそんなことをやったかの経緯を説明しましょう。

おそらくことの始まり
@artchanter氏「【本日の発見】「一反田えー、二反田びー、......二十六反田ぜっと、二十七反田えー、......」と定義した時、「千反田」は「える」になる。」
https://twitter.com/artchanter/status/262869992377307136

さて,ある日このようなツイートがされました。
このことを確認するためにプログラムを作って確認する人が出ました。

例:@_kabix氏「「【本日の発見】「一反田えー、二反田びー、......二十六反田ぜっと、二十七反田えー、......」と定義した時、「千反田」は「える」になる。」 というツイートが朝から回ってくるので本当にそうなるかプログラムを走らせた結果」
https://twitter.com/_Kabix/status/263229881435971584

「剰余を計算すればいいのに何でループ組んでるんだ」と言う人も見られたのですが
なぜかわざわざループを組んでやってみる人が続出しました。

かくいう私も,そのような流れに乗って,まずはC言語でやったわけなのです。
やった結果は変換結果が1つ後にずれたので,それをどう修正しようかと考えたところでやめました。
だって面倒くさくなったんですもの

○そして,今に至ると
そういうわけです。
ね,どうでもいい付録でしょう?

2012/11/07

LaTeXで "千反田える" してみた(4)

(前:LaTeXで "千反田える" してみた(3))

~一人反省会,あるいは大反省会~

1. あらすじ
できたので意気揚々とソースコードを公開したものの,動作に支障が出ないけどミスを発見した。
そういうわけで,あわててソースコードを修正,その後反省会へと移行したのであった。

2. 詳細
千反田えるマクロをつくってコンパイルした時「\ifcaseで用意された分岐が足りないんだけど」というエラーが出たので,とりあえず分岐を1個増やして対応(この時点でバグがあったことを放置してたわけだが)。
無事コンパイルできたし,所望の出力が得られたのでよしとした。

ところが,改めて眺めてみると,エラーの原因が各桁の数値を取り出す処理にあったことが判明
\@whilenum \@a > 10 \do{%
    \advance\@a by -10 \relax
さて,この処理のループ条件に問題があったわけだ。
ループ条件は "\@a > 10" つまりカウンタ\@aの値が10より大きいならループを続けるというもの。
今になって思えば,\@aが0~9のときにループを抜けてほしいのだが,\@a=10でもループを抜けるのである。
これがエラーの原因だったわけで,0~9までしか分岐を想定してないのに,
10を与えているから\ifcaseの分岐の数が足りないと言われたのである。
修正したら無意味な分岐は不要になったのでこれで一安心

3. なぜ正常?な動作をしていたか
\@a=0の処理が常時\@a=10の時に処理されたからである。
そういうわけで,\@a=0のときは何もしないという処理はずっと実行されないままだったのだ。

4. 終わりに
ソースコードは修正しました。
無着色,無添加なので(?)安心して使ってください。

(次:LaTeXで "千反田える" してみた(5))

○追記(2012/11/08)
どうやら私のようなひよっこが遊んでいたのを私よりもずっとハイレベルな方の目に留まってしまったようです(いわゆる "TeXnician" という人だと思います。決して "TeXpert" ではありません!)。
ブログ記事の題材として取り上げてもらい,どうしてこうなった!としか言えませぬ。
それでも TeX でプログラミングしたい人のための何か (2) - マクロツイーター

ちなみに,これの前の記事
それでも TeX でプログラミングしたい人のための何か (1) - マクロツイーター
では特に用心すべきこととして
  • TeX はフリーフォーマットじゃない
  • ローカル変数なんてものはない
  • 関数に相当するものは(普通は)ない
  • 引数パラメタ(#1 等)は実際に渡されたものの別名である
と書かれており,「これ(2個目以降)はきっと私のことだな」と思いながら,自分の書いた文を見返しております。
ソースにも "カウンタ(変数)" というあやしい表記をしており,理解を深めるべきであるとのお告げが聞こえます。

(氏がこのような記事を書いたのは,タイミングを考えると,私のようなひよっこが手を出したからではなかろうかと思っており,軽率であったと反省の意を示したく…)

LaTeXで "千反田える" してみた(1):概略 でも参考webページとして紹介したブログ記事の追記でも取り上げて頂きました。
プログラマーのためプログラミングLaTeX - プログラムモグモグ

あ,はい。よくもわるくも,全ての元凶はあなたの記事です(

○追記(2012/11/10)
時間を見つけて記事は随時修正していきます。
修正したら、こうして追記として最後に加えておきます。

LaTeXで "千反田える" してみた(3)

(前:LaTeXで "千反田える" してみた(2))

~とりあえず解説(動作編)~

LaTeXで千反田えるしてみたの記事も3個目になりました。

ソースコードを見たい人は
LaTeXで "千反田える" してみた(1)

使われている命令の大雑把な解説を見たい人は
LaTeXで "千反田える" してみた(2)
をそれぞれ見てください。

今回は千反田えるマクロの処理の流れについて実際に処理している順番通りに説明したいと思います。


1. \defでマクロ定義
そのまんまです。マクロを定義します。

2. \newcountで新しくカウンタを定義,数値の代入
カウンタとして\@a,\@loop,\@limitを定義しました。
\@aは数字を漢数字に直す部分と,それに対応するアルファベット(ひらがな)を出力する部分で使います。
\@loopはループ回数を数えるカウンタです。
\@limitはループ回数の終了条件用のカウンタです。
こいつには引数を代入した後,1を足します。
何でそんな事をするかと言うと,ループでの判定条件は \@loop < \@limit なので \@loop = \@limit になったらループから出ます。
つまりは1足しておかないと千反田が欲しくて1000を与えたけど,九百九十九反田で終わってしまうからです。

元々与える引数の数字を1大きくすればいいという話でもあります。

3. \@loop < \@limit を満たす間はループ
それだけです。このループの中に今回のマクロのキモがあります。

3-1. 各桁の値を取り出す。
まず,漢数字に変換するためには各桁の数字がいくつなのかを判定する必要があります。
残念ながら,TeX / LaTeXには剰余を求めると言うチート演算はないので割り算で取り出したい桁を1の位にする → それ以上の桁がなくなるまで10で引く
という処理をやっています。
前者は対応するやつで割ればいいだけです。1000とか100とか10とか。
後者の部分はマクロでいえば
\@a = \@loop \relax
\@whilenum \@a > 9 \do{%
    \advance\@a by -10 \relax
}
というところです。
剰余というのは言いかえれば割る数字より小さくなるまで減算するという処理です。
そのためひたすら10で引いてます。これが10の剰余にあたります。

さて,これで求めたい桁の数字が取り出せます。
そしたら次は対応する漢数字にしてやりましょう。

3-2. \ifcase で条件分岐(ループ回数(数字) -> 漢数字)
\ifcase でカウンタ\@aの値を判定しています。
\ifcase ならば,<\@a = 0> \or <\@a=1> \or ...
といった風に,0ならばこの処理,1ならばこの処理といった具合にカウンタの数値と処理の順番が対応しています。
これを利用して "カウンタが0ならば何もしない","カウンタが1~9ならば対応する漢数字をマクロ \@list に追加する" という処理にしています。
\@list はカウンタと同じように @ つきのものですが,マクロです。
こいつは \@list と書かれた部分があると,定義された処理で置換します。
つまりは,\@list には文字列を入れてあるので,そいつを表示するだけです。

3-3. \ifcase で条件分岐(ループ回数(数字) -> あるふぁべっと)
さて,今度はループ回数からあるふぁべっとに変換します。
Alphabetは26個しかないので当然,\ifcase で判定する数値も1~26の範囲で想定しましょう。
26個の分岐処理を作るのが面倒臭い?頑張ってください。
その気になれば,似たようなもので "ひらがなとカタカナの相互変換" マクロだって作れますよ。
(LaTeXで "千反田える" してみた(1) 参考webページ [3] 参照)

さて,ここでも各桁の数字を取り出すときと同じような処理をしています。
ループカウンタが "26より大きいならば" 26より小さくなるまで26で引き続けるという処理です。
ここが大事な処理でして,プログラミングで言うならば "26で剰余を取った後,演算結果に1を加える" に相当します。
この処理は各桁の数値を取り出す部分の10を26に変えればいいだけです。

3-4. 変換結果を表示する
さて,頑張ってループ回数からループで各桁の数字を取り出して漢数字に変換し,再びループ回数からループで今度はあるふぁべっとに変換し,ついに \@list の中身は "xxx反田 ..." になりました!
よくぞ頑張りました。あとはその変換結果を表示するだけです。
表示処理はこちら!
\@list
なんだかあっけないものですね。この一行だけで終わりです。
あとはループ回数のカウンタ \@loop に1を加えて再びループ判定に戻りましょう。

さて,マクロの流れの解説はこれで終わりです。
お疲れさまでした。

皆様もよきLaTeX Life をお送りください。

(次:LaTeXで "千反田える" してみた(4))

○追記(2012/11/10)
見出しを太字にし、リンクを追加しました。

2012/11/06

LaTeXで "千反田える" してみた(2)

(前:LaTeXで "千反田える" してみた(1))

~とりあえず解説(命令編)~

はい,解説(命令編)です。
マクロに使われている命令について大雑把に解説するだけの記事です。
正直TeX / LaTeXというものに対する理解は大したものではないので,大雑把にしか説明できません。
よくインターネットで検索すると見つかるくらいの情報しか書けないよ。
それでもいいならのんびりやっていくのでどうぞ。

ソースコードを追いながら解説はひどく面倒くさいので,使われている命令とその意味を書いておきます。
また,真面目にやろうとしたら面倒くさくなったため,「これを見ればなんとなくこんな動きをしていることが分かる」くらいのレベルのつもりです。

○@付のカウンタやマクロを使う
\makeatletter
\makeatother
こいつは@のついたカウンタやを使うための命令です。
通常,@のついたカウンタやマクロは本文のあるソースファイルで使わず,スタイルファイルやクラスファイル中に書いておくものなのですが,プリアンブルにマクロ定義を書きたかったりするときはこいつを前後に入れます。

(追記)
本文中でも使えますが,基本的にはプリアンブルかスタイルファイル,クラスファイルに入れておく方がいいでしょう。
そもそも,こういうマクロは分けておいた方がいいです。
プログラムを作るときにモジュールに分割することと同じようなものです。

○マクロを定義する(1)
\def
Example : \def\eltaso#1#2#3{処理}
\defは新しいマクロを作る命令です。
同じことをするコマンドに\newcommandがありますが,あれはLaTeXで用意されたものだったかな。
ただし,\defは同じ名前のマクロが存在しても無視して上書きするので,そこが気になる人は同じ名前のマクロがあるとエラーを出してくれる\newcommandを使いましょう。
使用例では引数を取るマクロを作ってますが,もちろん引数なしでもいけます。
ただし,取れる引数の数には上限があったはず(後で調べて追記します)。

(追記)
取れる引数の数は9が上限です。


○マクロの定義(2)
\edef
Example : \edef\@list{反田}
Example : \edef\@list{\@list える}  
\def命令と似たようなものですが,こいつの場合は\edefで定義したマクロは\edefを使わないと再定義できません。
途中で\def\@list{ちーちゃんかわいい}とか入れたって上書きされません。
ちなみに2個目の例では定義しようとしているマクロの中に同じ名前のものがありますが,これは再定義するときに使えて,既に定義されているものに新しく "える" という文字列をくっつけられます。
これを利用して,千反田えるマクロでは数字を頭につけています。


○新しいカウンタを定義する
\newcount
Example : \newcount\@a
新しいカウンタをつくる命令です。
例で示したように, \newcountの後にカウンタ名を書きます。
基本的に整数のみしか扱えません。
固定小数点を扱えるパッケージ(fp-package)もあるようです。

○カウンタに値を代入する
\@a = 1
\@a = \@loop
\@a = #1
カウンタに値を代入する操作?命令?です。
定数を代入できますし,別のカウンタの値も代入できます。
ここで,マクロの引数に与えたものだってもちろん代入できます。
その場合は#1,#2,#3といった感じになりますが,これは引数の順番です。

○カウンタの四則演算
\advance xxx by ...
\multiply xxx by ... 
\divide xxx by ... 
Example : \advance\@a by \@k
上から順番にカウンタ(xxx)に対してbyの後ろの値(...)を加算,乗算,除算する命令です。
byの後ろに来るものはカウンタでも定数でも引数でも構いません。
ただし,計算結果はカウンタ(xxx)に代入されます。

○ループ構文
\@whilenum
Example : \@whilenum \@loop < \@limit \do{処理}
LaTeXで用意されているループ構文の1つです。
\@whilenum と \do の間にある条件が満たされている間,カッコでくくられた処理を続けます。
比較には不等号と等号が使えます。
比較はカウンタ同士やカウンタと引数,変数と定数ができます。

○条件分岐
\ifcase
\ifcase\@a <0のとき> \or <1のとき> \or ...
Example : \ifcase\@a \edef\@list{零反田} \or \edef\@list{一反田} \or ...
これはカウンタの値を判定し,その数値によって出力を変えられますが,
一番最初の処理はカウンタの値が0のとき,その次は1のとき,と既に決まっております。
これを利用して1の時は一をくっつけ,2の時は二をくっつけ…とかやってます。

さて,これだけ書いておけばなんとなく分かるでしょう。

○最後に:\relaxって何?

なに?\relaxの説明がない?ああ,すまない。
すっかり忘れていた。
\relax
こいつを入れると精神的に穏やかになれます。
LaTeXで "千反田える" してみた(1) 参考webページ[1]参照)

(次:LaTeXで "千反田える" してみた(3))

○追記(2012/11/10)
変数と表記されていたところをカウンタやマクロに変えました。
また,使用している命令の分類ごとに見出しを付けました。
これで少しはより正確な表現に近付いたと思われます。
とはいっても,また正確にはほど遠いものだと思いますが。

LaTeXで "千反田える" してみた(1)

~概略~

1. すべての始まり
一体どういう流れで見つけたのかすらも忘れてしまったのですが,LaTeXで計算をやってしまおうというブログ記事を見つました[1]
最初,それを見た私はLaTeXで計算をやらせると言うよりはそのために使われてる命令が気になったので調べようと思いました。
ループ構文の方は苦戦しましたが[2]

んで,いろいろ調べていたらひらがなをカタカナに変換するというマクロを見つけました[3]

そこで私はひらめいたのです。
以前C言語でつくったけど挫折したあれ,できるんじゃないかと。

2. 必要な知識
LaTeXでマクロを作りました。
必要なコマンドの知識は次の通りです。
  • 自作マクロが定義できる
  • \newcount でカウンタが作れる
  • 作ったカウンタに数値の代入,四則演算ができる
  • \@whilenum でループが作れる
  • \ifcaseを使って条件分岐ができる
こんなことは既に知っている,という人はソースコードを見てみればいいと思います。
分からないから解説が欲しい,という人はこれから解説記事を書くので,そちらを見ればいいと思います。

3. 出来上がったもの
さて,私がつくって出来上がったソースコードが以下です。
\documentclass{jsarticle}
\makeatletter
% えるたそマクロ
\def\eltaso#1{%
% カウンタの定義
\newcount\@a % ループ回数からの算出用
\newcount\@loop % ループ回数カウント
\newcount\@limit % ループ回数上限(引数+1を代入)
% カウンタへの数値設定
\@loop = 1 \relax % 1を代入
\@limit = #1 \relax % 引数を代入
\advance\@limit by 1 \relax % 1を足す
% 引数の回数だけループ
\@whilenum \@loop<\@limit \do{%
    % マクロ定義({}内の文字を展開)
    \edef\@list{反田}
    % 各桁の数字を抽出
    \@a = \@loop \relax
    % 9より大きいなら10で引く
    % これを9より大きいという条件が満たされている間続ける
    \@whilenum \@a > 9 \do{%
        \advance\@a by -10 \relax
    }
    % \@aの数値で処理を分岐
    \ifcase\@a \or
        \edef\@list{一\@list} \or
        \edef\@list{二\@list} \or
        \edef\@list{三\@list} \or
        \edef\@list{四\@list} \or
        \edef\@list{五\@list} \or
        \edef\@list{六\@list} \or
        \edef\@list{七\@list} \or
        \edef\@list{八\@list} \or
        \edef\@list{九\@list}
    \fi
    \@a = \@loop \relax
    \divide\@a by 10 \relax
    \@whilenum \@a > 9 \do{%
        \advance\@a by -10 \relax
    }
    \ifcase\@a \or
        \edef\@list{十\@list} \or
        \edef\@list{二十\@list} \or
        \edef\@list{三十\@list} \or
        \edef\@list{四十\@list} \or
        \edef\@list{五十\@list} \or
        \edef\@list{六十\@list} \or
        \edef\@list{七十\@list} \or
        \edef\@list{八十\@list} \or
        \edef\@list{九十\@list}
    \fi
    \@a = \@loop \relax
    \divide\@a by 100 \relax
    \@whilenum \@a > 9 \do{%
        \advance\@a by -10 \relax
    }
    \ifcase\@a \or
        \edef\@list{百\@list} \or
        \edef\@list{二百\@list} \or
        \edef\@list{三百\@list} \or
        \edef\@list{四百\@list} \or
        \edef\@list{五百\@list} \or
        \edef\@list{六百\@list} \or
        \edef\@list{七百\@list} \or
        \edef\@list{八百\@list} \or
        \edef\@list{九百\@list}
    \fi
    \@a = \@loop \relax
    \divide\@a by 1000 \relax
    \ifcase\@a \or
        \edef\@list{千\@list} \or
        \edef\@list{二千\@list} \or
        \edef\@list{三千\@list} \or
        \edef\@list{四千\@list} \or
        \edef\@list{五千\@list} \or
        \edef\@list{六千\@list} \or
        \edef\@list{七千\@list} \or
        \edef\@list{八千\@list} \or
        \edef\@list{九千\@list}
    \fi
    \@a = \@loop \relax
    \@whilenum \@a > 26 \do{%
        \advance\@a by -26 \relax
    }
    \ifcase\@a \or
        \edef\@list{\@list えー } \or
        \edef\@list{\@list びー } \or
        \edef\@list{\@list しー } \or
        \edef\@list{\@list でー } \or
        \edef\@list{\@list いー } \or
        \edef\@list{\@list えふ } \or
        \edef\@list{\@list じー } \or
        \edef\@list{\@list えいち } \or
        \edef\@list{\@list あい } \or
        \edef\@list{\@list じぇー } \or
        \edef\@list{\@list けー } \or
        \edef\@list{\@list える } \or
        \edef\@list{\@list えむ } \or
        \edef\@list{\@list えぬ } \or
        \edef\@list{\@list おー } \or
        \edef\@list{\@list ぴー } \or
        \edef\@list{\@list きゅー } \or
        \edef\@list{\@list あーる } \or
        \edef\@list{\@list えす } \or
        \edef\@list{\@list てぃー } \or
        \edef\@list{\@list ゆー } \or
        \edef\@list{\@list ぶい } \or
        \edef\@list{\@list だぶりゅー} \or
        \edef\@list{\@list えっくす } \or
        \edef\@list{\@list わい } \or
        \edef\@list{\@list ぜっと }
    \fi
    \@list
    \advance\@loop by 1 \relax
    }
}
\makeatother
\begin{document}
\eltaso{1000}
\end{document}
こいつをコンパイルして得た結果(dviファイル)がこちらです。

25ページを費やしました。
二段組みにはしてないので,割ともったいない感じです。
一反田えー からはじまって 千反田える まで25ページです。

○参考にしたwebページ一覧
[1] プログラマーのためプログラミングLaTeX - プログラムモグモグ
http://d.hatena.ne.jp/itchyny/20121027/1351299600
これを見たのが始まり,かな。

[2] TeX のループ構文 - マクロツイーター
http://d.hatena.ne.jp/zrbabbler/20110828/1314537300
ループ構文で調べてみてみたものの,眺めた程度ですすいません

[3] メモ帳/TeXマクロ2 - MyTeXpert
http://mytexpert.sourceforge.jp/index.php?%A5%E1%A5%E2%C4%A2%2FTeX%A5%DE%A5%AF%A5%ED2
ここにあるひらがなをカタカナに変換するマクロを見て千反田えるしようと思いました。

(次:LaTeXで "千反田える" してみた(2))

○追記(2012/11/10)
大した修正はやっていませんが,文を少しと節見出しを○と太字にしました。
それと追記に書いていたソースコードを本文中に移動しました。

ところで,TeXの場合はソースコードと言う呼び方でいいんだろうか?