添付ファイル 'html2latex.xsl'
ダウンロード 1 <?xml version="1.0" encoding="utf-8"?>
2 <!-- 本スタイルシートの作者(と、いうのもおこがましい)は本スタイルシートについて著作権を主張しません。よって、使用、再配布、改変、改変語の再配布等になんら制限は加わりません。 -->
3 <!-- このXSLTスタイルシートはHTMLをlatexに変換することを目的にしたものです。まず、書いた文書が適正なXHTMLであることが必要です。HTML各要素の論理的意味に合わせて対応するLaTeXの環境や命令を選んでいますので、ブラウザでの見栄えを重視して要素が選択されている場合、意図しない結果になる場合が多いでしょう。特にテーブルをレイアウトに使用している場合は完全にデザインが崩壊します。CSSの指定は完全に無視しています(というか、読めこめません。)ので、CSSでデザインに凝ることには問題ありません。 -->
4 <!-- このスタイルシート自体のエンコーディングはUTF-8です。変更する場合はXML宣言内のエンコーディング指定も修正して下さい。-->
5 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
6
7 <!-- 出力文書のエンコーディングをEUC-JPにしていますが、これは適時修正して下さい。なお、このスタイルシート自体のエンコーディングと出力文書のエンコーディングは全く関係ありません。-->
8 <!-- <xsl:output method="text" encoding="euc-jp" /> -->
9 <xsl:output method="text" encoding="utf-8" />
10
11 <!-- HTML文書内の改行は無視するように設定します。これは段落分け等を上手く行なうためには必須です。 -->
12 <xsl:strip-space elements="*"/>
13
14 <!-- html -->
15 <!-- html要素を変換するときに基本的なプリアンブルの内容を生成してしまっています。ドキュメントクラスにjsarticle、用紙サイズにA4を指定していますが、適時修正して下さい。txfonts,otfパッケージは%でコメントアウトしてありますが、適時使って下さい。okumacroはem要素とruby要素で使っていますので、okumacroを使わない場合はこれらの要素のテンプレートを修正して下さい。(HTML文書に出てこないならテンプレートを削除しても良いでしょう。)複数のTexファイルを生成して繋げる場合には、統括用のTeXファイルにプリアンブルを書けますので、このテンプレートは削除していいでしょう。-->
16 <xsl:template match="html" xml:space="preserve">
17 \documentclass[a4paper]{jsarticle}
18 %\usepackage{txfonts}
19 %\usepackage[expert,deluxe]{otf}
20 \usepackage{okumacro}<xsl:apply-templates/></xsl:template>
21
22 <!-- head -->
23 <!-- title要素はtitle命令にそのまま対応します。
24 統括用のTeXファイルがある場合はこのテンプレートは不要でしょう。-->
25 <xsl:template match="html/head/title" xml:space="preserve">
26 \title{<xsl:apply-templates/>}</xsl:template>
27
28 <!--
29 <meta type="author" content="作者名1 作者名2 作者名3" />の形式でmeta要素で作者名を指定すれば、\author命令でタイトルに反映します。
30 格好は悪いですが、HTML文書の中で作者名の間に\\をいれてしまえば(<meta type="author" content="作者名1 \\ 作者名2 \\ 作者名3" />)、TeXへの変換後、作者名ごとに改行されます。
31 統括用のTeXファイルがある場合はこのテンプレートは不要でしょう。
32 -->
33 <xsl:template match="html/head/meta[@name='author']" xml:space="preserve">
34 \author{<xsl:value-of select="@content" />}</xsl:template>
35
36 <!--
37 <meta type="date" content="2004年3月30日" />の形式でmeta要素で日付を指定すれば、\date命令でタイトルに反映します。
38 統括用のTeXファイルがある場合はこのテンプレートは不要でしょう。
39 -->
40 <xsl:template match="html/head/meta[@name='date']" xml:space="preserve">
41 \date{<xsl:value-of select="@content" />}</xsl:template>
42
43
44 <!--
45 body要素はdocument環境に対応させています。また、タイトルも生成しています。不要の場合は\maketitleを削除して下さい。 目次が必要な場合は\tableofcontents{}の前の%を削除して下さい。
46 統括用のTeXファイルがある場合はこのテンプレートは不要でしょう。
47 -->
48 <xsl:template match="html/body" xml:space="preserve">
49
50 \begin{document}
51 \maketitle{}
52 %\tableofcontents{}
53 <xsl:apply-templates/>
54 \end{document}</xsl:template>
55
56 <!--
57 h1要素は\sectionに対応させています。文書の性格、xhtmlでの見出しの振り方に応じて適時修正して下さい。
58 -->
59 <xsl:template match="h1" xml:space="preserve">
60
61 \section{<xsl:apply-templates/>}</xsl:template>
62
63 <!-- id要素のある、h1要素の場合、\sectionの直後に\labelを出力するというのも、ありです。 -->
64 <!-- <xsl:template match="h1[@id]" xml:space="preserve">
65
66 \section{<xsl:apply-templates/>}
67 \label{<xsl:value-of select="@id" />}</xsl:template> -->
68 <!-- さらにh1要素がindexクラスの場合は\sectionの直後にindex命令も出すというのもありです。h1要素の中に<span class="index">(後述)を使うと、\sectionの中に\indexが出力されてしまい、上手くいきません。 -->
69 <!-- <xsl:template match="h1[@id and @class='index']" xml:space="preserve">
70
71 \section{<xsl:apply-templates/>}
72 \index{<xsl:apply-templates/>}
73 \label{<xsl:value-of select="@id" />}</xsl:template> -->
74
75 <!-- h2要素は\subsectionに対応させています。適時修正して下さい。-->
76 <xsl:template match="h2" xml:space="preserve">
77
78 \subsection{<xsl:apply-templates/>}</xsl:template>
79
80 <!-- h3要素は\paragraphに対応させています。適時修正しています。-->
81 <xsl:template match="h3" xml:space="preserve">
82
83 \paragraph{<xsl:apply-templates/>}</xsl:template>
84
85 <!-- h4要素は\subparagraphに対応させています。適時修正して下さい。-->
86 <xsl:template match="h4" xml:space="preserve">
87
88 \subparagraph{<xsl:apply-templates/>}</xsl:template>
89
90 <!-- TeXの段落分けは空白行を使って表すので、表現がやや難しいです。元のXML文書の改行は捨てるように設定した上(上記)で、段落の上に2つ改行を入れています。-->
91 <xsl:template match="p" xml:space="preserve">
92
93 <xsl:apply-templates/></xsl:template>
94
95 <!-- blockquote要素はquote環境に対応させました。quotation環境の方が良ければ修正して下さい。-->
96 <xsl:template match="blockquote" xml:space="preserve">
97
98 \begin{quote}
99 <xsl:apply-templates/>
100 \end{quote}<xsl:apply-templates/></xsl:template>
101
102 <!-- ul要素はitemize環境に対応します。li要素のテンプレートも参照して下さい。-->
103 <xsl:template match="ul" xml:space="preserve">
104
105 \begin{itemize}<xsl:apply-templates/>
106 \end{itemize}</xsl:template>
107
108 <!-- ol要素はenumerate環境に対応します。li要素のテンプレートも参照して下さい。-->
109 <xsl:template match="ol" xml:space="preserve">
110
111 \begin{enumerate}<xsl:apply-templates/>
112 \end{enumerate}</xsl:template>
113
114 <!-- li要素はitem命令に対応します。ol要素とul要素のテンプレートも参照して下さい。-->
115 <xsl:template match="li" xml:space="preserve">
116 \item{<xsl:apply-templates/>}</xsl:template>
117
118 <!-- dl要素はdescription環境に対応します。dt要素とdd要素のテンプレートも参照して下さい。-->
119 <xsl:template match="dl" xml:space="preserve">
120
121 \begin{description}<xsl:apply-templates/>
122 \end{description}</xsl:template>
123 <!-- dt要素とdd要素はitem命令に対応します。dl要素のテンプレートも参照して下さい。-->
124 <xsl:template match="dt" xml:space="preserve">
125 \item[<xsl:apply-templates/>]</xsl:template>
126 <xsl:template match="dd">{<xsl:apply-templates/>}</xsl:template>
127
128 <!-- table要素はtable環境に対応させています。表をtable環境の中に入れたくないときは、このテンプレートを修正するか、id要素やclass要素をつかって、table環境に入れないtable要素を考慮する必要があるでしょう。-->
129 <xsl:template match="table">
130
131 \begin{table}
132 <xsl:apply-templates/>
133 \end{table}
134 </xsl:template>
135
136 <!-- tbody要素をtabular環境に対応させました。ですから、tbody要素は省略せずに必ず書いて下さい。tbodyを書かない場合はtable関係のテンプレートを適時修正して下さい。
137 id要素やclass要素を使って、tabular環境の出力のときに、寄せ/揃えや罫線を指定するテンプレートを作った方が上手くいくことが多いです。
138 -->
139 <xsl:template match="tbody">
140 \begin{tabular}<xsl:call-template name="width" />
141 <xsl:apply-templates/>
142 \end{tabular}
143 </xsl:template>
144
145 <!-- tr要素はTeXの行の最後の\\に対応させました。-->
146 <xsl:template match="tr">
147 <xsl:apply-templates/>\\
148 </xsl:template>
149
150 <!-- caption要素は\captionに対応させました。 -->
151 <xsl:template match="caption">
152 \caption{<xsl:apply-templates />}</xsl:template>
153
154 <!-- "keisen"クラスをテーブルに指定した場合は縦と横の罫線を引くようにします。縦の罫線はwidthテンプレートの代わりにwidth2テンプレートを呼び出することで実現します。横の罫線の一つ目はこのテンプレートで生成しますが、残りの横の罫線はtr要素のテンプレートで生成します。-->
155 <xsl:template match="table[@class='keisen']/tbody">
156 \begin{tabular}<xsl:call-template name="width2" />
157 \hline
158 <xsl:apply-templates/>
159 \end{tabular}
160 </xsl:template>
161
162 <!-- "keisen" クラスのtable要素の孫要素であるtr要素の場合は、直後に\hlineコマンドを生成します。-->
163 <xsl:template match="table[@class='keisen']/tbody/tr">
164 <xsl:apply-templates/>\\
165 \hline
166 </xsl:template>
167
168 <!-- td要素とth要素の後には&を出力します。th要素は太字にします。-->
169 <xsl:template match="td"><xsl:apply-templates/> & </xsl:template>
170 <xsl:template match="th">{\bfseries <xsl:apply-templates/>} & </xsl:template>
171 <!-- 列の最後のtd要素とth要素の後には&を出力しません。なお、\\はtr要素のテンプレートで生成します。このテンプレートだと、1列にth要素とtr要素が両方入っていると問題が生じます。-->
172 <!-- <xsl:template match="table/tbody/tr/*[last()]"><xsl:apply-templates/></xsl:template> -->
173 <xsl:template match="tr/th[last()]">{\bfseries <xsl:apply-templates/>} </xsl:template>
174 <xsl:template match="tr/td[last()]"><xsl:apply-templates/></xsl:template>
175
176 <!-- tbodyのテンプレートから呼び出します。このテンプレートは1つ目のtr要素の子要素をすべて数えることで表の列数を計算しようとしています。(td要素とth要素しか無いはずですが。)本当はcolumnspan要素を調べたりしないといけないのですが、やり方が良く分からないのでとりあえずこうしています。columnspan要素がある場合はとりあえず出力されたtexファイルを修正するのが早いと思います。-->
177 <xsl:template name="width">
178 <xsl:if test="./tr[1]/*[last() = 2]">{cc}</xsl:if>
179 <xsl:if test="./tr[1]/*[last() = 3]">{ccc}</xsl:if>
180 <xsl:if test="./tr[1]/*[last() = 4]">{cccc}</xsl:if>
181 <xsl:if test="./tr[1]/*[last() = 5]">{ccccc}</xsl:if>
182 <xsl:if test="./tr[1]/*[last() = 6]">{cccccc}</xsl:if>
183 <xsl:if test="./tr[1]/*[last() = 7]">{ccccccc}</xsl:if>
184 <xsl:if test="./tr[1]/*[last() = 8]">{cccccccc}</xsl:if>
185 </xsl:template>
186 <!-- このテンプレートは"keisen"クラスを指定した表で使います。やっていることはwidthテンプレートと同じで、ただ縦の罫線を出力するようにしているだけです。 -->
187 <xsl:template name="width2">
188 <xsl:if test="./tr[1]/*[last() = 2]">{|c|c|}</xsl:if>
189 <xsl:if test="./tr[1]/*[last() = 3]">{|c|c|c|}</xsl:if>
190 <xsl:if test="./tr[1]/*[last() = 4]">{|c|c|c|c|}</xsl:if>
191 <xsl:if test="./tr[1]/*[last() = 5]">{|c|c|c|c|c|}</xsl:if>
192 <xsl:if test="./tr[1]/*[last() = 6]">{|c|c|c|c|c|c|}</xsl:if>
193 <xsl:if test="./tr[1]/*[last() = 7]">{|c|c|c|c|c|c|c|}</xsl:if>
194 <xsl:if test="./tr[1]/*[last() = 8]">{|c|c|c|c|c|c|c|c|}</xsl:if>
195 </xsl:template>
196
197 <!-- <ruby><rb>地の文</rb><rp>(</rp><rt>ルビ</rt><rp>)</rp></ruby>の形式で書かれたルビ付きの文を\ruby{地の文}{ルビの文}という形式に変換します。\ruby命令はokumacroに含まれています。-->
198 <xsl:template match="ruby">\ruby<xsl:apply-templates/></xsl:template>
199 <xsl:template match="rb">{<xsl:apply-templates/>}</xsl:template>
200 <xsl:template match="rt">{<xsl:apply-templates/>}</xsl:template>
201 <!-- 本スタイルシートはruby要素に対応していますのでrp要素は捨てます。 -->
202 <xsl:template match="rp" />
203 <!-- strong要素とb要素は\bfseries命令に対応させます。-->
204 <xsl:template match="strong | b">{\bfseries <xsl:apply-templates/>}</xsl:template>
205 <!-- lang属性がjpのem要素、lang属性がjpである要素の子孫であるem要素、および、lang属性の指定されていないem要素は\kenten命令に対応させます。XHTML1.1なら、xml:langを使うのでテンプレートを修正して下さい。-->
206 <xsl:template match="em | *[@lang='ja']//em | em[@lang='ja']">\kenten{<xsl:apply-templates/>}</xsl:template>
207 <!-- lang属性がenかen-usのem要素とlang属性がenあるいはen-usの要素の子孫であるem要素及びi要素は\itshape命令に対応させます。-->
208 <xsl:template match="*[@lang='en' or @lang='en-us']//em | em[@lang='en' or @lang='en-us'] | i">{\itshape <xsl:apply-templates/>}</xsl:template>
209 <!-- br要素は一応強制改行\\に対応させています。が、表の中で使ったりするとおもいっきり崩れたりするので、br要素は捨てるのが良いかもしれません。-->
210 <xsl:template match="br" xml:space="preserve">\\
211 </xsl:template>
212
213 <!-- class要素にindexを指定したspan要素は\indexで索引に出力する、というのもありです。当然、プリアンブルでのマクロの読み込みや、索引出力命令も必要です。 -->
214 <!-- <xsl:template match="span[@class='index']"><xsl:apply-templates/>\index{<xsl:apply-templates/>}</xsl:template>
215 <xsl:template match="span[@class='index' and @title]"><xsl:apply-templates/>\index{<xsl:value-of select="@title" />@<xsl:apply-templates/>}</xsl:template> -->
216
217 <!-- すべてのテキストノードに以下のreplaceテンプレートを適用するテンプレートです。-->
218 <xsl:template match="text()">
219 <xsl:call-template name="replace" />
220 </xsl:template>
221
222 <!-- テキストノードにLaTeXの特殊文字が含まれている場合変換します。$は\$に、%は\%に、&は\&に、~は和文の〜に変換します。-->
223 <xsl:template name="replace">
224 <xsl:param name="text" select="."/>
225 <xsl:choose>
226 <xsl:when test="contains($text, '$')">
227 <xsl:value-of select="substring-before($text, '$')"/>\$<xsl:call-template name="replace">
228 <xsl:with-param name="text" select="substring-after($text,'$')"/>
229 </xsl:call-template>
230 </xsl:when>
231 <xsl:when test="contains($text, '%')">
232 <xsl:value-of select="substring-before($text, '%')"/>\%<xsl:call-template name="replace">
233 <xsl:with-param name="text" select="substring-after($text,'%')"/>
234 </xsl:call-template>
235 </xsl:when>
236 <xsl:when test="contains($text, '&')">
237 <xsl:value-of select="substring-before($text, '&')"/>\&<xsl:call-template name="replace">
238 <xsl:with-param name="text" select="substring-after($text,'&')"/>
239 </xsl:call-template>
240 </xsl:when>
241 <xsl:when test="contains($text, '~')">
242 <xsl:value-of select="substring-before($text, '~')"/>〜<xsl:call-template name="replace">
243 <xsl:with-param name="text" select="substring-after($text,'~')"/>
244 </xsl:call-template>
245 </xsl:when>
246 <xsl:otherwise>
247 <xsl:value-of select="$text"/>
248 </xsl:otherwise>
249 </xsl:choose>
250 </xsl:template>
251
252 </xsl:stylesheet>
添付ファイル
添付ファイルを参照するには、(下のファイル一覧にあるように)attachment:filenameと記述します。 [get]リンクのURLは変更される可能性が高いので、利用しないでください。- [ダウンロード | 表示] (2010-12-22 23:39:00, 15.8 KB) [[attachment:html2latex.xsl]]
- [ダウンロード | 表示] (2010-12-22 23:39:10, 15.4 KB) [[attachment:情報科学基礎実験.pdf]]
ファイルを添付する権限がありません。