HTML文書を綺麗に印刷しよう
イントロダクション
今日の俺
「情報科学基礎実験の課題を寝っ転がりながら考えたいなー。」
「よし、課題のページを印刷しよう。」
「でも、ブラウザで印刷すると汚くてやる気でねえんだよなー。」
「LaTeXで印刷すると綺麗なんだよねー。」
「はっ、そうか、LaTeXか!」
というわけで、このページでは、HTML文書をLaTeX文書に変換して綺麗に印刷し、自己満足の世界に浸る方法を紹介します。
ここで扱うHTML文書は、アルゴリズムとデータ構造演習第4回のページです。
前提
ここでは、LaTeX文書を組版して印刷できる環境は既に整っているとします。
LaTeX文書が印刷できない人は、Webサイトを見るなり、LaTeX2e 美文書作成入門(amazon)を買うなりして、がんばってください。
変換ってどうやるの?
プログラムを書いてもいいのですが、面倒ですね。課題をやるのに、課題より難しいことはしたくありません。
先人が頑張って策定してくださった、XSLT(XSL Transformations)がありますので、今回はそれを使うことにします。
XSLT?
XSLTは、XML文書の組版を行う、XSL(Extensible Stylesheet Language)と呼ばれる標準の一角をなす技術です。XML文書を、組版用のXSL-FO文書に変換するための言語として作成されました。
文書の変換用の言語には、他にDSSSL(Document Style Semantics and Specification Language)というものもありますが、これはSchemeを使っています。()だらけです()。使いたくないですね。
「こんなかっこだらけの言語を扱いたくない。もっと分かりやすくシンプルに。」を目指して設計されたのが、XSLTです。
本来XSLTは、XSL-FO文書を出力することを目的としてはいますが、実際には、どんな文書でも出力することができます。チューリング完全です。しかも、扱いやすい! これは使うしかないですね!
※このページは、XSLTの解説を目的としたものではありませんので、XSLTの文法等についての説明は端折ります。いつかきっとXSLTに関する記事が書かれることでしょう。
XSLTを使うには
XSLTを使うには、XSLTプロセッサが必要です。ここでは、Apache Xalanを使います。http://www.apache.org/dyn/closer.cgi/xml/xalan-cから、適当なミラーを選択して、binariesの下にあるバイナリから適当なものを選んでダウンロードしてください。 Webサイトには、Xercesも必要だとか書いてあるので、http://www.apache.org/dyn/closer.cgi/xml/xerces-c/から、適当なバイナリを一緒にダウンロードしておくといいと思います。本当に必要なのか分からないですけど。
以下、窓使いのための説明です。
ダウンロードしたファイルを解凍したら、適当なディレクトリに置いてください。PATHを通しておくと使いやすいでしょう。システム環境変数のPATHに、
;インストールしたディレクトリ\Xalan(Xerces)のディレクトリ名\bin
を付け加えてください。
これで準備が整いました。コマンドプロンプトを起動して、
>xalan
と入力すると、使い方が表示されます。読めば分かりますよね。 基本的な使い方は、
>xalan -o 出力ファイル名 変換元のXML文書 XSLTスタイルシート
です。
これで、XSLTを使う準備が整いました。
さあ、肝心の変換だ!
では、HTMLを変換するためのXSLTスタイルシートを書きましょう、と言いたいところですが、面倒ですね。ここはやはり先人の知恵をお借りしたいものです。
幸い、Kyousumという方が作成した、XHTMLのためのXSLTスタイルシートがあります。今は普通には手に入らないのですが、Internet Archiveから探してきました。 再配布等自由らしいので、ここに上げておきます。html2latex.xsl(私の改変が入っています。)
よし、じゃあ、これを使っていざ
変換の前に
入力する文書が、妥当なXHTML文書であることが必要です。巷にあふれるクソみたいなHTML文書は、そのままでは変換できる可能性が低いです。 必ず、XML妥当性検証ツール(XML validator)に通しておきましょう。
ここでは、http://validator.aborla.net/index.php5?lang=jaというWebサイトを使います。自動的に妥当なXHTML文書に修正してくれるのでオススメです。
いざ変換……と思ったら
では、修正した文書を基に、xalanに通してみましょう。
>xalan -o ./情報科学基礎実験.tex ./情報科学基礎実験.htm ./html2latex.xsl
で、無事にLaTeX文書が……
と思ったら、私の環境ではエラーが発生しました。DTDが見つからないと言うのです。これは困った。場当たり的な対処として、文書型宣言(<!DOCTYPEで始まる行)を削除してしまいましょう。
気をとりなおしてもう一度
では、もう一度、コマンドを実行してみましょう。無事にLaTeX文書が作成されたはずです。
次は、これをLaTeXにぶちこんで組版してもらうだけです。
またエラー?
LaTeXで組版を実行したら、エラーが出ました。
Missing $ inserted.
と表示されます。LaTeX文書をよく見てみると、
/* 点のデータ型 */ typedef struct _vertex { char *name; /* 名前 */ struct _edge *adj; /* 隣接リスト */ } vertex;
と書かれた箇所があることが分かりました。'_'はそのままでは出力できませんね。こういった箇所は手で潰す必要があります。 ここでは、verbatim環境でくくってしまうことにしました。
PDFゲットだぜ!
適当な修正を施して、もう一度LaTeXを実行すると、見事に組版された文書が得られました。情報科学基礎実験.pdf
これで目的達成です! やったね!