README.tech.jp: 技術情報 Shigeharu TAKENO ■日本語化パッチに関する技術情報 以下に、特にこの日本語化パッチに関する少し細かい (詳しい) 話を書 きます。 1. 日本語化パッチが行なうこと ----------------------------- 1.1. 日本語化パッチの機能 ------------------------- この日本語化パッチは、オリジナルの latex2html に対して、以下のこ とを行ないます (各項目末のかっこ内は対応するファイル名)。 (1) 日本語化 (1-1) 日付 (各 HTML の一番下に現れるもの、最終ページに変換日と して記述されるもの、及び \today コマンドの日付) や「図」 「表」などの日本語化 (styles/japanese.perl) (1-2) latex --> platex 等、内部で使用するコマンド名の変更 (prefs.pm, config/config.pl) (1-3) 最終ページ「この文書について」の日本語化 (styles/japanese.perl) (1-4) 生成される HTML ページ、および中間 LaTeX ファイルの nkf による日本語コード変換 (jp1.X のみ) (latex2html.pin, texexpand.pin) (1-5) 生成する HTML ページの META タグに日本語の charset を埋め 込み (latex2html.pin, styles/japanese.perl) (1-6) 生成する HTML ページのヘッダのコメント部分に日本語化パッチ バージョン等を埋め込み (latex2html.pin) (1-7) 各種日本語スタイルファイル用の perl スクリプトの追加 (styles/ascmac.perl, styles/j-*.perl, styles/j*.perl, styles/js*.perl (*=article,report,book), styles/jslides.perl) (1-8) jp2.1beta での UTF-8 対応 (config/eucconv.pl, Makefile.in, configure, styles/japanese.pin) (2) バグ等の修正 (2-1) \i,\j へのアクセント画像が i,j へのアクセント画像と同一視 される問題の対処 (latex2html.pin) (2-2) スタイルファイル名に '-' が含まれる場合 (j-article.sty な ど) の対処 (latex2html.pin) (2-3) \t{oo} が正しく画像化されない問題への対処 (latex2html.pin) (2-4) \accent23 等に対する処理の問題への対処 (latex2html.pin) (2-5) amsmath 上の equation 環境に % を書いた場合の問題への対処 (styles/more_amsmath.perl) (2-6) psfrag のオプション引数を使用した場合の問題への対処 (styles/psfrag.perl) (2-7) perl の undefined 命令への対処 (versions/html2_2.pl, versions/table.pl) (2-8) Netpbm-10.2X, 10.XX.YY への対処 (config/config.pl, pstoimg.pin) (2-9) \prefacename の対応が中途半端になっている問題への対処 (latex2html.pin) (2-10) ディスプレイ数式環境内の \label だけの行への対応 (latex2html.pin) (2-11) math.pl 使用時に "mathend000#" が残る問題への対処 (latex2html.pin) (2-12) stylesheet に出されるロゴの問題の修正 (latex2html.pin) (2-13) TITLE に日本語が含まれる場合 META タグの charset 指定の 方が先にないと真っ白なページが表示されることがある問題の対処 (latex2html.pin) (2-14) MS-Windows 上でエラーが出る問題への対処 (l2hconf.pin) (2-15) \symbol の展開に関する問題への対処 (styles/texdefs.perl, latex2html.pin) (2-16) display 数式環境内の \ref に関する問題への対処 (latex2html.pin) (2-17) configure 時の左辺の表示の問題への対処 (config/config.pl) (2-18) versions/html*.pl のバージョンと latex2html.pin 内の記述 が合ってない問題と、LATEX2HTMLVERSION に複数のパスが指定でき ない問題の修正 (latex2html.pin) (2-19) perl 5.1X で警告が出る問題への対応 (latex2html.pin, styles/{html,frames,natbib}.perl, versions/frame.pl) (2-20) Julius Smith 氏 (latex2html-200{6,9}) のパッチ (latex2html.pin) (3) 機能の追加 (3-1) fleqn 使用時に数式の左寄せ/センタリングが不統一になる問題 への対処 ($USEFLEQNINDENT) (versions/html*.pl (* = 3_2,4_0,4_01,4_1), versions/math.pl, latex2html.pin, styles/more_amsmath.perl) (3-2) tabular 環境を TABLE に直したときに TD, TH のオプションを 追加できるように変数 $TDADDOPT, $THADDOPT を追加 (versions/html*.pl (*=3_2,4_0,4_01,4_1)) (3-3) 式番号の幅が固定されている問題への対処 ($EQNO_WIDTH の追 加) (versions/html*.pl (*=3_1,3_2,4_0,4_01,4_1), versions/math.perl, styles/more_amsmath.perl, latex2html.pin) なお、(2-1), (2-3) はこれで完全に解決しているわけではなく、まだ問 題が残っています。これらについては、README.notice.jp の [39] を参 照して下さい。 また、(2-11) は、latex2html-2015 でオリジナルの本体に Debian で作 られたパッチが採用されたのですが、それよりも (2-11) の対処の方が よいと思いますので、(2-11) に変更しています。 1.2. 追加された変数やオプション ------------------------------- 以下に、オリジナルの latex2html にはない変数やオプションの説明を します。 ・$JAPANESESETMONTHNAME (styles/japanese.perl) ((1-1)) これは、japanese.perl に元々含まれていて (by 武藤さん) コメントア ウトされていた日本の月名を、有効にしてそれらを切りかえて使用する ための変数です。変数の値は 1,2,3 のいずれかで、それぞれの設定によ って日本語の日付 (の japanese_today() による部分) の月名が 1 ==> 1月、2月、3月、4月、... 2 ==> 睦月、如月、弥生、卯月、皐月、水無月、文月、葉月、長月、 神無月、霜月、師走 3 ==> 孟春、仲春、季春、孟夏、仲夏、季夏、孟秋、仲秋、季秋、 孟冬、仲冬、季冬 となります。デフォルトの値は 1 です。 この変数は japanese.perl の前に設定する必要がありますので、初期化 ファイル中で &do_require_package("japanese"); で japanese.perl を 読み込むときはその前に記述する必要があります。詳しくは「4. 日付と 変換者について」を参照してください。 ・$USEJAPANESESEIREKI (styles/japanese.perl) ((1-1)) 年号は、ASCII pTeX で定義されているマクロ \西暦 を用いても残念な がら西暦にはならず、そのための変数です。この変数を明示的に 1 に設 定すれば、日本の日付表示 (の japanese_today() による部分) が西暦 つまり、「2005年8月14日」のような表記になります。デフォルトの値は 0 でこれは元号表記 (「平成17年8月14日」等) を意味します。詳しくは 「4. 日付と変換者について」を参照してください。 ・$USEBOTTOMLOCALDATE (styles/japanese.perl) ((1-1)) 各ページの下につく日付を日本の日付にするための変数です。これを 1 にすると Shigeharu TAKENO 平成17年8月14日 のように、0 とすると (デフォルト) Shigeharu TAKENO 2005-08-14 のようになります。 ページ下の日付等は初期化ファイルでより細かくカスタマイズすること も可能です。また、この変数は japanese.perl の前に設定する必要があ りますので、初期化ファイル中で &do_require_package("japanese"); で japanese.perl を読み込むときはその前に記述する必要があります。 詳しくは「4. 日付と変換者について」を参照してください。 ・$TONATIVE (l2hconf.pm; jp1.10beta のみ) ((1-4)) 数式等を LaTeX コマンドにかけて画像化する際に、生成される LaTeX ファイルの出力時の日本語コード変換のプログラムを設定します。デフ ォルトでは $TONATIVE = "|$NKF -e"; のようになっています。Shift_JIS 環境の場合は $TONATIVE = "|$NKF -s"; のように設定します。これを自分の LaTeX 環境に合わせて設定すること で、元となる LaTeX ファイルの日本語コードが何であっても正しく処理 できるようになります。なお、jp2.1beta は日本語コード変換を行いま せんのでこの変数はありません。 ・$TOHTML (l2hconf.pm, styles/japanese.perl; jp1.10beta のみ) ((1-4)) 生成される HTML ファイルの出力時の日本語コード変換のプログラムを 設定します。デフォルト (l2hconf.pm) では $TOHTML = "| cat"; となっていて、すなわち日本語コード変換をしない設定になっています。 実際の日本語コード変換の設定は、styles/japanese.perl の方に設定さ れていて、jp1.10beta ではデフォルトでは $TOHTML = "| $NKF -j"; と設定されていてますが、これはコマンドラインオプション -lang (下 の -lang の項参照) で切りかえることができます。 なお、日本語コード変換ソフトとして nkf 以外のものを使用する場合は、 直接 styles/japanese.perl を修正してください。 jp2.1beta は日本語コード変換を行いませんのでこの変数はありません。 ・-lang=(jis|euc|sjis|jutf|en|no), $REQUIRE_LANGUAGE (latex2html; jp1.10beta のみ) ((1-4), (1-5)) 日本語化パッチ jp1.10beta では、このオプション -lang=* で、生成す る charset を変更できます。それぞれ、 jis => ISO-2022-JP (7bit JIS) euc => EUC-JP sjis => Shift_JIS jutf => UTF-8 を意味し、また en は English (日本語なし) を、no は指定なし (初期 化ファイルでの設定を無視させるためのもの) を意味します。 $REQUIRE_LANGUAGE はその指定する値 ("jis" 等) を保存する変数で、 ~/.latex2html-init (~ は $HOME を意味します) でこの値を設定してお けば、-lang を指定しなくてもデフォルトでそれを指定したことと同じ になります。もちろんコマンドラインオプションで指定したものの方が 優先されます。 なお、これを指定すると、en, no 以外の場合は styles/japanese.perl が読み込まれ、en の場合は styles/english.perl が読み込まれ、no の 場合は読み込みは行われませんが、en や no の場合でも jarticle 等の クラスファイルを使用していると styles/japanese.perl が自動的に読 み込まれますので、日本語化が行われてしまいます。 デフォルトではこれらは何も設定されていません。 jp2.1beta は日本語コード変換を行いませんので、このオプション、変 数はありません。 ・&infopagehook ((1-1)) これは、japanese.perl に追加されたもので、最後の「この文書につい て」のページを作成する japanese.perl の &japanese_infopage() 内で &infopagehook if defined &infopagehook; とだけ定義されています。よって、.latex2html-init でこのサブルーチ ンを定義することでこの最後のページを多少制御できます。例えば、セ クション毎に背景色を変えたい場合、普通のページならば \section の 後ろに \bodytext{bgcolor="#ffffaa"} のようなものを書けば済むのですが、最後のページの色だけは通常は制 御できず、最後のセクションの色が引き継がれてしまいます。この場合 に、.latex2html-init 内に sub infopagehook { $BODYTEXT = 'bgcolor="#ffffff"'; } のようなものを入れておけばいいわけです。このように、最終ページの カスタマイズを行う場合に多少この仕組みが利用できるのではないかと 思います。 ・$USEFLEQNINDENT (定義しているファイルはなし) ((3-1)) これは documentclass の fleqn オプションを使用しているときに、数 式をインデントつきの左寄せにして表示するための変数です。1 にする とその機能が有効になり、0 (または未定義) ではオリジナルの挙動にな ります。 標準的な数式環境である displaymath 環境 (\[\])、equation 環境、 eqnarray* 環境、eqnarray 環境は、デフォルトでは (HTML 3.2) fleqn のときは、 displaymath => センタリング equation => インデントなしで左寄せ eqnarray* => センタリング eqnarray => インデントつきの左寄せ と、まるで不統一で、これらが混在するとかなり見にくいものとなって いました (HTML 4.0 や math.pl を使うとまた変わります)。この変数を 1 にすると、fleqn の場合はこれらをそれなりに統一された、インデン トつきの左寄せの出力にします。 ただし、以下のような問題もあります。 □ eqnarray 以外の多くは
で実現するので、その上下に ややマージンが空く □ amsmath 時の対応はまだ完全ではない □オリジナルの挙動とは大幅に異なるし、
に置 きかえるので、css を使っての調整にも支障がでる □ eqnarray の場合は、空要素や width="0" などを使用するあまり行儀 のよくないコードになる なお、fleqn を使用しない場合は、この変数の値によらずにオリジナル の挙動と同じものになるのですが、HTML 3.2 では eqnarray 環境の数式 がセンタリングされませんので、できればコマンドラインオプションで "-html_version 4.0" とするか初期化ファイル ~/.latex2html-init で "$HTML_VERSON = '4.0';" 等として html4_0.pl, html4_1.pl などを利 用するといいでしょう。 ・$TDADDOPT, $THADDOPT ((3-2)) これは、tabular 環境を HTML の TABLE タグに変換した際に、TD タグ や TH タグにオプションを設定するための変数です。具体的には、以下 のように使用します: \newcommand{\celi}{\HTMLset{TDADDOPT}{CLASS="celgrp1"}} \newcommand{\celii}{\HTMLset{TDADDOPT}{CLASS="celgrp2"}} \newcommand{\celiii}{\HTMLset{TDADDOPT}{CLASS="celgrp3"}} \newcommand{\celiv}{\HTMLset{TDADDOPT}{CLASS="celgrp4"}} ... \begin{tabular}{|c|c|}\hline \celi a & \celii b \\ \celi c & \celii d \\ \hline \celiii e & \celiv f \\ \hline \end{tabular} \htmlsetstyle[TD]{celgrp1}{background-color=#ffccff} \htmlsetstyle[TD]{celgrp2}{background-color=#ffffcc} \htmlsetstyle[TD]{celgrp3}{background-color=#ccffff} \htmlsetstyle[TD]{celgrp4}{background-color=#ffffff} このサンプルでは、TD, TH タグにクラスを設定していて、そのクラス毎 に CSS により背景色を設定していることになります。 HTML のテーブルでは、tabular 環境のようにある行だけ hline を抜い た表を作ることが簡単にはできませんが、このように背景色を使って、 擬似的に複雑な罫線の表も実現することができるようになります。 ・$EQNO_WIDTH ((3-3)) latex2html では、$EQNNO_START と $EQNO_END で数式番号の表記を変更 できるようになっています。例えば、「(1)」を「【数 1】」のように変 えたい場合は、 \HTMLsetenv{EQNO_START}{【数 } \HTMLsetenv{EQNO_END}{】} のようにすればいいのですが、実際には表示が縦にくずれたような表示 になってしまいます。それは、table 環境で実装されている式番号の幅 が固定長になっているからなのですが、それを $EQNO_WIDTH で変更でき るようにしました。よって上の設定に合わせて、例えば \HTMLsetenv{EQNO_WIDTH}{10\%} のようにすればうまくいきます。 1.3. jp2.1beta の UTF-8 対応 ---------------------------- jp2.1beta 1.10 までは、Shift_JIS の LaTeX 環境への対応のコードを 残していましたが、実際には文字化けが起こることがわかっていました ので、jp2.1beta 1.11 から Shift_JIS 対応を削除し、その代わりに UTF-8 対応を試験的に追加することにしました。 そのため、インストール環境を多少改変し、configure スクリプトに --with-kanji=CODE (CODE=euc|utf8) オプションを追加し、日本語用の styles/japanese.perl もテンプレート (styles/japanese.pin) とし、 config/eucconv.pl スクリプトを用いて、 ・--with-kanji=euc、または --with-kanji オプションを使用しない場 合は、styles/japanese.pin の日本語コードを EUC-JP のままとし、 $CHARSET の設定を EUC-JP としたものを styles/japanese.perl とす る ・--with-kanji=utf8 の場合は、 styles/japanese.pin の日本語コードを UTF-8 に変換し、$CHARSET の設定を UTF-8 としたものを styles/japanese.perl とする ようにしてあります。よって、手動で日本語コード変換をすることなく 通常の make で UTF-8 環境の latex2html がインストールできることに なります。なお、~/.latex2html-init を使う場合は、それもそれぞれの 日本語コード (EUC-JP, UTF-8) でなければいけません。 ただし、現在の latex2html には元々 UTF-8 に関連するコードがかなり 入っているのですが、それとへの対応はまだ何も行っていません。よっ て副作用が起こる可能性が十分ありますので、まだこれは試験的なもの です。 2. オプション、初期化ファイル等の設定の優先順位 ----------------------------------------------- latex2html の挙動を変更/制御する場合、オプションや初期化ファイル 等によって設定ができますが、latex2html ではその設定がうまく効かな い場合があります。これは、それらの設定が latex2html 内部でどのよ うな順位で行なわれているかを把握することで、その理由を見つけ、対 処することができるかもしれませんので、ここにまとめておきます。 なお、日本語用の style/japanese.perl ファイルの読み込まれ方は、 jp1.10beta, jp2.1beta からかなり変更をしましたので、それもここで 説明しておきます。なお、以下の説明では、インストール先のディレク トリを $bin = [prefix]/bin $lib = [prefix]/lib/latex2html $share = [prefix]/share/lib/latex2html とします (cf. README.patch-jp の「2.4. make」節参照)。 latex2html での設定、挙動の変更は以下で行なわれます。 [a] $lib/l2hconf.pm の設定 [b] $bin/latex2html に書かれたデフォルトの設定 [c] ~/.latex2html-init の設定 (あれば) (注: ~ = $HOME) [d] 現在のディレクトリにある .latex2html-init の設定 (あれば) [e] latex2html のコマンドラインオプションによる設定 [f] latex2html のコマンドラインオプション -init_file で指定した初 期化ファイルによる設定 [g] 使用したスタイルファイルに対応した perl ファイル ($share/styles/*.perl, $hsare/versions/*.perl) による設定 全てのオプションの挙動がそうだとは限りませんが、通常は上の順番で 読み込まれ、後で読み込まれたものが、先に読み込まれた設定を上書き します。 なお、[c],[d],[f] は Perl の require 命令を使用しているので同じフ ァイルが 2 度読み込まれることはありません。[d] は [c] が読み込ま れた場合でも、現在のディレクトリがホームディレクトリ (~) でなけれ ば、それがあれば読み込まれます。 「1. 日本語化パッチが行なうこと」で紹介した日付等の設定を行なう日 本語の設定ファイル japanese.perl ($share/styles/japanese.perl) は、 標準では ・jp2.1beta の場合: ドキュメントクラスで jarticle 等の日本語用クラスファイルが指定さ れている場合、[g] によって $share/styles/jarticle.perl が読み込 まれ、その内部で japanese.perl が読み込まれる ・jp1.10beta の場合: コマンドラインオプション -lang jis 等によって直接 japanese.perl が読み込まれる (タイミングは [f] と [g] の間) か、そうでない場 合にドキュメントクラスで jarticle 等の日本語用クラスファイルが 指定されている場合、[g] によって $share/styles/jarticle.perl が 読み込まれ、その内部で japanese.perl が読み込まれる となっています。つまり、いずれの場合も japanese.perl の順番はかな り後ろの方で、優先順位が高い状態になっています (前の設定を後に読 み込まれたものが上書きするので後の方が優先順位が高い) ので、例え ばデフォルトの japanese.perl に書かれている挙動を、オプションや初 期化ファイルで変更できない、ということになってしまいます。 今までの jp1.9, jp2.0 以前の日本語化パッチでは、japanese.perl フ ァイルは、実は [a] の中 (の最後の方) で読み込まれる形になっていて 優先順位が低い状態になっていましたが、これは元々の latex2html の オリジナルの仕様 (「LaTeX Web コンパニオン」でも説明されている形 式) とは少し違っていますので、現在の jp1.10beta, jp2.1beta からは 上のようにしてあります。 現在の日本語化パッチの元で japanese.perl に書かれている挙動を変更 するには、以下のような複数の方法があります。これは、「LaTeX Web コンパニオン」にも書かれている標準的な (多分正当な) 方法です。 ・初期化ファイル ([c] か [d] か [f]) に、 &do_require_package("japanese"); と書いて、それを読み込んでおいてその後に変更したい変数を再定義す る (japanese.perl を一度読み込むと [f],[g] では 2 度読みはされず これで japanese.perl の設定が書き換えられる)。 ・デフォルトの l2hconf.pm ファイル ([a]) を自分用にコピーし、その 中に &do_require_package("japanese"); と書き、その自分用のファイルのフルパス名を環境変数 L2HCONFIG に 設定し、変更したい変数等はこのファイルの中、あるいは初期化ファイ ルに記述する。 なお、「LaTeX Web コンパニオン」には、 &do_require_package("$LATEX2HTMLSTYLES/japanese.perl"); のように書かれていますが、これは間違いで、最後に .perl をつけると 読み込んでくれませんし、$LATEX2HTMLSTYLES/ も必要ありません (逆に $LATEX2HTMLSTYLES/ をつけると、本来の機能に反して 2 度読みされて しまう可能性がありますので、つけてはいけません)。 ただし、これらの方法にも問題があり、[c],[d],[f] を切り替えて使っ ている場合、 ・[f] を指定しても、[c],[d] は、それが存在する場合はそれは上の順 番で必ず一度読み込まれる ・[d] と [f] の間に展開されてしまう変数もある (うまく [f] で再定 義が効かないものがある) などに注意が必要です。特に問題なのが、英語の LaTeX との共存をする 場合と日付の日本語化の問題です。これらに関しては、「3. 英語版との 共存について」「4. 日付と変換者について」を参照して下さい。 なお、[c] の初期化ファイルのファイル名 (パス名を含まないファイル 名部分のみ) は環境変数 L2HINIT_NAME で変更可能なので、[c],[d] を 無効化する場合、L2HINIT_NAME を適当に設定してデフォルトの定義ファ イルを読み込ませないようにする、という回避策はあります。 3. 英語版との共存について ------------------------- 日本語でない LaTeX ファイルや英語版の latex2html で公開したい場合 などのためにオリジナルの挙動の latex2html と共存させるには、今ま での jp1.9,jp2.0 以前の日本語化パッチでは、wrapper スクリプトの l2h を使って % l2h -en [LaTeX file] とすることで英語化は可能でしたが、これは「2. オプション、初期化フ ァイル等の設定の優先順位」の [a] の中で強制的に english.perl を読 みこむようにしているので、厳密にはオリジナルの挙動とは違っていま した。jp1.10beta, jp2.1beta では、それを以下のようにしています。 ・jp2.1beta の場合: ドキュメントクラスで jarticle 等の日本語用クラスファイルが指定さ れていなければ japanese.perl は読みこまれず、オリジナルの latex2html の挙動と同じになる ・jp1.10beta の場合: -lang オプションがない、あるいは -lang=no の場合で、かつドキュ メントクラスで jarticle 等の日本語用クラスファイルが指定されて いない場合は japanese.perl は読みこまれず、オリジナルの latex2html の挙動と同じになる (なお、-lang=en の場合は強制的に sytles/english.perl を読みこむ) ただし、いくつか問題があります。 [a] 初期化ファイルで日本語の設定が行われている場合 これは例えば jp1.10beta の初期化ファイル (~/.latex2html-init) で $REQUIRE_LANGUAGE = "jis"; などと設定していたり、または強制的に japanese.perl を &do_require_package("japanese"); によって読み込ませている場合が相当します。前者の場合は ・コマンドラインオプションで -lang=no とする ・カレントディレクトリに .latex2html-init というファイルを作って その中で $REQUIRE_LANGUAGE = "no"; とする (~/.latex2html-init を ./.latex2html-init で打ち消す)l ・コマンドラインオプションの -init_file で別な初期化ファイルを指 定して上と同様にする などの方法があります。しかし、-init_file で初期化ファイルを指定し ても、「2. オプション、初期化ファイル等の設定の優先順位」で説明し たデフォルトの初期化ファイル [c],[d] はそれらがあれば先にそれらが 読まれることに注意してください。 後者の japanese.perl を強制的に読み込ませている場合はかなりやっか いです。japanese.perl を読んだことを打ち消すのは大変なので、その 初期化ファイル自体を打ち消すのが楽だと思います。一旦初期化ファイ ル名を書き変える、という手もありますが、環境変数を利用する手もあ ります。 例えば ~/.latex2html-init で japanese.perl を読み込んでいて、それ を読み込ませないようにして、それに代わる初期化ファイル ./l2h-en-init を読ませたい場合、環境変数 L2HINIT_NAME を使って % setenv L2HINIT_NAME l2h-en-init (csh 系の場合) % latex2html file.tex とすると ~/.latex2html-init は読まれずに ./l2h-en-init が読まれま す (ただし ~/l2h-en-init があればそちらが先に読まれます)。 L2HINIT_NAME は初期化ファイル名を設定する変数です (デフォルトでは .latex2html-init)。 [b] documentclass のオプションで jarticle 等を使っている場合 jp1.10beta で -lang=(en|no) としても、documentclass のオプション で日本語用の jarticle 等を使用している場合は、それにより japanese.perl が読みこまれてしまいます。よって、japanese.perl を 読みこませたくない場合は、jarticle などの日本語用クラスファイルを 使用しないでください。 また、japanese.perl を読みこむと、それにより $REQUIRE_LANGUAGE の 値により texexpand 内でも日本語コード変換が行われてしまいますので、 8bit 文字列を含む非日本語の LaTeX ファイルでは問題が起こる可能性 があります。 4. 日付と変換者について ----------------------- 4.1. デフォルトの値 ------------------- latex2html では、自動計算される日付は、 [d1] LaTeX の \today コマンドの展開結果 [d2] 各ページの一番下に書かれる日付 [d3] 最終ページに書かれる変換日 で使用され、変換者名 (latex2html の実行者名) も [a1] 各ページの一番下に書かれる署名 [a2] 最終ページに書かれる変換者名 に自動的につきますが、これらは統一することもできますし、バラバラ に設定することもできます。「1. 日本語化パッチが行なうこと」で紹介 した変数とともに、その仕組みなどについて説明します。 まず、デフォルトの値は以下のようになっています。 | オリジナル *1) | 以前の日本語化 *2)| 現在の日本語化 *3) ----+------------------+-------------------+------------------- [d1]| August 14, 2005 | 平成17年8月14日 | 平成17年8月14日 [d2]| 2005-08-14 | 平成17年8月14日 | 2005-08-14 [d3]| 2005-08-14 | 平成17年8月14日 | 2005-08-14 [a1]| Shigeharu TAKENO | Shigeharu TAKENO | Shigeharu TAKENO [a2]| Shigeharu TAKENO | Shigeharu TAKENO | Shigeharu TAKENO ----+------------------+-------------------+------------------- *1) オリジナルの (英語版の) latex2html-2002-2-1 *2) jp1.9, jp2.0 以前の日本語化パッチを当てたもの *3) jp1.10b, jp2.1b 以降の日本語化パッチを当てたもの ただし、いずれも初期化ファイルの設定はなしで、*2),*3) は日本語化 が行われる (japanese.perl が読み込まれる) ようにした状態。 4.2. それぞれが設定される仕組み ------------------------------- [d1],[d2],[d3],[a1],[a2] は、latex2html 内部では次のように設定さ れます。 [d1] \today コマンドは do_cmd_today() 関数で展開されるが、これは japanese_today() (正確には "$default_language"_today() 等) が定 義されていればそれを使用し、そうでなければ default_today() (= August 14, 2005 のような "[月名] [日], [西暦]" 形式) を使用 する。 [d2] 関数 address_data('ISO') の返り値として渡される配列 @address_data の 2 番目の要素 $address_data[1]。address_data() 内部では、その引数をそのまま get_date() に渡して日付を取得して いる。 [d3] 関数 japanese_infopage() が実行される時点での配列値 $address_data[1] がそのまま使用される。これはかなり後の方で実行 される。 [a1] 関数 address_data('ISO') の返り値として渡される配列 @address_data の 1 番目の要素 $address_data[0]。 [a2] 関数 japanese_infopage() が実行される時点での配列値 $address_data[0] がそのまま使用される。これはかなり後の方で実行 される。 つまり [d1] は (do_cmd_today() の下請けの) japanese_today() によ って、[d2],[d3] は get_date('ISO') によって日付が設定されているこ とになります。実際には japanese_today() も内部で get_date() を呼 び出しています。 また、[d2],[a1] は、@address_data が取得された後でそれを $ADDRESS = "$address_data[0]\n$address_data[1]"; のようにしていて、実際にはこの $ADDRESS がページ下の出力として使 われています。 4.3. get_date() --------------- 日付を自動計算する関数は、プリミティブな関数である get_date() を 呼び出していますが、実はこれは色々な出力が可能な関数になっていて これを使って日付をカスタマイズすることもできます。 get_date() には以下のような 4 種類の使用方法があります: [g1] &get_date() [g2] &get_date('ISO') [g3] &get_date($format) (例えば &get_date("%d日%d月%d年")) [g4] &get_date('$format',$order) (例えば &get_date('"%d年%02d月%02d日"','1900+$y,$Month[$m],$d')) これらはそれぞれ以下のようになります ([g3],[g4] は例の場合): [g1] 8/14/2005 [g2] 2005-08-14 [g3] 14日8月2005年 [g4] 2005年08月14日 [g3],[g4] は見てわかる通り、sprintf() を内部で使用しています。 [g3] の場合は引数部分は日、月、西暦の順で入りますが、[g4] ではそ れを更に細かく設定できます。ここで、$order には $y = 西暦 - 1900, $m = 月 - 1, $d = 日、@Month = 月名の配列 の変数の値を使うことができます。[g3] は実際に sprintf($format, $d, $m+1, 1900+$y) を行っています。 なお、[g3] では $format (書式文字列) は '' で囲んでも "" で囲んで もどちらでも構いませんが、[g4] では、$format は '" と "' で、 $order は '' で囲む必要があります。 4.4. カスタマイズ例 ------------------- [d1] のカスタマイズは、「1. 日本語化パッチが行なうこと」で紹介し た変数 $JAPANESESETMONTHNAME, $USEJAPANESESEIREKI を使う以外に初 期化ファイル中では ・月名 @Month を再定義する ($JAPANESESETMONTHNAME とは別のものを) ・japanese_today() (または 直接 do_cmd_today()) を再定義する などで行えます。@Month の再定義は、japanese_today() で使用される 月名をカスタマイズする場合は、 &do_require_package("japanese"); のように japanese.perl を読み込んだ後で再定義する必要があり、 それは japanese_today() の再定義の場合も同様なのですが、 japanese_today() を再定義する場合は、単に上と同じ形式で japanese.perl を読み込んでもサブルーチンの検索順序のため (?) に 上書きがうまくいきませんので、japanese.perl の読み込みを BEGIN{ &do_require_package("japanese"); } のように BEGIN ブロックで囲む必要があるようです。do_cmd_today() の再定義の場合は japanese.perl の読み込みは必要ありません。 [d2],[d3] を細かくカスタマイズするには、初期化ファイルの中で ・address_data($format,$order) (または直接 get_date()) を使う ・japanese_today() を使う のような方法があります。ただし、japanese_today() を使う場合は先に &do_require_package("japanese"); として先に japanese.perl を読み込む必要があります。また、それら で使用される月名の配列 @Month は、[d1] 同様に再定義したり、 $JAPANESESETMONTHNAME で切りかえることもできます。 [a1],[a2] のカスタマイズは、初期化ファイルの中で、直接 $address_data[0] や $ADDRESS を再定義すればできます。 なお、[d2],[a1] の各ページの一番下に書かれるものは、実際には $ADDRESS の値が使用されていますので、[d2] や [a1] とは無関係の文 字列を設定することも可能です。それは、latex2html のコマンドライン オプション -address を使ってもできます。 以下にいくつかサンプルを紹介します。いずれも初期化ファイルでの設 定例です。==> の後に書いたのがその結果です。 1) [d1],[d2],[d3] を和暦に統一する: $USEBOTTOMLOCALDATE=1; # 後に読み込まれる japanese.perl に影響する ==> [d1]=[d2]=[d3]="平成17年8月14日" 2) [d1],[d2],[d3] を日本語の西暦に統一する: $USEJAPANESESEIREKI=1; $USEBOTTOMLOCALDATE=1; # 後に読み込まれる japanese.perl に影響する ==> [d1]=[d2]=[d3]="2005年8月14日" 3) [d1],[d2],[d3] を和暦に統一し、[a1],[a2] も同じ日本語文字列に する: $USEBOTTOMLOCALDATE=1; &do_require_package("japanese"); # ↑これがないと、後で japanese.perl が読み込まれたときに # $ADDRESS が上書きされてしまう $address_data[0]="竹野茂治"; $ADDRESS = "$address_data[0]
\n$address_data[1]
"; #
はデフォルトでは含まれていない ==> [d1]=[d2]=[d3]="平成17年8月14日", [a1]=[a2]="竹野茂治" 3) [d2] のみをカスタマイズ (和暦で表示を変更) する: # [d2] ([d3]) のカスタマイズ $address_data[1] = &get_date('"%dねん%2dがつ%2dにち"','1900+$y, $m+1,$d'); $ADDRESS = "$address_data[0]
\n$address_data[1]
"; # [d3] をデフォルトの値に戻す @address_data = &address_data('ISO'); ==> [d1]="平成17年8月14日", [d2]="2005ねん 8がつ14にち", [d3]="2005-08-14" 4) [d1] を 14/8/2005 (イギリス式) に、[d2] を 14 Aug 2005 に、 [d3]を和暦にし、[a1] をデフォルトの変換者名に、[a2] を指定した 日本語文字列にする: # [d1] のために do_cmd_today() を再定義 sub do_cmd_today { local($today) = &get_date(); # 月/日/年 $today =~ s|(\d+)/0?(\d+)/|$2/$1/|; # 日/月/年、に入れ替え join('',$today,$_[0]); # この出力は決まった形式 } # または japanese_today() の再定義も可 # BEGIN{ # &do_require_package("japanese"); # } # sub japanese_today { # local($today) = &get_date(); # $today =~ s|(\d+)/0?(\d+)/|$2/$1/|; # join('',$today,$_[0]); # } # # [d2],[a1] @Month = ( 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug', 'Sep','Oct','Nov','Dec'); @address_data = &address_data('"%d %s %d"','$d,$Month[$m], 1900+$y'); $ADDRESS = "$address_data[0]
\n$address_data[1]"; # [d3] $address_data[1] = &get_date('"平成%2d年%2d月%2d日"','$y-88, $m+1,$d'); # [a2] $address_data[0] = "竹野茂治"; ==> [d1]="14/8/2005", [d2]="14 Aug 2005", [d3]="平成17年 8月14日", [a1]="Shigeharu TAKENO", [a2]="竹野茂治" 5) [d2],[a1] とは無関係なものをページ下に出力する: $ADDRESS = "竹野茂治@新潟工科大学
2005 年吉日"; # またはコマンドラインオプションで # -address="竹野茂治@新潟工科大学
2005 年吉日" 5. 日本語コードについて ----------------------- 現在の日本語化パッチが行う日本語コード処理について説明しておきま す。 まず、考えるべき日本語コードの種類を、ここでは EUC-JP (euc, E)、 Shift_JIS (sjis, S)、ISO-2022-JP (jis, J)、UTF-8 (utf8, U) としま す (以後かっこ内の名前で記します)。考えるべきは以下のコードです。 [a] 環境変数 LANG (ユーザ毎) [b] 入力 LaTeX ファイル (ユーザ毎) [c] 初期設定ファイル ~/.latex2html-init (ユーザ毎) [d] styles/japanese.perl (システム) [e] 画像生成用中間ファイル images.tex (システム、ユーザ毎) [f] 生成される HTML ファイル (ユーザ毎) [g] HTML ファイルの meta タグにつけられる charset (ユーザ毎) 最後に「ユーザ毎」と書いたのは、ユーザが指定できるもので、システ ムと書いたものは、インストール時に決定されるものです。 厳密にはいずれのコードも、euc, sjis, jis, utf8 の 4 種類がありえ ますが、jis は、原則 [g] のみを想定しています。実際、最近の FreeBSD や Solaris などの Unix 系 OS では jis ロケール ([a]) はサ ポートしていませんし、jis の LaTeX ファイル ([b]) を latex2html で処理するとうまく動作しない可能性があります。 [a] は、LANG などによってユーザが設定できるものなので、一つのイン ストールで複数の [a] に対応できる必要があります。最近の perl では LANG が latex2html の処理に影響することはなく、[a] はむしろ [e] の処理に影響を与えるようです。なお、LANG を jis に設定できるシス テムは多くはないだろうと思います。こちらでも、LANG のテストは、 euc, sjis, utf8 のみで行っています (最近は主に FreeBSD 上)。 [b] は、多くの場合は各ユーザのロケール ([a]) に等しいだろうと思い ますが、当然ユーザ毎 (時にはファイル毎) に異なる可能性があります。 [c] は、ユーザ毎に設定するファイルですが、直接 latex2html のコー ドの一部として取り込まれるため、正しい動作をさせるには、適切な日 本語コードで作成 (あるいは変換) する必要があります。日本語化パッ チ jp1.10beta では原則 euc、jp2.1beta では、configure 時に --kanji で指定したもの (euc または utf8) でなくてはいけません。そ れ以外の日本語コードで作成すると、生成される HTML ファイルが文字 化けする可能性があります。 [d] も、latex2html の一部として取り込まれるため、[c] と同じで適切 な日本語コードでなければいけませんが、この日本語コードはインスト ール時に自動的に決定されます。日本語化パッチ jp1.10beta では euc、 jp2.1beta では configure 時に --kanji で指定したもの (euc または utf8) になります。 [e] は、latex2html が内部で数式の画像化のために作成するファイルで、 現在の jp1.10beta パッチでは、$TONATIVE の設定を使って変換し、 jp2.1beta パッチでは [b] と同じものになります。 latex2html は内部で platex を呼びだしてこのファイルをコンパイルす るので、platex が仮定するコードと images.tex のコードが合っていな いと、数式画像内の日本語が化けますが、platex が仮定するデフォルト の日本語コードはロケール ([a]) の影響を受けるので、現在の jp1.10beta パッチでは、インストール時に $TONATIVE で決定する [e] のコードに合わせて platex に強制的に -kanji オプションを付けて platex のコードを $TONATIVE の設定に合わせています。 jp2.1beta ではデフォルトの platex のままでコンパイルします。 [f] は、jp1.10beta パッチでは、-lang オプションによって実行時に色 々なものに変更することが可能です。デフォルトでは config/config.pl の $TOHTML で設定される jis になります。jp2.1beta パッチでは、日 本語コード変換を行いませんので、[b] と同じものになります。 [g] は、[f] の各 HTML ファイルのヘッダに meta タグとして、 のようなものがつけられるのですが、この charset の後ろに書かれる charset 名のことです。これと [f] の日本語コードが合っていないと、 参照するブラウザによっては文字化けする可能性があります。 jp1.10beta パッチでは、-lang オプションで設定する [f] のコードに 連動して変更されますが、その設定は styles/japanese.perl で行われ ています。 jp2.1beta パッチでは、styles/japanese.perl で元々設定されているも のが使われますが、それはインストール時に --with-kanji オプション で決定され、固定されています。 ただし、jarticle.sty などを使わない LaTeX ファイルでは (そして初 期化ファイルで日本語環境が設定されていない場合は)、 styles/japanese.perl は読み込まれないため、この meta タグの設定は オリジナルの latex2html と同じ挙動となります (デフォルトでは meta タグなし)。 普通に考えると、[a], [b], [c] はユーザ毎に変更でき、[d], [e] はイ ンストール時に決定、[f], [g] はユーザ毎に変更でき、[a]=[b]=[c], [d],[e] はシステム用に適当なもの、[f]=[g]、が自然に思いますが、実 際は、 ・jp1.10beta: [a], [b] はユーザ毎に違ってよい、[c] = [d] は EUC-JP 固定、[e] はインストール時に決定、[f] = [g] はユーザ毎に違ってよい ・jp2.1beta: 必然的に [e] = [f] = [b] となるが、インストール時に euc か utf8 に固定される ([d], [g] もそれになる) ため、[a], [b], [c] のすべ てがそれと合っていなければならない のようになっています。 しかし、例えば HTML ファイルを公開するサーバに転送する際に、勝手 に HTML ファイルの日本語コードを変換してしまうようなシステムでは [f] = [g] では不都合が出る場合もありますし、[c] をユーザ毎に [a] に合わせたい、といった要望もあるでしょう。 次期版 (jp3.X) の日本語パッチでは、nkf の使用をやめ、perl の機能 だけでこのようないくつかの日本語コードの問題を処理できるようにし、 また上のような要望にも答えられるよう、[a], [b], [c], [f], [g] に 独立な日本語コードの設定が行えるようにしたいと考えています。 6. 目次 ------- 1. 日本語化パッチが行なうこと 1.1. 日本語化パッチの機能 1.2. 追加された変数やオプション 1.3. jp2.1beta の UTF-8 対応 2. オプション、初期化ファイル等の設定の優先順位 3. 英語版との共存について 4. 日付と変換者について 4.1. デフォルトの値 4.2. それぞれが設定される仕組み 4.3. get_date() 4.4. カスタマイズ例 5. 日本語コードについて 6. 目次 +=================================================+ 竹野茂治 〒945-1195 新潟工科大学 情報電子工学科 shige@iee.niit.ac.jp TEL(&FAX): 0257-22-8161 +=================================================+