読者です 読者をやめる 読者になる 読者になる

MagicPointのスライドをPDFに変換する際にハマった話

シェルスクリプト ご注文はうさぎですか? MagicPoint PDF

MagicPointのスライドをPDFに変換する際にハマった話

私のスライド作成環境がMagicPointという一風変わった環境のせいもあるのですが、勉強会での発表スライドをWeb上で公開する際、少し古めかしい方法(スライド画像を単に列挙するだけ)になっていました。

MagicPointのスライドはPDFに変換でき、PDFであればSlideShareにアップロードできるようなので、作業手順をまとめてみました。

MagicPointとは?

MagicPointはテキストベースのプレゼンテーションツールです。

例えば以下のような感じでスライドを作成します(これで一枚のスライドになります)。テキストエディタさえあればスライドが作成できる点はなかなか魅力的です。

%page

スライドタイトル

    BSDの種類
        FreeBSD
        NetBSD
        OpenBSD

MagicPointによるスライドのサンプル

スライドのサンプルを以下に示します。スライド中でも説明していますが、epsファイルの挿入が可能です。

PDFファイルへの変換

MagicPointのコマンド(mgpコマンド)にはHTMLにエクスポートするオプションがあり、今まではこれを利用していました。mgp2psというコマンドの存在を知り、PS→PDFに変換できるのではと思い、手順を調べてみました。

その際、かなり色々とハマってしまったので、自分への備忘録も兼ねて手順をまとめてみます。

mgpコマンドで画面上にスライドを表示する場合は問題ないのですが、背景色と前景色を指定し、かつepsファイルを取り込んでいるスライドをPS,PDFに変換する場合、epsファイル側に一工夫入れないとダメでした。

具体的な問題としては、挿入したepsの背景色でスライドの文字が上書き(塗りつぶされる)という現象が発生します。白背景に黒色の前景色だと問題ないかもしれませんが、白と黒色だけのスライドは味気ないので何とか対応方法を調べてみました。

今回は以下のeps出力ケースの場合での対応方法となります。また、スライドの背景色、前景色はそれぞれDarkBlue,snowという前提です(前述のスライドサンプル参照)。

  • tgifが出力したeps
  • Inkscapeが出力したeps
  • TeXから生成したeps

tgifが出力したeps

tgifで背景色等を変更せずに図を描いた場合、背景色は白、前景色は黒になります。このままではスライドの色と異なるため、見辛いものとなります(青色の背景に黒色の組み合わせは見辛いです)。

そこでtgifが出力したeps内の背景・前景色を以下のコマンドで修正します。生成されたepsではPostScriptのsetrgbcolorをRGというコマンドで定義しなおしている(C言語のdefineのような使い方)ので、この部分について色を置き換えます。

$ tgif -print -stdout -eps foo.obj > foo.tmp.eps
$ # 青背景(0 0 1 RG)に白描画(1 1 1 RG)に修正している
$ cat foo.tmp.eps \
    | sed -e "s/            0 SG$/            1 1 1 RG/g" \
          -e "s/L CP$/L CP 1 1 1 RG/g" \
          -e "s/ L$/ L 1 1 1 RG/g" \
          -e "s/   0 SG$/   1 1 1 RG/g" \
          -e "s/L CP 1 SG F/L CP 0 0 1 RG F/g" \
    > foo.eps

RGコマンド(setrgbcolor)は"R G B setrgbcolor"となっており、色成分は0.0から1.0までの間で指定するようです。

Inkscapeが出力したeps

Inkscapeについては、epsで保存し直す前のSVGファイルに対して修正を加えます。テキストとストロークの色情報はfill,stroke要素で定義されています。"fill:#RRGGBB"のような定義になっているので、RGBの部分を置き換えます。

$ cat foo.svg \
    | sed -e "s/fill:\#000000/fill:\#FFFAFA/g" \
          -e "s/stroke:\#000000/stroke:\#FFFAFA/g" \
    > foo2.svg

foo2.svgInkscapeで開き、epsで保存し直せば完了です。MagicPointにInkscapeで作成したepsを取り込む場合、拡大・縮小で線が潰れてしまうことがあるので、線の太さを3px等にしておくと良いです。

TeXから生成したeps

TeXから生成したepsの場合は、対応方法が少しややこしいです。手始めにcolorマクロを使用し、スライドの背景色と前景色に合わせたepsを出力します。実際はMagicPointの色はshowrgbコマンドで出力される色名になっており、TeXのcolorマクロで指定可能な色名と異なります。できるだけ近い色を指定してください。今回はDarkBlue(スライド)に対しblue(TeX)としています。

\documentclass{article}
\pagestyle{empty}

\usepackage{color}

\begin{document}
%% \pagecolor{blue}
\color{white}

...TeXの本文...
\end{document}

以下の手順でTeXからepsを生成します。TeXのcolorマクロを使用していると、生成されたepsには背景色を描画(塗りつぶす)する命令が含まれるようです。"f{P fill}..."の部分が当該箇所なので、この部分の描画処理を無効化します。

$ platex foo.tex
$ dvips foo.dvi
$ ps2eps -f foo.ps
$ eps2eps foo.eps foo.tmp.eps
$ # 背景色の描画を無効化する
$ cat foo.tmp.eps \
    | sed -e "s/^\/f{P fill}.*$/\/f{}!/" \
    > output.eps

補足

TeXのlistings環境でソースコードを見やすく整形できます。これをepsに変換してMagicPointのスライドで用いると見栄えの良いスライドに近づきます。

listings環境を提供するlistings.styは日本語に対応していないようで、有志の方が日本語対応したjlisting.styを提供しています。

参考までに、FreeBSD-10の環境でのjlisting.styのインストール手順を示します。

$ gzip -d jlisting.sty.bz2
$ sudo mkdir /usr/local/share/texmf-dist/tex/latex/jlisting
$ sudo mv jlisting.sty /usr/local/share/texmf-dist/tex/latex/jlisting/
$ sudo chown root:wheel /usr/local/share/texmf-dist/tex/latex/jlisting/jlisting.sty
$ sudo chmod go+rx /usr/local/share/texmf-dist/tex/latex/jlisting/
$ sudo chmod go+r /usr/local/share/texmf-dist/tex/latex/jlisting/jlisting.sty
$ sudo mktexlsr

まとめ

MagicPointのスライドをPDFに変換する手順をまとめてみました。背景色を指定しepsを含むスライドをPS,PDFに変換する場合はいろいろとハマり所があり苦労しました。しかし一通りの手順は把握できたので、これでMagicPointを活用する場面が増えそうです。