TeX

TeX文書の文字コードを一括してUTF8に変換する

[ 備忘録 ] 以前のMac OS 9とかの頃には、フォルダーをドラッグ&ドロップすれば、それに含まれる文書の文字コードやら行末コードを一括して変換してくれるツールがあった。Mac OS Xでも似たようなツールがありそうなはず・・・と検索したが、一つだけ見つかったそのツールはTeX文書の変換には使えないことが分かった。だって、バックスラッシュをすべてユニコードの円マークに変換してしまうのだから 👿 。

やれやれ、どうしたものかとあれこれ検索。すると、ターミナルからUNIXのツールを組み合わせれば、簡単に実現できることを知る。nkf を用いて、カレント・ディレクトリー内のすべてのテック文書をUTF8に変換したことはあったのだが、find と組み合わせてパイプラインで送れば良いのだった。ポイントは xargs を利用すること。具体的には、次のようにする。

find . -name '*.tex' -type f -print | xargs nkf --overwrite -w -Lu

こうすれば、find がカレント以下のサブフォルダーを探索して、拡張子 tex のすべてのファイルを列挙してくれる。それが xargs を通して nkf に渡されるという仕組み。nkf のオプションは、-w でUTF8に、-Lu で行末コードをLF (UNIXの標準、今のマックもこれ)、それから –overwrite で上書きしてタイムスタンプは変えない。

それにしても・・・知識さえあれば、UNIXはかくも便利であるということですな。

updmap失敗の原因は半角カナだった

[ 備忘録 ] uptexのupdmap-sysが空のkanjix.mapを生成する理由が分かった。原因は、前のMacから持ってきた古いMapファイルにあった。だいぶ前にどこぞで拾ってきた morisawa.map というものだが、これがShift-JIS で書かれ、おまけにフォント名の中に半角のカナが含まれているという代物。そのせいで、updmap-sys から呼ばれた sort か何かが、Illegal byte sequence とかいうエラーを吐き、kanjix.map に書き出されるべき内容が破棄されていたのだった。

ということで、この古い morisawa.map を削除することで解決。えらく苦労してしまった。updmap (UNIXのshell scriptなのだが)のソースコードをかなり読む羽目になったが、学んだことも多く、これはこれで無駄ではなかったかな。

Mac上のupTeXで日本語TrueTypeフォントを利用する

[ 備忘録 ] かなり苦労した。要点をメモ。

まず、理由は不明だが、updmap-sysが空のkanjix.mapを生成するのに難儀した。ちゃんとKanjiMapは読んでいるのだが。業を煮やして、直接 kanjix.map を編集するという禁じ手で応急処置。いつか解決せねば。

次に日本語フォントの設定が必要。uptexでは旧来のJY1, JT1ではなく、JY2, JT2なるエンコーディングが使われている。TFMもVFも作り直さないとダメみたい。さしあたって、普段一番使っているセプテンバーフォントを使えるようにする。upjisr-h.tfm を複製して、up-septm-jis.tfm などとする。makejvf を使って、ヴァーチャルフォントを生成。makejvf –help として使い方を見る。-u jis というオプションで ucs mode (JIS) とある。

$ makejvf -i -u jis up-septm-jis.tfm r_up-septm-jis

とすれば、up-septm-jis.vf と r_up-septm-jis.tfm が生成される。これを適宜移動させる。スタイルファイルもこれに合わせて変更。JY2にするのを忘れないように。mapファイルの項目は、

r_up-septm-jis UniJIS-UTF16-H :0:SeptM.ttf

のようにする。UCS2 かなとも思ったが(上記 makejvf のヘルプ参照)、uptex付属の READMEファイルには、upjisr-h に対して、UniJIS-UTF16-H としてあったので、それを真似した。今のところ不都合はなさそう。texhashして、updmap-sys すれば (と言っても上で述べたような状況なので、手動でするのだが 😥 ) とりあえず完了。

そりゃあ政権交代だって最初は大変でしょうよ

めずらしく政治ネタというわけではないのです。与党になったばかりの大臣たちだって、初めての事だらけで、そりゃあ大変だろうと、新しいマックの初期設定をしながら思ったわけでした。というわけで、別に政権が変わったわけではありませんが、まだまだ新しいマックで仕事できないでおります。

エディターは当面は、Carbon Emacsとmiの併用。TeX(テック)に関しては、日本語ファイル名が通らないと既存の文書類をコンパイルできないので、uptex を採用。これはptexの内部コードをUTF8にしたもので、ptetex3のパッチとして提供されている。ただし、文書の文字コードはJISとUTF8の自動識別なので、Shift-JISで作ってある過去の文書は、nkf などで、一括してUTF8に変換しないとダメ。それから、マクロ類もShift-JISで書かれているのはダメ。emathがそうだった。

uptexのコンパイルがなかなか上手く行かなくて苦労した。最終的にmy_optionの変更で何とか成功。Snow Leopardだと、何故かX11のライブラリーを認識しないらしく、それへの対処などが必要らしい。次のページを参考にした。

動作報告/140

既存の文書をコンパイルしたところ、クラスファイルがuptexに対応できずにエラー。JY1が見つからないとか何とか言われてしまう。どうもuptexではJY2という名前で横組の日本語フォントを管理している模様。仕方ないので、自前のクラスファイルをこれに対応させるべく作業を行う。きちんとは理解してないと思うが、見よう見まねで、とりあえず組版に成功したから、これで良いのか?

しかし、組版のスピードが速いのには驚いた。40ページぐらいある文書で、途中で図版作成の為に metapost が何度も呼び出されるのだが、一瞬で終わってしまう。いや、一瞬は言い過ぎか(笑)。でも、3秒以内で終了。試しにG4でやってみたら35秒ぐらいかかった。もう何というか、インテルすごいね。命令が直交化してないとか、バイトオーダーが気に入らないとか、もうそんなことは瑣末に思えるね、こりゃあ :mrgreen: 。もっとも、ファイルの書き出しとか多いので、ハードディスクのスピードも関係するから、純粋にプロセッサの速度だけの問題ではないが、それにしても速すぎだ 😉 。

さて・・・テックに関しては、フォント関係の整備が必要。もうすっかり忘れているので、できるか心配。疲れたので、今日はこのへんで。

UbuntuにAsymptoteをインストール

お絵描きプログラムであるAsymptoteをUbuntuにインストールした。これは、MetaPostの亜種というか改良版であり、文法などはMetaPostから引き継いで、その上でMetaPostをさらに使いやすくしたものらしい。MetaPostに慣れつつあるので、ちょっと気になったこともあり、インストールしてみた。

最初は、Synaptic パッケージ・マネージャーからUbuntu用にコンパイルされたものを入れてみたのだが、これが1.4というちょっと古いバージョン。3D関係のライブラリーを使うとエラーが出るとかで、最新の1.86を入れるべく、ソースからのコンパイルを試みた。ポイントは、ガーベージ・コレクション用のライブラリーを別途ダウンロードすることと、ドキュメント関係の作成のために TeX一式を入れておくこと。最初、コンパイル完了直前になって、texindexがないというエラーであえなく沈没。apt-get install texinfo と、texinfoをインストールして再度試みて成功。

ということで、手順をメモ。

$ wget http://downloads.sourceforge.net/asymptote/asymptote-1.86.src.tgz
$ gunzip asymptote-1.86.src.tgz
$ tar -xf asymptote-1.86.src.tar
$ cd asymptote-1.86/
$ wget http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.1.tar.gz
$ ./configure
$ make all
$ sudo make install
$ hash -r

ボックスとルール(罫線)で表組みをシミュレートする

とある資料作りの話。箇条書きでリストアップしている項目を表の形にできないかと相談され、まあマクロでどうにでもなるでしょうと安請け合いしたのが苦労の始まり。数ページに渡る表なので、LaTeX(ラテック)のlongtable環境かsupertable環境を使おうかとも思ったが、とりあえず普通のtabular環境で少し実験してみたのだが、何せ元が箇条書きなものだから、マクロで表にするのに四苦八苦する。

一応、形にはなったのだが、新幹線車中で他にやることもないので、つらつら考えていたところ、ふと、これってボックスをルール(ルーラー、罫線)で囲んで積み重ねれば簡単に実現できるのではないかと、思いついた。

さっそく今日、マクロを組んでみたのだが、思っていた以上に簡単に出来た。今回の目的の為には、複雑な表組マクロよりも、シンプルなボックスの方が良い。表環境だと途中で改頁できないとかあるのだが、ボックス積み重ねだと、そういう不都合もない。

ということで、プログラミングも数学と同様、想像力が大切ですね。

敗北

リスト表示の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

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

環境変数の設定と .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 でのトークンの比較ではまったことがある。テックブックを読んでも今一つピンとこないというか、大体こんな感じかなと、中途半端な理解で使っているのがいけないのだろうが。