
README.tech.jp: 技術情報
Shigeharu TAKENO <shige@iee.niit.ac.jp>


■日本語化パッチに関する技術情報

以下に、特にこの日本語化パッチに関する少し細かい (詳しい) 話を書
きます (jp3.2 以降)。


1. 日本語化パッチが行なうこと
-----------------------------
1.1. 日本語化パッチの機能
-------------------------

この日本語化パッチ (jp3.2 以降) は、オリジナルの 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 ファイル、ログ画面出力
    の Encode モジュールによる日本語コード変換
    (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,
    styles/otf.perl)
  (1-8) 削除

(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) 削除
    (styles/more_amsmath.perl)
  (2-6) 削除
  (2-7) 削除
  (2-8) Netpbm-10.2X, 10.XX.YY への対処
    (config/config.pl, pstoimg.pin)
  (2-9) \prefacename の対応が中途半端になっている問題への対処
    (latex2html.pin)
  (2-10) 削除
  (2-11) 削除
  (2-12) stylesheet に出されるロゴの問題の修正
    (latex2html.pin)
  (2-13) TITLE に日本語が含まれる場合 META タグの charset 指定の
    方が先にないと真っ白なページが表示されることがある問題の対処
    (latex2html.pin)
  (2-14) MS-Windows 上で which に関するエラーが出る問題への対処
    (l2hconf.pin)
  (2-15) \symbol の展開に関する問題への対処
    (styles/texdefs.perl, latex2html.pin)
  (2-16) display 数式環境内の \ref に関する問題への対処
    (latex2html.pin)
  (2-17) 削除
  (2-18) versions/html*.pl のバージョンと latex2html.pin 内の記述
    が合ってない問題と、LATEX2HTMLVERSION に複数のパスが指定でき
    ない問題の修正
    (latex2html.pin) 
  (2-19) 新しい perl で警告やエラーが出る問題への対応
    (latex2html.pin, styles/html.perl)
  (2-20) Julius Smith 氏 (latex2html-200{6,9}) のパッチ
    (latex2html.pin)
  (2-21) \scriptsize が \normalsize で復帰しない問題への対処
    (latex2html.pin)
  (2-22) マニュアルのコンパイル時の hyperref に関する問題への対処
    (doc/manual.tex)
  (2-23) 削除
  (2-24) TeX Live への対応 (gs の検出)
    (config/config.pl)
  (2-25) Netpbm の perl script コマンドの検出の問題への対処
    (config/config.pl)
  (2-26) 削除
  (2-27) -split 0, 1 の際に link がつかない問題への対処
    (latex2html.pin)
  (2-28) 削除
  (2-29) graphicx パッケージに対するエラーメッセージへの対処
    (latex2html.pin)
  (2-30) 数式画像の下に線が出る問題への対処
    (prefs.pm)
  (2-31) styles/romanian.perl の誤植の修正
    (styles/romanian.perl)
  (2-32) DIV の閉じタグが足りない問題 (修正はせずコメントとして)
    (versions/html*.pl (*=3_2,4_0,4_01))
  (2-33) amsmath で align 環境内の cases 環境で起きる問題への対処
    (versions/math.pl)
  (2-34) eqnarray* 環境の下の余分なスペースの問題への対処
    (versions/html*.pl (*=4_0,4_01))
  (2-35) 正規表現に関する修正 (perl 5.22 以降で警告やエラーとなる)
    (versions/html*.pl (*=3_1,3_2,4_01), versions/math.pl,
     styles/{alltt,frames,graphics-support}.perl, latex2html.pin)
  (2-36) enumerate パッケージを使用する際の問題に関する修正
    (latex2html.pin)
  (2-37) perl-5.26 以降 @INC に . が含まれないことに対する修正
    (configure)
  (2-38) 削除
  (2-39) GIF の場合の透過色の設定方法の問題の修正
    (pstoimg.pin)
  (2-40) \input 文でファイルを取り込む際の問題の修正 
    (latex2html.pin)

(3) 機能の追加
  (3-1) 削除
  (3-2) tabular 環境を TABLE に直したときに TD, TH のオプションを
    追加できるように変数 $TDADDOPT, $THADDOPT を追加
    (versions/html*.pl (*=3_2,4_0,4_01))
  (3-3) 式番号の幅が固定されている問題への対処 ($EQNO_WIDTH の追
    加)
    (versions/html*.pl (*=3_1,3_2,4_0,4_01), 
    versions/math.perl, styles/more_amsmath.perl, latex2html.pin)
  (3-4) 画像を大きく作ることで見た目の解像度を上げるオプションの
    追加 (-dresolution [n])
    (l2hconf.pin, latex2html.pin, styles/getimagesize.perl)
  (3-5) utf8 へのコード変換 perl script の追加
    (j2utf8.pl)


なお、(2-1), (2-3) はこれで完全に解決しているわけではなく、まだ問
題が残っています。これらについては、README.notice.jp の [39] を参
照して下さい。

また、今回 (2) の部分の「削除」がだいぶ増えましたが (jp3.2b1.22)、
これは、以前日本語化パッチに含まれていた問題へのパッチが、
latex2html-2018.2 でいくつか採用されているもの、および逆に 
latex2html-2018.2 で導入されていた修正を日本語化パッチに後退導入
していたものがあったためで、今後も本家に採用されるべきパッチは送
ってみたいと思っています。

なお、以前実装していた、fleqn オプションに対する左寄せ機能 (従来
の (3-1)) は、あまりスマートなものではなく、また需要もあまりなさ
そうなので、latex2html-2017 に対する日本語化パッチからは削除しま
した。


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 では、\西暦 というマクロで \today の年号が西暦になりま
すが、latex2html はこのマクロを処理できませんので、代わりにこの変
数で年号を西暦に変えます。

初期設定ファイルでこの変数を 1 に設定すれば、\today などの 日本の
日付表示の年号が西暦に変わり、「2018年2月19日」のような表記になり
ます。デフォルトの値は 0 でこれは元号表記 (「平成30年2月19日」等)
になります。詳しくは「4. 日付と変換者について」を参照してください。

この変数は、japanese.perl の前に設定する必要はなく、この変数値を
設定した後の japanese_today() に影響します。


・$USEBOTTOMLOCALDATE (styles/japanese.perl) ((1-1))

latex2html-2017.2 からは、各ページの下の変換者氏名や日付はデフォ
ルトではつかなくなりましたが、これを latex2html-2016 以前の表示に
戻し、かつその日付を日本の日付にするための変数です。これを 1 にす
ると

 Shigeharu TAKENO 平成30年2月19日

のようになります。0 とするとデフォルトと同じで、各ページの下には
何も表示されません。

ページ下の日付等は初期設定ファイルでより細かくカスタマイズするこ
とも可能です。また、この変数は japanese.perl の前に設定する必要が
ありますので、初期設定ファイル中で do_require_package により強制
的に japanese.perl を読み込むときはその前に記述する必要があります。
詳しくは「4. 日付と変換者について」を参照してください。


・$USESIGNEDINFOPAGE (styles/japanese.perl) ((1-3))

latex2html-2017.2 からはオリジナルの英語版の HTML 出力の最終ペー
ジ「About this document ...」から変換者の氏名が取り除かれました。
これに対応する日本語の「この文書について」のページでは、変換者氏
名は同じように削除することも、残せるようにもできるようにしてあり、
それを制御するのがこの変数です。

この変数の値を 1 にすると、変換者氏名が latex2html-2016 同様残り
ます。デフォルトは 0 で、オリジナルの latex2html-2017.2 の挙動と
同様変換者氏名を削除します。なお、これは日本語の最終ページ「この
文書について」にだけ適用されるもので、英語版の「About this 
document ...」の方はこの変数の値によらず変換者氏名は残りません。

また、OS によっては変換者氏名が正しく得られない場合があります。そ
の場合はこの変数を設定せず変換者氏名を表示させない手もありますが、
これを 1 にして、初期設定ファイルで $address_data[0] に正しい氏名
を設定する、という手もあります。詳しくは「4. 日付と変換者について」
を参照してください。


・$TEXENCODE, $HTMLENCODE, $TERMENCODE (latex2html) ((1-4))

これらはそれぞれ、入力 LaTeX ファイルの日本語コード、出力 HTML の
日本語コード、ターミナル出力日本語コードを指し、初期設定ファイル
.latex2html-init ファイル内で、"euc", "sjis", "jis", "utf8" のい
ずれかの値を設定します ($TEXENCODE, $HTMLENCODE は "noja" も指定
可)。

これらの値は、それぞれコマンドラインオプション -ienc=, -oenc=, 
-tenc= でも指定できますが、初期設定ファイルの値よりもコマンドライ
ンオプションの値の方が優先する (上書きする) ので、デフォルトの値
を初期設定ファイルに書いておいて、必要ならコマンドラインオプショ
ンで変更できます。

なお、日付、変換者、ナビゲーションパネルのカスタマイズ等のため、
初期設定ファイルに日本語を書く必要がある場合、初期設定の読み込み
はこれらの変数の影響は受けませんので、初期設定ファイルは UTF-8 に
して、先頭に「use utf8;」の行を入れる必要があります


・-ienc=, -oenc=, -tenc= (latex2html) ((1-4))

それぞれ、上の $TEXENCODE, $HTMLENCODE, $TERMENCODE の値を変更す
るコマンドラインオプションで、euc, sjis, jis, utf8 を指定します。
-ienc, -oenc には noja も指定でき、それぞれ、

 jis  => ISO-2022-JP (7bit JIS)
 euc  => EUC-JP
 sjis => Shift_JIS
 utf8 => UTF-8
 noja => 日本語なし

を意味します。初期設定ファイルでもコマンドラインオプションでも指
定がない場合は、noja と同じく日本語がないものとして処理されますの
で、文字化けする可能性があります。

なお、日付、変換者、ナビゲーションパネルのカスタマイズ等のため、
初期設定ファイルに日本語を書く必要がある場合、初期設定の読み込み
はこれらのオプションの影響は受けませんので、初期設定ファイルは 
UTF-8 にして、先頭に「use utf8;」の行を入れる必要があります。


・&infopagehook ((1-1))

これは、japanese.perl に追加した関数 (サブルーチン) で、HTML の最
終ページ「この文書について」を生成する &japanese_infopage() 内で

 &infopagehook if defined &infopagehook;

とだけ定義されています (ページ本体の出力前に実行される)。よって、
.latex2html-init でこのサブルーチンを定義することでこの最後のペー
ジを多少制御できます。例えば、セクション毎に背景色を変えたい場合、
普通のページならば \section の後ろに

  \bodytext{bgcolor="#ffffaa"}

のようなものを書けば済むのですが、最後のページの色だけは通常は制
御できず、最後のセクションの色が引き継がれてしまいます。この場合
に、.latex2html-init 内に

 sub infopagehook {
    $BODYTEXT = 'bgcolor="#ffffff"';
 }

のようなものを入れることで最終ページの背景色のカスタマイズが行え
ます。このように、最終ページのカスタマイズを行う場合に多少この仕
組みが利用できます。


・$TDADDOPT, $THADDOPT ((3-2))

これは、tabular 環境を HTML の TABLE タグに変換した際に、TD タグ
や TH タグにオプションを設定するための変数で、主に html パッケー
ジの \HTMLset を使って設定します。具体的には、例えば以下のように
使用します:

 \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 で、equation 環境や 
eqnarray 環境の数式番号の表記を変更できるようになっています。例え
ば、「(1)」を「【数 1】」のように変えたい場合は、

 \HTMLsetenv{EQNO_START}{【数 }
 \HTMLsetenv{EQNO_END}{】} 

のようにすればいいのですが、実際にはそこの表示は縦に 2 行以上で表
示されてしまいます。それは、その環境は latex2html は TABLE タグで
表現していて、その式番号部分の幅が固定幅 (10 ピクセル) になってい
るからです。その幅をこの変数 $EQNO_WIDTH で変更できるようにしまし
た。例えば、行全体の 10% 幅にしたければ

 \HTMLsetenv{EQNO_WIDTH}{10\%} 

のように設定できます。


・-dresolution [n] ((3-4))

数式を画像化する際、その画像を綺麗に見せるオプションとして、
latex2html には -antialias, -antialias_text オプションがあります。
これは pstoimg で画像を作る際に、gs の -dTextAlphaBits=4 オプショ
ンを使用してアンチエイリアスを行う手法ですが、それだと限界があり
ますし、あまり効かない場合もあるようです (gs のバージョン依存 ?)。

そこで、pstoimg に元々用意されている -density オプションを使って、
オーバーサンプリングの手法で表示画像の解像度を上げる方法を試験的
に導入してみました (jp1.10beta 2.18, jp2.1beta 1.18 より)。

[n] は整数値で、0 はデフォルト値の 72 を使うことを意味します。72
より大きな値を指定すれば見た目の解像度が上がり、72 より小さな値を
指定すれば解像度が下がります。36 から 2000 の間の指定が可能ですが、
大きな値を指定すると、画像の作成に時間もかかりますし、生成する画
像ファイル、および中間ファイルもその分大きくなりディスクスペース
を圧迫します。

pstoimg の -density は作成する画像の解像度 (DPI) を指定するオプシ
ョンで、デフォルトは 72dpi ですが、大きな値を指定すると当然大きな
ピクセルサイズの画像ができます。それを、HTML レベルで img タグの
WIDTH, HEIGHT のオプションの値を変更することで、ブラウザでの表示
サイズが元のものと変わらないようにしています。よって、ブラウザに
よっては -density オプションを使用すると画像だけ妙なサイズで表示
される可能性もありますし、その Web ページをブラウザの機能で印刷し
た場合もおかしくなる可能性があります。

お勧めの値は 144 ~ 200 程度で、初期設定ファイル .latex2html-init
に 

 $DRESOLUTION = 144;

のように書いてこのオプションの代わりにすることもできます。


shige

2. オプション、初期設定ファイル等の設定の優先順位
-------------------------------------------------

latex2html の挙動を変更/制御する場合、オプションや初期設定ファイ
ル等によって設定ができますが、latex2html ではその設定がうまく効か
ない場合があります。これは、それらの設定が latex2html 内部でどの
ような順位で行なわれているかを把握することで、その理由を見つけ、
対処することができるかもしれませんので、ここにまとめておきます。

なお、以下の説明では、インストール先のディレクトリを

 $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] が読み込ま
れた場合でも、現在のディレクトリがホームディレクトリ (~) でなけれ
ば、[d] があればそれも読み込まれます。


「1. 日本語化パッチが行なうこと」で紹介した日付等の設定を行なう日
本語の設定ファイル japanese.perl ($share/styles/japanese.perl) は、
標準では、ドキュメントクラスで jarticle 等の日本語用クラスファイル
が指定されている場合、[g] によって $share/styles/jarticle.perl が
読み込まれ、その内部で japanese.perl が読み込まれる、となっていま
す。

つまり、いずれの場合も japanese.perl の順番はかなり後ろの方で、優
先順位が高い状態になっています (前の設定を後に読み込まれたものが
上書きするので後の方が優先順位が高い) ので、例えばデフォルトの 
japanese.perl に書かれている挙動を、オプションや初期設定ファイル
で変更できない、ということになってしまいます。


かなり前 (jp1.9, jp2.0 以前) の日本語化パッチでは、japanese.perl 
ファイルは、実は [a] の中 (の最後の方) で読み込まれる形になってい
て優先順位が低い状態になっていましたが、これは元々の latex2html 
のオリジナルの仕様 (「LaTeX Web コンパニオン」でも説明されている
形式) とは少し違っていますので、現在のパッチでは上のような形 (オ
リジナルの latex2html と同じ形) にしてあります。

現在の日本語化パッチの元で japanese.perl に書かれている挙動を変更
するには、以下のような複数の方法があります。これは、「LaTeX Web 
コンパニオン」にも書かれている標準的な (多分正当な) 方法です。

・初期設定ファイル ([c] か [d] か [f]) に、

   &do_require_package("japanese");

 と書いて、強制的に japanese.perl を読み込み、その後に変更したい
 変数を再定義する (japanese.perl を一度読み込むと [f],[g] で 2 度
 読みはされないので、これで japanese.perl の設定を書き換えること
 ができる)。

・デフォルトの l2hconf.pm ファイル ([a]) を自分用にコピーし、その
 中に 

   &do_require_package("japanese");

 と書き (latex2html の古い日本語化同様 [a] での読み込みになる)、
 その自分用のファイルのフルパス名を環境変数 L2HCONFIG に設定し、
 変更したい変数等はこのファイルの中、あるいは初期設定ファイルに記
 述する。

なお、「LaTeX Web コンパニオン」には、

  &do_require_package("$LATEX2HTMLSTYLES/japanese.perl");

のように書かれていますが、これは間違いで、最後に .perl をつけると
読み込んでくれませんし、$LATEX2HTMLSTYLES/ も必要ありません (逆に
$LATEX2HTMLSTYLES/ をつけると、本来の機能に反して 2 度読みされて
しまう可能性がありますので、つけてはいけません)。


ただし、これらの方法にも問題があり、[c],[d],[f] を切り替えて使っ
ている場合、

・[f] を指定しても、[c],[d] は、それが存在する場合はそれは上の順
  番で必ず一度読み込まれる
・[d] と [f] の間に展開されてしまう latex2html の内部変数もある
  (うまく [f] で再定義が効かないものがある)

などに注意が必要です。特に問題なのが、英語の LaTeX との共存をする
場合と日付の日本語化の問題です。これらに関しては、「3. 英語版との
共存について」「4. 日付と変換者について」を参照して下さい。

なお、[c] の初期設定ファイルのファイル名 (パス名を含まないファイ
ル名部分のみ) は環境変数 L2HINIT_NAME で変更可能なので、[c],[d] 
を無効化したい場合は、L2HINIT_NAME を適当に設定してデフォルトの定
義ファイルを読み込ませないようにする、という回避策はあります (私
も latex2html のテストの際に良くこの手を使います)。


3. 英語版との共存について
-------------------------

英語で書かれた LaTeX ファイルを英語版の latex2html で変換した結果
を公開したい場合、ドキュメントクラスで jarticle 等の日本語用クラ
スファイルが指定されていなければ japanese.perl は読みこまれないの
で、基本的にはオリジナルの latex2html の挙動と同じになります。

初期設定ファイルで $TEXENCODE, $HTMLENCODE の設定がある場合でも、
コマンドラインオプシオン「-ienc=noja -oenc=noja」を指定することで
それらの設定をなしにすることができます。

ただし、日付や変換者の設定のカスタマイズのために、初期設定ファイ
ルで強制的に japanese.perl を do_require_package で読み込ませてい
る場合や、ナビゲーションパネルのための設定を日本語で書いていたり
する場合は問題があります。

その場合は、例えば初期設定ファイルを 3 種類用意して、

[a] ~/.latex2html-init
[b] ~/.l2h-init-en (. から始まる名前でなくてよい)
[c] ~/.l2h-init-ja (. から始まる名前でなくてよい)

とし、[a] には英語、日本語共通の設定を入れ、[b] には英語版の設定
(日本語は使わない)、[c] には日本語版用の設定を書き ($TEXENCODE 等
も)、[b],[c] を切り替えるためにオプション -init_file を毎回指定す
る、という手があります。そうすれば [a]+[b] あるいは [a]+[c] の設
定がそのオプションで切り替えられます。

コマンドラインオプションを指定するのが面倒なら、カレントディレク
トリに .latex2html-init という名前のファイルでコピーする、として
もいいでしょう。

他にも、[a]+[b] と [b]+[c] の 2 種類のファイルだけを用意し、環境
変数 L2HINIT_NAME を使って

% setenv L2HINIT_NAME .l2h-init-en (csh 系の場合)
% latex2html file.tex

のようにして初期設定ファイルの名前の設定自身を変更して切り替える
という手もあります。L2HINIT_NAME は初期設定ファイル名を設定する変
数です (デフォルトでは .latex2html-init)。

なお、-ienc, -oenc, -tenc によるコマンドラインオプションでの設定
は、-init_file で指定した設定ファイルをロードした後で解釈されます
ので、その設定ファイル内で指定している $TEXENCODE, $HTMLENCODE, 
$TERMENCODE の値も変更できます。


4. 日付と変換者について
-----------------------
4.1. デフォルトの値
-------------------

latex2html-2016 までは、latex2html で変換した Web ページの各ペー
ジの一番下に、変換者の氏名と変換日の日付とが表示されるようになっ
ていましたが、現在の latex2html-2017.2 からは、それに使用される変
数 ($ADDRESS) のデフォルトの設定が空文字となり、よって各ページ下
には氏名も日付も表示されなくなりました。

変換者氏名については、latex2html-2016 までは最終ページの「この文
書について」の本文からも削除され、変換日付のみ出力されるようにな
りました。氏名は、OS によっては正しく得られない場合も多いため削除
されたのではないかと思います。

各ページ下の氏名と日付、および最終ページの署名については、従来の
出力に戻すことも難しくはありませんので、それも含めて説明します。


latex2html では、自動計算による日付は、

[d1] LaTeX の \today コマンドの展開結果
[d2] 各ページの一番下に書かれる日付 (latex2html-2016 以前)
[d3] 最終ページに書かれる変換日

で使用され、変換者名 (latex2html の実行者名) も

[a1] 各ページの一番下に書かれる署名 (latex2html-2016 以前)
[a2] 最終ページに書かれる変換者名 (latex2html-2016 以前)

に自動的につきますが、これらは統一することもできますし、バラバラ
に設定することもできます。「1. 日本語化パッチが行なうこと」で紹介
した変数とともに、その仕組みなどについて説明します。

まず、デフォルトの値は以下のようになっています。

    | オリジナル *1)    | 現在の日本語化 *2)
----+-------------------+-------------------
[d1]| February 19, 2018 | 平成30年2月19日 
[d2]| (なし)            | (なし)
[d3]| 2018-02-19        | 2018-02-19
[a1]| (なし)            | (なし)
[a2]| (なし)            | (なし)
----+-------------------+-------------------
 *1) オリジナルの (英語版の) latex2html-2017.2 以降の挙動
 *2) jp1.10b, jp2.1b 以降の日本語化パッチをあてたもの
 ただし、いずれも初期設定ファイルの設定がない状態で、*2) について
 は japanese.perl を読み込んで日本語化が行なわれた状態。


4.2. それぞれが設定される仕組み
-------------------------------

[d1],[d2],[d3],[a1],[a2] は、latex2html 内部では次のように設定さ
れます。

[d1] "$default_language"_today() (japanese.perl で定義される 
  japanese_today() 等) が定義されていればその返り値、そうでなけれ
  ば default_today() の返り値

[d2] 変数 $ADDRESS の値。latex2html-2016 以前は、そこに日付を表す
  配列要素 $address_data[1] が使われていたが、latex2html-2017.2 
  では $ADDRESS のデフォルト値は空文字。なお、$address_data[1] の
  値は、get_date('ISO') の返り値。

[d3] $address_data[1] の値 (= get_date('ISO') の返り値)。

[a1] 変換者氏名を表す配列要素 $address_data[0] の値。なお、この値
  は L2hos->fullname() の返り値。

[a2] latex2html-2016 以前は $address_data[0] を使用。
  latex2html-2017.2 以降では、最終ページから変換者氏名部分が丸ご
  と削除されたので英語版では使用されないが、japanese.perl では、
  従来の表記に復帰も可能 ($address_data[0] を使用)。

latex2html が提供する default_today() も japanese_today() も、実
際には内部で get_date() (latex2html が提供) を呼び出していて、そ
の返り値 ("2018-02-19" のような文字列) を加工して、それぞれ
"February 19, 2018" や "平成30年2月19日" のような文字列を作って、
それを返しています。

また、[d2],[a1] は、実際には $ADDRESS の値を表示しているだけです
が、latex2html-2016 以前は

  $ADDRESS = "$address_data[0]\n$address_data[1]";

と定義されていて、これにより変換者氏名と日付が表示されていました
が、latex2html-2017.2 以降は $ADDRESS がデフォルトでは空文字とし
て定義されていますので、現在はデフォルトでは各ページ下には氏名と
日付は表示されません。逆に、$ADDRESS を初期設定ファイルやコマンド
ラインオプション -address で上記のように設定すれば、ページ下部に
従来通りの氏名と日付を表示させることができるようになります。


4.3. 日付文字列を作る関数
-------------------------

日付文字列を作る関数は、latex2html (と日本語化パッチ) でいくつか
用意されています。もちろん、Perl 自身が提供する localtime() など
を使って、色々な現在の日付文字列を作ることができますが、ここでは
latex2html で定義されている関数を紹介します。

・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] 2/19/2018
[g2] 2018-02-19
[g3] 19日2月2018年
[g4] 2018年02月19日

前節の [d3] はこの [g2] を使っています。[g3],[g4] は sprintf() を
内部で呼び出して、指定書式に対応しています。[g3] の場合、引数部分
は日、月、西暦の順で入りますが、[g4] ではそれを更に細かく設定でき
ます。ここで、$order には

 $y = 西暦 - 1900, $m = 月 - 1, $d = 日、@Month = 月名の配列

の変数の値を使うことができます。[g3] は実際に

 sprintf($format, $d, $m+1, 1900+$y)

を行っています。

なお、[g3] では $format (書式文字列) は '' で囲んでも "" で囲んで
もどちらでも構いませんが、[g4] では、$format は '" と "' で (それ
ぞれ 2 文字)、$order は '' で囲む必要があります。

・default_today()

latex2html で定義されている関数で、get_date() を引数なしで呼び出
し ([g1])、月番号を月名に変え (配列 @Month を使用)、日付の 0 を取
り除いて出力文字列に変えています。例えば、"2/19/2018" ならば、
"February 19, 2018" といった出力になります。

月名配列 @Month を再定義すればその出力は多少変えられますが、引数
指定はなく、関数自体を再定義しない限り、その出力文字列を大きく変
更することはできません。

この関数は、(日本語などの) 特定の言語指定がない場合の [d1] の
\today コマンドの展開で使用されます。

・japanese_today()

japanese.perl で定義されている関数で、japanese.perl が読み込まれ
た場合に [d1] の \today コマンドの展開で使用されます。

なお、german.perl で定義されている german_today() のように、各言
語用の日付文字列作成関数が、各言語用ファイルで用意されていて、年、
月、日の表示順や句読点、月名などが各言語用にカスタマイズされてい
ます。

日本語用の japanese_today() は、デフォルトでは "平成30年2月19日"
のような日付を生成していますが、「1.2. 追加された変数やオプション」
で説明されているように、$JAPANESESETMONTHNAME で月名を和名のもの
に変更したり、$USEJAPANESESEIREKI によって年号の元号表示を西暦に
変えることができます。

ただし、$JAPANESESETMONTHNAME は japanese.perl を読み込む前に設定
する必要があり、また [d2],[a1] を latex2html-2016 の状態に復帰す
る (かつ日付を日本語表示する) には、$USEBOTTOMLOCALDATE を設定す
る必要があります。 

japanese_today() は、[d1] 以外に、$USEBOTTOMLOCALDATE を設定した
場合の $address_data[1] の設定に使用されています。そのため、
$USEBOTTOMLOCALDATE を設定した場合は、[d2],[d3] も自動的に [d1]
と同じ日本語文字列になります。それらを違う日付にしたい場合は、
「4.4. カスタマイズ例」を参照してください。


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] を細かくカスタマイズするには、初期設定ファイルの中で

・$USEBOTTOMLOCALDATE を 1 に設定する
・$address_data[1] ([d3]), $ADDRESS ([d2]) の値を書き換える

などの方法があります。前者は、japanese_today() の返り値を
$address_data[1] に設定し、$ADDRESS を

  $ADDRESS = "$address_data[0]\n$address_data[1]";

に設定します。

後者の変数を直接書き換える方法はさらに細かくカスタマイズすること
ができますが、日付は通常は固定文字列を設定するのではなく、変換日
の日付を自動計算させる必要があるので、なんらかの日付文字列の生成
関数を使うことになります (「4.3. 日付文字列を作る関数」参照)。そ
して、そのために japanese_today() 使用する場合は、

 &do_require_package("japanese");

として先に japanese.perl を読み込む必要があります。また、それら
で使用される月名の配列 @Month は、[d1] 同様に再定義したり、
$JAPANESESETMONTHNAME で切りかえることもできます。


[a1],[a2] のカスタマイズは、初期設定ファイルの中で、直接
$ADDRESS や $address_data[0] を再定義すればできます。

なお、各ページの下に書かれる [d2],[a1] は、$ADDRESS の値が使用さ
れていて、これは latex2html のコマンドラインオプション -address 
を使って実行時に指定することもできます。


以下にいくつかサンプルを紹介します。いずれも初期設定ファイルでの
設定例です。==> の後に書いたのがその結果です。

1) [d1],[d2],[d3] を元号表記に統一する:

 $USEBOTTOMLOCALDATE=1; 
 # この後に (自動的、あるいは強制的に) 読み込まれる japanese.perl
 # に影響する

 ==> [d1]=[d2]=[d3]="平成30年2月19日"


2) [d1],[d2],[d3] を日本語の西暦に統一する:

 $USEJAPANESESEIREKI=1;
 $USEBOTTOMLOCALDATE=1;
 # この後に読み込まれる japanese.perl に影響する

 ==> [d1]=[d2]=[d3]="2018年2月19日"


3) [d1],[d2],[d3] を元号表記に統一し、[a1],[a2] を同じ文字列にす
  る (さらに [d2] を 2 行にして、イタリック体に):

 $USEBOTTOMLOCALDATE=1;
 &do_require_package("japanese");
 # ↑これがないと、後で japanese.perl が読み込まれたときに 
 # $ADDRESS が上書きされてしまう
 $address_data[0]="竹野茂治";
 $ADDRESS = "<i>$address_data[0]<br>\n$address_data[1]</i>";
 # <i> や <br> はデフォルトでは含まれていない

 ==> [d1]=[d2]=[d3]="平成30年2月19日", [a1]=[a2]="竹野茂治"


4) [d2] のみをカスタマイズする:

 # [d2] のカスタマイズ
 # (使われていない $address_data[2] を変数として使用)
 $address_data[2] = &get_date('"%dねん%2dがつ%2dにち"','1900+$y,
   $m+1,$d');
 $ADDRESS = "<i>$address_data[0]<br>\n$address_data[2]</i>";

 ==> [d1], [d3] はデフォルトのまま、[d2]="2018ねん 2がつ19にち"


5) [d1] を 19/2/2018 (イギリス式) に、[d2] を 19 Feb 2018 に、
  [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.perl を使う場合は 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[1] = &get_date('"%d %s %d"','$d,$Month[$m],
   1900+$y');
 $ADDRESS = "$address_data[0]<br>\n$address_data[1]";
 # [d3] (上のように @Month を再定義すると japanese_today() がその
 #   影響を受けてしまうので、get_date() を使用)
 $y -= 88;
 if ($y < 31 || ($y == 31 && $m+1 < 5)) {
   $address_data[1] = &get_date('"平成%d年%d月%d日"','$y,$m+1,$d');
 } elsif ($y == 31) {
   $address_data[1] = &get_date('"令和元年%d月%d日"','$m+1,$d');
 } else {
   $address_data[1] = &get_date('"令和%d年%d月%d日"','$y-30,$m+1,$d');
 }
 # [a2] 
 $address_data[0] = "竹野茂治";

 ==> [d1]="19/2/2018", [d2]="18 Feb 2018", 
     [d3]="平成30年2月19日",
     [a1]="Shigeharu TAKENO", [a2]="竹野茂治"


6) [d2],[a1] のデフォルトの設定とは無関係なものをページ下に:

 $ADDRESS = "竹野茂治＠新潟工科大学<br>2018 年吉日";
 # またはコマンドラインオプションで
 # -address="竹野茂治＠新潟工科大学<br>2018 年吉日"


5. 日本語コードについて
-----------------------

現在の日本語化パッチ (jp3.2 以降) が行う日本語コード処理について
説明しておきます。

従来の jp1.X では日本語のコード変換は、外部プログラムの nkf を用
いて行い (最初のパッチからの仕様)、jp2.X では nkf によるコード変
換をしないようになっていましたが、jp3.2 以降では、perl の Encode
モジュールを用いて日本語のコード変換を行うようにしたため、nkf は
必要なくなり、perl だけで各種コードの相互変換が行えるようになりま
した。なお、UTF-8 以外から UTF-8 への日本語コードの変換は、nkf と
perl の Encode モジュールでは一部の文字 (例えば全角の「￥」や長音
などの全角記号の一部など) に違いがあり、従来とは少し変換結果に違
いがでる可能性があります。

考えるべき日本語コードの種類を、ここでは EUC-JP (euc, E)、
Shift_JIS (sjis, S)、ISO-2022-JP (jis, J)、UTF-8 (utf8, U) としま
す (以後かっこ内の名前で記します)。考えるべきは以下のコードです。

[a] 入力 LaTeX ファイル (ユーザ毎)
[b] 初期設定ファイル ~/.latex2html-init (ユーザ毎)
[c] styles/japanese.perl (システム)
[d] 画像生成用中間ファイル images.tex (システム、ユーザ毎)
[e] 生成される HTML ファイル (ユーザ毎)
[f] HTML ファイルの meta タグにつけられる charset (ユーザ毎)

最後に「ユーザ毎」と書いたのは、ユーザが指定できるもので、システ
ムと書いたものは、インストール時に決定されるものです。なお、現在
の latex2html は、ユーザ毎の環境変数値 LANG は考慮していません。

厳密には [a]~[f] いずれのコードも、euc, sjis, jis, utf8 の 4 種類
がありえます。

[a] は、初期設定ファイルの $TEXENCODE, コマンドラインオプションの
-ienc でコードを指定できます。上記 4 種類の日本語コードが利用でき
ます。

[b] は、ユーザ毎に設定するファイルですが、-ienc 等の設定の前に直
接コードが latex2html のコードの一部として取り込まれるため、現在
は UTF-8 固定としています。日本語が含まれていない場合は特に問題あ
りませんが、日本語を入れる場合は UTF-8 で書き、先頭に「use utf8;」
という宣言文を入れる必要があります (そのため、UTF-8 への変換用の 
perl スクリプト j2utf8.pl を附属させています)。そうでないとヘッダ
やフッタ、最終ページなどが文字化けします。

これは従来の jp2.X, jp1.X とは仕様が違いますので、注意が必要です。

[c] も、latex2html の一部として取り込まれるため、jp3.2 以降では 
UTF-8 になっています。

[d] は、latex2html が内部で数式の画像化のために作成する一時的なフ
ァイルで、jp3.2 以降では $TEXENCODE と同じコードに変換して出力し
ています。そのため、latex2html がそれを処理するために内部で呼び出
す platex コマンドにも、$TEXENCODE と同じコード用のオプション 
(-kanji) を指定して実行しています。

[e] は、jp3.2 以降では $HTMLENCODE で指定されたものになります。上
記 4 種類の日本語コードが利用できます。

[f] は、[e] の各 HTML ファイルのヘッダに meta タグとして、

  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">

のようなものがつけられるのですが、この charset の後ろに書かれる 
charset 名のことです。これは、[e] と同じものがつくようになってい
ます。

なお、$TEXENCODE の指定があるのに $HTMLENCODE の指定がない、また
はその逆のような指定をすると、途中まではうまく処理しているのに最
後の出力で変換エラーをするようなことがあり文字化けを起こします。
日本語の含まれる LaTeX ファイルを処理する場合は、必ず両者を初期設
定ファイル、あるいはコマンドラインオプションで指定して実行してく
ださい。


最終的には、perl の拡張機能である Encode モジュールを使って、nkf
なしに日本語文字コードの相互変換をまかなうのがよいだろうと思うの
ですが、

・Encode モジュールの使用が現在の perl ではあまり推奨されていない
  (全部 UTF-8 化すべき ?)
・Encode モジュールを使用する場合、その変換は nkf 部分だけを置き
  かえればよいわけではなく、安定動作したものがまだできていない

といった問題もあり、以前は日本語コードの指定の自由度を上げる方向、
すなわち [a], [b], [c], [f], [g] に独立な日本語コードの設定が行え
るような仕組みを考えていましたが、そこまでの需要もなさそうですし、
安定動作の方が優先すると思いますので、現在は日本語コードの変換は
むしろ最低限にする方向で考えていて、しばらくは現在の 1.10beta と
2.1beta を併用させた状態を維持したいと思っています。


6. 目次
-------
1. 日本語化パッチが行なうこと
 1.1. 日本語化パッチの機能
 1.2. 追加された変数やオプション
2. オプション、初期設定ファイル等の設定の優先順位
3. 英語版との共存について
4. 日付と変換者について
 4.1. デフォルトの値
 4.2. それぞれが設定される仕組み
 4.3. 日付文字列を作る関数
 4.4. カスタマイズ例
5. 日本語コードについて
6. 目次

+=================================================+
 竹野茂治   〒945-1195 新潟工科大学 情報電子工学科 
 shige@iee.niit.ac.jp      TEL(&FAX): 0257-22-8161 
+=================================================+
