Kodama's home / tips.
latex2html で LaTeX マクロを処理するには, 以下のような方法が考えられます.
以下では次のマクロの例を用いて概説します. これは "\sampl{文字列}" のように使うと "(文字列)" のように () で括ってくれます.
\def\sampl#1{(#1)}
%% sample.tex
\documentclass{article}
\def\sampl#1{(#1)}
\begin{document}
\sampl{マクロ例}
\end{document}
%% 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通りに分かれます.
- LaTeX に渡して画像化する方法 :
LaTeX に引き渡して結果を画像として張り込むように latex2html に指示する.
- 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.