目次↑

.. XML/HTMLの拡張機能

..1. 見出し

HTMLのh1~h6要素は、見出しとして特別な意味を持ちます。 h1~h6要素の数字は見出しのレベルとして認識され、 数字が大きいものほど深い階層にあるものとして処理されます。

また、任意の要素に html:header="レベル" という属性を付与することで、 任意の要素をHTMLのh1~h6要素と同様の意味を持たせることができます。

ブックマーク

output.pdf.bookmarks をtrueにすると、PDFのブックマーク(しおり)が生成されます。 ブックマークは、見出しのレベルによって自動的に階層化されます。

現在ページのセクション

ページの内容として出力済みの見出しを、content プロパティ内で-cssj-heading関数によって生成することができます。

content: -cssj-heading(1) ' - ' -cssj-heading(2);

上の例はレベル1とレベル2の見出しを表示します。 すなわち、ドキュメントの先頭から、前ページの最後までの間で、 一番最後のh1とh2の内容を表示します。

-cssj-heading関数を -cssj-page-content が設定されたページで使用すると、ドキュメントの先頭から現在のページの最後までの間で、 一番最後の見出しを表示することができます。 これは、ノンブルに見出しを表示する場合に便利です。

..2. 目次の生成

見出しは、目次の生成に利用することができます。 目次を生成するためには、Copper PDFが文書全体の見出しと、 見出しのあるページ番号を収集している必要があります。

<cssj:make-toc xmlns:cssj="http://www.cssj.jp/ns/cssjml"
               counter="page-number" type="decimal"/>

ドキュメントの末尾に目次を生成する場合は、目次の生成の開始時点で本文が全て処理されていますが、 ドキュメントの先頭や途中に目次を生成する場合は、2パス以上の処理が必要です。

counter属性はページ番号を振るために使用するページカウンタの名前です。 typeは、ページ番号のタイプです。CSSのlist-style-type で使われるのと同じタイプ名が利用可能です。

生成される目次は、次のようなリストの形式をしています。

  <ul class="cssj-toc">
    <li><a href="#cssj-heading-1"><span class="cssj-title">1. タイトル1</span><span class="cssj-page">1</span></a></li>
    <li><a href="#cssj-heading-2"><span class="cssj-title">2. タイトル2</span><span class="cssj-page">5</span></a></li>
    <li><a href="#cssj-heading-3"><span class="cssj-title">3. タイトル3</span><span class="cssj-page">8</span></a></li>
    <ul>
      <li><a href="#cssj-heading-4"><span class="cssj-title">3.1. タイトル4</span><span class="cssj-page">8</span></a></li>
      <li><a href="#cssj-heading-5"><span class="cssj-title">3.2. タイトル5</span><span class="cssj-page">9</span></a></li>
    </ul>
  </ul>

例として、以下のようなスタイルシートを使うことで目次を整形してください。

ul.cssj-toc, ul.cssj-toc ul {
  list-style: none;
}
ul.cssj-toc {
  margin: 0;
}
ul.cssj-toc ul {
  margin: 1em;
}
ul.cssj-toc li {
  margin: 1em 1em 1.5em 0;
  font-family: sans-serif;
  height: 0.5em;
  border-bottom: 1pt dotted;
}
ul.cssj-toc ul li {
  margin: 0 0 0.5em 1em;
  font-family: serif;
}
ul.cssj-toc span {
  background-color: White;
  padding: 0 0.5em;
}
ul.cssj-toc span.cssj-page {
  position: absolute;
  right: 0;
}

フラグメント識別子によるリンク

output.pdf.hyperlinks をtrueに設定すると、文書内のハイパーリンクがPDFに反映されます。

デフォルトでは、ハイパーリンクは文書のURIに対する相対アドレスに変換されます。 ハイパーリンクのベースとなるURIを文書のURI以外にする場合は、 output.pdf.hyperlinks.base にURIを設定することで、変更することができます。 これらの場合、PDFファイルの位置が適切でないと、リンクは意味を持ちません。

output.pdf.hyperlinks.href にabsoluteを指定すると、文書内リンクを除いて、全て絶対リンクになります。 この場合、PDFファイルの配置場所を変えてもリンクが切れることはありません。

output.pdf.hyperlinks.fragment をtrueに設定すると、ドキュメントの一部に対してフラグメント識別子によるリンクが可能になります。 フラグメントの作成方法は通常のHTMLと同じで、任意の要素のid属性と、a要素のname属性をサポートしています。

-cssj-page-ref関数

Copper PDFは、フラグメントが存在するページを表示するために、 content内で使用できる-cssj-page-ref関数を用意しています。

@page {
	counter-increment: page;
}
span:before {
	content: 'p' -cssj-page-ref(frag, page, decimal, ', p') ' ';
}
a:after {
	content: ' (' -cssj-page-ref(attr(href), page, decimal, ', ') 'ページ)';
}

-cssj-page-ref関数の最初の引数は、参照するフラグメント識別子です。 2番目の引数はページ番号の表示に使うページカウンタです。 3番目の引数は数字のスタイルで、 list-style-typeで使われるのと同じスタイル名です。 3番目の引数を省略するとdecimalスタイルで表示されます。 4番目の引数(Copper PDF 2.0.2以降)は同じ名前のフラグメントが複数存在する場合、 複数のページ番号を表示するための区切り記号です。 4番目の引数を省略すると、最初のフラグメントのページ番号だけが表示されます。

フラグメント識別子の部分はattr関数を使うことができます。 上の例のように、HTMLのa要素でhref属性の値を使うと、 フラグメントへリンクすると同時に、フラグメントが存在知るページの番号を表示することができます。 なお、フラグメント識別子の最初の'#'はあってもなくても構いません。

-cssj-page-ref関数を使うためには、一般的に2パス以上の処理の処理が必要です。 ドキュメント全体の処理が一度終わらないと、ドキュメントの後の方にあるフラグメントのページが分からないためです。

ドライバで複数の結果を結合する機能を用いる場合、他のドキュメントのページ番号を得るには、-cssj-page-refの最初の引数に'document.html#frag'のようなURIを指定してください。 3.0.14 3.1.0

..4. 注釈

cssj:annot属性は、Copper PDFを利用するアプリケーションに、メッセージを送るものです。 例えば、日付順に内容が並んでいる文書を処理する場合に、cssj:annot属性に日付を入れることで、 ドキュメント中でCopper PDFが現在処理中の部分をアプリケーションが知ることができます。

..5. XML中でHTMLの要素と属性を使用する

名前空間 http://www.w3.org/1999/xhtml を使用することで、 画像(img要素)、テーブルセルの結合(colspan, rowspan属性)といった HTMLの一部の要素や属性はXML内でも使用することができます。

利用可能な要素や属性のリストは資料集のXMLの拡張の章を参照してください。

..6. ルビ3.0.0

ルビはHTMLのruby, rb, rt, rp要素により表示可能です。 rbがルビが振られる部分、rtがルビです。 rpにはルビをサポートしない環境のためのカッコなどを記述します。

<ruby>
<rb>東海林</rb>
<rp>(</rp>
<rt>しょうじ</rt>
<rp>)</rp>
<rb>太郎</rb>
<rp>(</rp>
<rt>たろう</rt>
<rp>)</rp>
</ruby>
東海林 しょうじ 太郎 たろう

前記の記述は、さらに簡略化して次のように書くことができます。 ruby中に直接テキストを記述した場合、自動的にrbが上に挿入されます。 またrpを省略した場合、ルビをサポートしない環境ではカッコは表示されません。

<ruby>
東海林
<rt>しょうじ</rt>
太郎
<rt>たろう</rt>
</ruby>

ルビは本文の半分のサイズで表示されます。 また、ルビのある行ではルビの配置のために行間が拡張されます。

ルビのために拡張される行幅は、ruby要素のline-heightによって決まります。 明示しなければ、横書きでは1.414(白銀比)、縦書きでは1.618(黄金比)という値になります。 行幅を一定にするためには、本文のline-heightをこれより大きくとって、あらかじめ行幅を確保しておいてください。 あるいは、次のようにruby要素に対するline-heightを明示して、行幅に合わせてください。

body {
	writing-mode: vertical-rl;
	line-height: 1.5;
}
ruby {
	line-height: 1.5;
}

目次↑
Copper PDF ©2012 Zamasoft. All rights reserved.