7月 2009

ファイル全体を一つのスカラー変数に代入するには

PerlでTeXの文書をちょちょっと変換するプログラムを作ろうとしたのだが、思わぬところで頓挫。Perlで処理する普通の作業ってのは、行単位で読み込んで処理して出力して、とかいうのが多い。よくあるサンプルを真似して作っていたのだが、大域変数$_ に入っているのがファイル全体だと思い込んでいたら、実は一行分だったのが迷走の原因だった。

ファイル全体、つまりすべての行を一つの文字列変数に代入するには、読み込む前に区切り記号を表す大域変数 $/ を未定義の状態、つまり undef にする。たったこれだけの為に、難渋してしまった。ということで、備忘録としてメモ。

{
  local $/ = undef;
  $_ = readline INFILE;
}

とすれば、ファイルハンドラー INFILE から読み込んだすべてのデータが $_ に入る。

敗北

リスト表示のLaTeXコードを書き換えずに表組にするマクロを作ろうと、しばらく格闘したが敗北。詳しい理由は分からないが、どうも \begin{hoge} ... \end{hoge} の環境の処理あたりに原因があると推測。ワタシの力ではダメでした・・・。

目的は次の通り。すでにリスト表示することを前提に、次のような文書が作ってあるとする。

\section{はじめに}
\begin{itemize}
\item なんとか
\item かんとか
\item かくかく
\item しかじか
\end{itemize}

\section{つづいて}
\begin{itemize}
\item あれや
\item これや
\end{itemize}

こんな調子でかなりのページが組んであるのだ。ところが、気が変わって、表組みにしたくなったとする。つまり次のような感じ。

\begin{tabular}{|c|c|c|}
\hline
はじめに &              &       \\ \hline
            &  なんとか &       \\ \hline
            &  かんとか &       \\ \hline
            & かくかく  &       \\ \hline
            & しかじか  &       \\ \hline
つづいて  &             &       \\ \hline
            & あれや    &       \\ \hline
            & これや    &       \\ \hline
\end{tabular}

もちろん、Perlとかで変換することも考えたのだが、なんとかマクロ処理で出来ないかと思ったのだった。簡単だと思ったんだがなあ。環境の処理の仕方をソースコードを読んで理解してから、また挑戦という選択肢もあるにはあるが・・・。

とりあえず、次善の策として、もう少し汎用性のある形式に Perl で変換しておこうと思う。例えば、

\contents

\section{はじめに}
\itemize
\item なんとか \enditem
\item かんとか \enditem
\item かくかく \enditem
\item しかじか \enditem
\enditemize
\endsection

\section{つづいて}
\itemize
\item あれや \enditem
\item これや \enditem
\enditemize
\endsection

\endcontents

これだと、簡単なマクロで、リストにも表組みにも対応できるのだ。既に実験済み。というか、どうして環境だと出来ないのか謎である。

Windowsで印刷トラブル

いやあ、こういうことが起こるからWindowsは使いたくないのだが・・・。

かみさんから頼まれていた文書(ダウンロードしたもの)を印刷することに。PDFならUbuntuから印刷するのだが、拡張子が .doc のファイル。これって、MS Word ですよね。もちろん Open Office で開くこともできるのだが、微妙な違いが出ることを恐れて Windows から印刷することにした。ところが、プリンターが見つからないよ〜と、エラーを吐く。

いろいろやった挙句、結局、プリンターのプロパティーからプリンターのローカルIPを直接指定することで解決。というか、今までこんなことしたことないんだけどさ。何故に今回、こういう羽目になったのでしょうか。

それに、うちの場合、ローカルIPはルーターが自動で振っているから、次回ログインのときに変わっていないとも限らない。そのたびにIPの設定をするのも面倒だし。いっそ、ローカルIPを固定するかとも考えるが、UbuntuとMacでもその設定をするかと思うと、それも憂鬱。Windows以外では、とくに問題はないのだしね。

まったく Windows には腹が立つ。やれやれ。

環境変数の設定と .bashrc と .bash_profile と .profile

最近のUbuntu GNU/Linuxでは、ログイン時に .bash_profile ではなく .profile が読み込まれるらしい。実際、Ubuntu 8.04 (Hardy Heron) をインストールした直後に自分のHOMEを見たところ、.bash_profile はなかった。お勧めの使い方は .profile で .bashrc を読み込み、個人的な設定は .bashrc で行うというもの。それに従って、
export PATH = /usr/local/teTeX/bin:$PATH;
と /usr/local/teTeX/bin にパスを通している。ターミナルから which platex とかやると /usr/local/teTeX/bin/platex と表示されるので、パスが通っていることは間違いなく、実際、ターミナルからは platex hoge.tex とかでちゃんとプログラムが起動する。

ところが、エディターから platex を起動させようとすると、これが動作しない。しかたないので、フルパスを書いていた。これだと動作するのだ。今回、文字コードを判別しながら組版、PDF作成など一連の作業を行う自前の Perl スクリプトを作ったのだが、やはり system(“platex $texfile”) では platex を見つけられないようだった。仕方ないので、やはりフルパスを記述していた。

ふと思いついて、Perlが認識している環境変数を表示させてみた。スクリプトの最後に print(“PATH = $ENV{PATH}”) と書いて、環境変数PATHを表示させる。案の定、/usr/local/teTeX/bin は含まれていなかった。ううむ、何故なんだろう。

そこで、実験。試しに、直接 .profile の方に export PATH=/usr/local/teTeX/bin:$PATH; と書いてみた。おお、ちゃんとPerlも認識している。

結論。要は、見よう見まねに書いていた .profile と .bashrc あたりの設定が適切でなかったということですかね。きちんと勉強したい気もするが、そこまでの時間と余裕がない。とりあえず目的は果たしたということで、現状をメモするだけにしておこうか。

YaTeX(野鳥)をEmacs-snapshotにインストール

備忘録。てっきりインストール先は、/usr/local/share/emacs/site-lisp/ で良いと思って makefile を修正して sudo make install したのだが、まったく反応なし。Emacs-snapshot (Emacs 23) の場合は、/usr/share/emacs-snapshot/site-lisp/ だった。makefile を再び修正してインストール。とりあえず、yatex mode になったので、インストールは成功。これからコンパイル関係の設定をしなくてはならないが、今日は疲れたので、ここまで。

\ifx でのトークンの比較

ひさびさにTeXマクロを組んでいて、ちょっとはまってしまったので、備忘録としてメモ。

マクロのオプション変数が空文字かどうかをチェックするルーチンで、直接 \ifx#1\empty ... とすると、#1が空であってもマッチしない。一度マクロで、 \def\hoge{#1} と定義してから \ifx\hoge\empty ... とすれば、#1が空の場合にちゃんとマッチする。

そういえば、以前にもこの \ifx でのトークンの比較ではまったことがある。テックブックを読んでも今一つピンとこないというか、大体こんな感じかなと、中途半端な理解で使っているのがいけないのだろうが。

Firefox3.5

Firefoxのヴァージョン3.5が出たらしく、家内のWindowsの方ではアップデートが催促(?)されるというか、自動的にアップデートされたらしく、知らないうちに3.5になっていた(笑)。宣伝文句ほどは速さを感じないものの、確かに動作は以前よりきびきびしている。ということで、Ubuntu/Linux版はまだかなあと待っていたのだが、いつになってもアップデートのお知らせが来ない。

ところが、実はLinux版も既に出来ているようなのだ。何故にアップデートの催促がないのか不思議だが、ともかくサイトに取りに行き、解凍してfirefoxを起動。ブックマークなども既存のを読み込んで、3.5が使えるようになった。

ところが、これが3.0を上書きしていないようで、両者共存になってしまった。/usr/bin/firefox は依然として firefox-3.0 へのシンボリックリンクになっていて、3.5の方は、ダウンロードした場所が ~/firefox/firefox なので、ここを直接起動させないとダメ。ううむ、どうしようかな。これって、firefox本体だけ /usr/bin/ 以下に移して、そこにリンク張ってもダメなんだろうな。同じフォルダーに沢山ファイルあるし。

それから、3.0用のプラグインで3.5に対応できてないのが幾つかあることが判明。特にVideo Downloaderあたりが未対応なのがちょっと痛いかも。ということで、ショートカットを二つ作って、適宜使い分けることにした。ブックマークとかが共通なのが便利なのか危険なのか・・・ちょっと不安もあるのだが。

やる気だけはあるのだが

自分用のテックのマクロを同僚が使えるように整備して配布したいなあと、随分前から考えてはいるのだが、これがなかなか出来ない。現状のまま、多少整備されてなくても良いではないかとも思うが、さすがにちょっと気恥ずかしいとか、いろいろあって。

それに、クラスファイルと汎用のマクロが渾然一体となっている部分もあって、これも分離した方が良かろうとか、自分好みのタイプフェースの設定とかは無い方がいいかなとか、いろいろ考えると面倒くさくなって、また今度ねえ〜となってしまうのだった。

今日も少しだけマクロのバージョンアップをしたけど、中途半端。一つだけ勉強したことをメモ。\newenvironment で新しい環境を定義するとき、オプションの引数も使えるようだ。ワタシの持っている判のLaTeX Companionには、\begin{hogehoge}[option] … \end{hogehoge} という書き方が出来るとは書いてなかったので、てっきりダメだと思っていたのだが、吉永徹美さんの 「LaTeX2e プログラミング基礎解説」によると可能なようなことが書いてあった。もっとも、自前で、

\def\hogehoge{\ifnextchar[{\@hogehoge}{\@@hogehoge}}

みたいな調子で処理すれば出来るのは何となく分かるのだが、こういうのが毎回出てくると面倒なんだよなあ。

あと、やっぱりみんなに使ってもらうには、使い方というか仕様書を書かねばならないだろう。実はこれが一番面倒かもしれない。ううむ。

校了のはずが

昨日、最終ゲラ(四校)を戻し、今日で校了の予定だったが、どういう訳だか一ヶ所直っていない。どうやら誰かのうっかりミスというか勘違いらしい。急遽連絡するも、現場のオペレーターさんは帰られたとかで、印刷所には直せる人が居ないらしい。ええ〜。念校の日にか! 😯  おまけに明日も休みで、月曜にならないと再開できないらしい。ううむ、土日きちんと休みなんですね。

ということで、月曜日に改めて念校を出してもらい、それから校了と予定変更。やれやれ。

ラタトゥイユ

ラタトゥイユ@自宅

今回は「冷たいラタトゥイユ – L-Cruise – 日経トレンディネット」の記事に従って、野菜それぞれに塩をふってオリーブオイルで焼き、順次鍋に投入して作ってみた。さすがに記事のようにオイルを120mlも使う勇気がなかったので中途半端になってしまったかもだが、それでも下味のせいか前よりも美味しいように思う。

それにしても、茄子がオイルの吸うのには参る。多めにオイル入れたつもりでも、スポンジのように吸ってしまう。ううむ、もっと入れろということかあ。次回は勇気をふるって、オイルをどばっと入れてみようかな 😉 。