Kodama's home / tips.

latex2html を自作マクロ/スタイルに対応させる

latex2html で LaTeX マクロを処理するには, 以下のような方法が考えられます.

また, LaTeX マクロを記述する場所として,以下の様な方法が考えられます.

以下では次のマクロの例を用いて概説します. これは "\sampl{文字列}" のように使うと "(文字列)" のように () で括ってくれます.

\def\sampl#1{(#1)}

自作マクロには対応できる?

プリアンプル(/documentclass と /begin{document} の間の部分) に書いたマクロは大抵そのまま latex2html が対応できます. ちょっとした LaTeXマクロならこの方法で良いでしょう.
%% sample.tex
\documentclass{article}

\def\sampl#1{(#1)}

\begin{document}
\sampl{マクロ例}
\end{document}

自作スタイルには対応できる?

2つの手法があります. マクロを tex ファイルにして input する方法自作スタイルを Perl 処理させる方法 です.

マクロを tex ファイルにして input する方法

ちょっと変則的な方法ですが, マクロ定義ファイルを my-style.tex の名で作成して 次のように使う事もできます.
%% my-style.tex の内容
\def\sampl#1{(#1)}
%% sample.tex
\documentclass{article}
\makeatletter
\input{my-style} %% マクロを読み込む
\makeatother

\begin{document}
\sampl{マクロ例}
\end{document}
latex2html sample のように実行すると, latex2html は my-style.tex を読み込んで LaTeXマクロを処理してくれます.

下のように, マクロ名の "先頭文字が @" の場合には, latex2html は "Arguments to @ are too complex" のメッセ−ジを出して マクロの処理を止めてしまいます.
%% my-style.tex の内容
\def\@sampl#1{[#1]}
\def\sampl#1{\@sampl{#1}}

次のように, 先頭に適当な詰物をすると latex2html で問題なく処理できます.

%% my-style.tex の内容
\def\x@sampl#1{[#1]}
\def\sampl#1{\x@sampl{#1}}

自作スタイルを Perl 処理させる方法

マクロを書き込んだファイルは通常 my-style.sty のような名にして つぎのように使います.
%% my-style.sty の内容
\def\sampl#1{(#1)}
%% sample.tex の内容
\documentclass{article}
\usepackage{my-style} 

\begin{document}
\sampl{マクロ例}
\end{document}

このとき latex2html は 対応する名の Perl スクリプトファイル my-style.perl を読み込んで(my-style.sty は読みません)マクロを処理します. ですから, LaTeX マクロに対応する Perlの処理をこの中で記述しなければなりません. 対応する Perl スクリプトとして何を記述すると良いのでしょうか.

まず, この perl スクリプトを読み込ませるために, .latex2html_init の中に以下のように読み込みスタイル名を書き込みます.

## .latex2html_init の内容
$DO_INCLUDE="my-style";
1;

次に Perl スクリプト "my-style.perl" を作成します. ファイル名はスタイルファイルと名を統一して my-style.perl の様なファイル名とします. Perl スクリプトの具体的な処理としては, 大きく分けると2通りに分かれます.

  1. LaTeX に渡して画像化する方法 : LaTeX に引き渡して結果を画像として張り込むように latex2html に指示する.
  2. HTML を書き出す方法 : Perl で対応する HTML を書き出すようなスクリプトを書く.

LaTeX に渡して画像化する方法

次のように my-style.perl スクリプト内で process_commands_inline_in_tex 等を使うと LaTeX で処理した画像として結果が張りこまれます.
## my-style.perl の内容
&process_commands_inline_in_tex("sampl # {}\n");

HTML を書き出す方法

次のように "sub do_cmd_マクロ名{....}" でマクロを処理するperl関数を書くと, perl で HTML を作成させる事ができます.
## my-style.perl の内容
sub do_cmd_sampl{
  local($_)=@_;
  s/$next_pair_pr_rx//o;
  local($key)=&translate_commands($2);
  '('.$key.')'.$_;
}

LaTeXコメントマクロ に紹介するコメント化マクロに対応するperl スクリプトを紹介します. 以下では, このスタイル中で定義している, incomment と excomment を処理する関数 do_cmd_incomment と do_cmd_excomment を定義しています.
# comment-k.perl : perl style for LaTeX2HTML
# 2002.01.03 Kouji KODAMA

sub do_cmd_xincomment{
  local($_)=@_; s/$next_pair_pr_rx//o;
  local($key)=&translate_commands($2); $key.$_;
}

sub do_cmd_xexcomment{ 
  local($_)=@_; s/$next_pair_pr_rx//o; $_; 
}

sub do_cmd_incomment{
  local($_)=@_; local($cmd, $code);
  s/$next_pair_pr_rx//o; local($key) = &translate_commands($2);
  $cmd="do_cmd_$key"; $code = "undef \&$cmd"; eval($code) if (defined &$cmd);
  $code = "sub $cmd\{ \&do_cmd_xincomment(\@\_);\}"; eval($code);
  $_ ;
}

sub do_cmd_excomment{
  local($_)=@_; local($cmd, $code);
  s/$next_pair_pr_rx//o; local($key) = &translate_commands($2);
  $cmd="do_cmd_$key"; $code = "undef \&$cmd"; eval($code) if (defined &$cmd);
  $code = "sub $cmd\{ \&do_cmd_xexcomment(\@\_);\}"; eval($code);
  $_ ;
}
1; # last line

Kodama's home / tips.