<return> <NewBlock/>

<T>$Args{title}</T>

</return> <eval>$Args{_pagenum} = $Args{page}->pagenum;</eval> <text> <call> </call>
<objects>

XPDFJによるレポート・論文PDF作成方法

中島 靖（Kansai.pm、(株)ネットストック） <nakajima@netstock.co.jp>

2004年10月23日 関西オープンソース2004
<RED>2005年2月17日加筆修正</RED>

XPDFJの標準マクロファイルと論文用マクロファイルを使って、レポートや論文のPDFを作成する方法を解説

- PDFJとXPDFJの概要
- 標準マクロの使い方
- 論文用マクロの使い方と実例
- 今後の課題

あらかじめお断り： 論文作成の方法としてはいくつかの大きな弱点があり、LaTeXにはまだまだ及びません

本発表はPDFJ0.81にもとづいています<RED>→現在はさらにバージョンが上がっています</RED>

日本語PDFを作成するためのPerlのライブラリモジュール

1. 日本語の組版ルール（禁則、行の詰め伸ばし、ルビ、添え字、縦書き中の欧文、縦中横、下線・傍線、圏点など）
2. フォントは標準Type1とTrueType（TrueTypeは埋め込み）
3. テキスト中の画像や線画図形、線画図形中のテキストや画像
4. 箇条書きのためのラベル付き段落
5. 段落、画像、図形などを並べたブロック。入れ子のブロックによる表
6. ページをまたぐ段落やブロックの分割配置
7. アウトライン、ハイパーリンク、暗号化

PDFLib、FOP、OpenOfficeと比べてどう？

PDFJのXMLフロントエンド

PDFJを用いたスクリプトと同等の処理をXML形式で書けるようにする

<MLI> PDFJのサブルーチンやメソッド呼び出しをXMLのタグの形で記述 Perlの変数や式を利用できる </MLI>

<MLI> XML形式で原稿ファイルを書き 「perl xpdfj.pl 原稿ファイル」と実行すると PDFファイルができる </MLI>

<NewBlock/>

use PDFJ 'EUC'; $Doc = Doc({version => 1.3, pagewidth => 595, pageheight => 842}); $font = $Doc->new_font({basefont => "Ryumin-Light", encoding => "EUC-H"}); $page = $Doc->new_page; Text({texts => 'こんにちは', style => TStyle({font => $font, fontsize => 40})}) ->show({page => $page, x => 50, y => 750}); $Doc->print({file => "sample2.pdf"}); |

…しかし、スクリプトを単にXML化するだけなら面倒くさいだけ

→命令を拡張できるマクロ機能によって、簡潔な記述が可能に

HTMLライクなマクロ命令を定義

<Note> あくまでHTML「ライク」です。属性などかなり違いがあり、既存のHTMLをそのまま使えるわけではありません </Note>

S | テキストスタイル
B, I, U, SUP, SUB | 太字、斜体、下線、上付、下付
H1〜4, P, BR | 見出し、段落、改行
UL, OL, LI, MLI | 箇条書き
DL, DT, DD | 語句説明
TABLE, TR, TD, TH | 表
IMG | 画像
DIV, HR, SKIP, NEWPAGE | ブロック、横罫線、間隔、改ページ
BODY | 文書内容全体を囲む

標準マクロstddefs.incを使った原稿の基本パターン

XML宣言では正しいエンコーディングを指定すること（XML::Parserで解釈される：x-sjis-cp932、x-euc-jp-jisx0221） 出力するファイル名を$Args{outfile}とすれば原稿ファイル名に.pdfを付けたものに

]]>

<do file="stddefs.inc"/>で読み込むと、次のように設定される。

属性名 | 省略時値 | 意味
pagewidth | 595 | ページ幅
pageheight | 842 | ページ高さ
leftmargin, rightmargin, topmargin, bottommargin | 72 | 左右上下の余白
fontsize | 10 | 本文フォントサイズ
linefeed | 150% | 本文行送り

B5の用紙で余白1.5cm、フォントは9ポイントとしたければ、 <do file="stddefs.inc" pagewidth="516" pageheight="728" margin="42" fontsize="9"/>

<Note> ※1ポイントは1/72インチ。1インチは2.54cm。 </Note>

見出しは<H1>〜<H4>で囲む（<H1>は中央寄せ）

本文段落は<P>で囲む

<P><LI><TD>での改行と空白の扱い（HTMLと異なる）

<MLI> タグの前後の改行は無視される テキスト中の改行は生きる（<BR/>で改行することもできる） 行頭のタブや半角空白は無視される（入れ子を字下げして原稿を見やすくするため）

# 表題用の見出し

## 大見出し

### 中見出し

#### 小見出し

本文用の段落 改行は生きる
BRでの改行も可能

<Note> ※実際のフォントは見出しはゴシック、本文は明朝です </Note>

で太字、斜体、下線、上付き、下付き

<S>で次のテキストスタイルを指定できる

スタイル名 | 値と機能
fontsize | フォントサイズ
italic | 1:斜体
bold | 1:太字
ruby | ルビ文字列
shapestyle | 文字描画の図形スタイル
withdot | 1:圏点あり
withline | 1:下線あり
withlinestyle | 下線の図形スタイル
withbox | 囲み枠。s:枠線、f:塗りつぶし、sf:枠線＋塗りつぶし。sの代わりに l:左辺、r:右辺、t:上辺、b:下辺 の組み合わせも可。rX:（Xは数値）角を半径Xで丸く
withboxstyle | 囲み枠の図形スタイル

図形スタイル

スタイル名 | 値と機能
fillcolor | 塗りつぶし色
strokecolor | 線色
linewidth | 線幅
linedash | 破線パターン（オン幅,オフ幅,開始オフセット）

<Note> ※図形スタイルを省略すると枠線色塗りつぶし色とも黒、線幅1、実線 ※色は「#RRGGBB」（16進）または0（黒）から1（白）の間の数値 ※破線パターンを指定しなければ実線 ※破線パターンの開始オフセットは省略可 </Note>

| 太字斜体下線上付き下付き
| 赤文字
| 網掛け白抜き
| 点線下線
| 紫陽花

<P>の属性

属性名 | 値と機能
pstyle | 追加の段落スタイル（文書の本文設定を元に）
tstyle | 追加のテキストスタイル（文書の本文設定を元に）
align | b,left:左寄せ、m,center:中央寄せ、e,right:右寄せ、w:両端寄せ

主な段落スタイル

スタイル名 | 値と機能
align | b:左寄せ、m:中央寄せ、e:右寄せ、w:両端寄せ
linefeed | 行送り（ポイントまたは%）
preskip | 段落前の間隔
postskip | 段落後の間隔
beginindent | 行頭インデント
endindent | 行末インデント

| 中央寄せ
| フォントサイズ15ポイント、行頭を40ポイント下げる
| 右寄せで 行間を広く

で箇条書き

各行を<LI>で囲むのが面倒なら<MLI>で

| 属性名 | 値と機能
UL | label | ラベル文字列（省略すると「・」）
OL | label | ラベル初期値（半角英数字、省略すると「1」）「-」を指定すると前回のOLから引き継ぐ
| prelabel | ラベルの前置文字列
| postlabel | ラベルの後置文字列（省略すると「.」）
DL | labelskip | 語句と本体の間隔（省略すると本文フォントサイズに同じ）
共通 | labelsize | 二行目以降の字下げ（省略すると本文フォントサイズに同じ）

<MLI> 各行が箇条書きに 各行が箇条書きに

1. 外側の箇条書き１

外側の箇条書き１の続き

1. 内側の箇条書き１

2. 外側の箇条書き２

語句説明
  語句と説明の間が20で二行目以降が40下げ

で表が作れる

内容に応じてセル幅を自動調節する機能はなく、cellwidth属性ですべてのセル幅（列幅）を指定する必要がある

<TD>の中は小さなBODYと考えることができて、その中にさらにを入れることができる

| 属性名 | 値と機能
TABLE | cellwidth | セル幅（カンマ区切りで列毎に指定、省略すると200）
| tablebox | 表枠線。指定方法はwithboxと同じ
| tableboxstyle | 表枠線の図形スタイル（省略すると「linewidth:0.25」）
| preskip | 前間隔
| postskip | 後間隔
共通 | cellpadding | セル内余白
| cellbox | セル枠線。指定方法はwithboxと同じ※
| cellboxstyle | セル枠線の図形スタイル（省略すると「linewidth:0.25」）
| align | セル内配置。left,center,right※
| pstyle | 追加の段落スタイル
| tstyle | 追加のテキストスタイル
TD | <RED>colspan</RED> | <RED>セルがまたがる列数</RED>
| <RED>rowspan</RED> | <RED>セルがまたがる行数</RED>

<Note> ※cellboxとalignをTABLEやTRで指定するときはカンマ区切りで列毎に指定できる。このとき列数の方が多ければ最後の要素が繰り返し使われる </Note>

年月 | A | B
--- | --- | ---
2004年1月 | 15,000 | 25,000
2004年2月 | 12,000 | 21,000

その他に次のようなマクロが用意されている

マクロ名 | 機能
HEADER, FOOTER | ページヘッダ、フッタを指定する
HR | 横罫線を引く
IMG | 画像を挿入する
DIV | ブロックを作って囲み枠を付けたり配置を調整したりする
SKIP | 間隔を調整する
NEWPAGE | 改ページする

線画図形を描くマクロを定義したshape.incというマクロファイルも用意されている

よく使う属性がある場合…aliasを使う

<Note> をよく使うなら、 と定義すれば、 と書ける </Note>

一連のタグのまとまりをマクロ化する…defを使う

<Note> をよく使うなら、 と定義すれば、 と書くだけでよい </Note>

マクロ定義を別ファイルにして読み込むこともできる

<Note> 上記のようなマクロ定義を、で挟んだ内容のファイルmymacro.incを作る </Note>

二段組みの論文用のマクロ

stddefs.incも自動的に読み込まれるので、標準マクロも使える

マクロ名 | 機能
ARTICLE | 論文全体を囲む
HEAD | ヘッダ部を囲む（ARTICLEの中）
TITLE | 表題
ETITLE | 英文表題
AUTHOR | 著者名
EAUTHOR | 英文著者名
SUMMARY | 要約
ESUMMARY | 英文要約
BODY | 本文部を囲む（ARTICLEの中）
SECTITLE | 章見出し。「1.」の連番が自動的に付く。label属性で指定も可
SUBSECTITLE | 節見出し。「1.1」の連番が自動的に付く。label属性で指定も可
FOOTNOTE | 脚注。label属性でラベルを指定
FIG | 図表を囲む。ページ上部に中央寄せで配置。float="e"でページ下部に配置
CAPTION | 図表キャプション（FIGの中）
ECAPTION | 英文図表キャプション（FIGの中）
REFERENCE | 参照文献。label属性でラベルを指定

<Note> ※今のところ脚注や参照文献のラベルは自動連番されない </Note>

論文全体を<ARTICLE>で囲み、ヘッダ部を<HEAD>で、本文部を<BODY>で囲む

ヘッダ部にはから必要なものを並べる

本文部には標準マクロの他、から必要なものを並べる

実例としてarticledemo.xpが付属しています（→別紙資料）

課題

- 段をまたがった図表がレイアウトできない →近い将来に改善したい
- 線画図形を位置や大きさを指定して配置することはできるが、GUIで作成できない →将来はSVGに対応したい
- 数式のレイアウト機能がない →将来はMathMLに対応したい

発展途上のソフトウェアです。是非ご意見をお寄せください

PDFJは次の場所にあります（XPDFJはPDFJに付属しています）

<Note> http://hp1.jonex.ne.jp/~nakajima.yasushi/ </Note>

メーリングリストがあります

<Note> mailto:nakajima.yasushi-pdfj-subscribe@jonex.ne.jp </Note> </objects> <call> <call> <eval>$pagenum = $page->pagenum; print "page$pagenum\n"</eval> <Shape> <call> </call> </Shape> </call> </call> <eval> $Args{outfile} =~ s/\.pdf$/.p.pdf/i; </eval>