PDFでプレゼンできるImpressiveをinfoファイル使って自分好みに

昔、昔、自分の PC を持ち込めないという環境下でパワポを使ったらバージョンの違いでレイアウトがズレたり図中の色が抜けたりという経験があってから PDF を使用するようにしています。

- Win 環境なら、 Adobe Reader のフルスクリーンモードで、
- Ubuntu 環境なら、 Evince のプレゼンテーションモードで、
- それでうまくいかない場合はブラウザで、 もしフルスクリーン又はプレゼンテーションモードがあれば使用、
- それでもうまくいかない時は、 「 [PDF.js](https://mozilla.github.io/pdf.js/) 」のプレゼンテーションモードで、<br>※PDF.js はその場でダウンロードしても良いし、オフラインでも使えるので USBメモリに入れて持ち運ぶことも可

てな感じで構えているんですが、持ち込めない時は Win + Adobe Reader となるし、自分の PC を持ち込める（又は持ち込まないといけない）時は、 Ubuntu + Evince となるので、今までで PDF.js を使ったことはないです。

実は最初の頃は Win 版の「 Impressive (http://impressive.sourceforge.net/) 」を使ってたんですが、準備しているときに 1 度だけ異常終了した事があって、それから使うのやめていました。

でも最近になって、 Ubuntu のパッケージに含まれていること発見し、以下のコマンドで簡単にインストールできることが分かったので久しぶりに使ってみました。

```console:Impressiveのインストール
sudo apt install impressive

$ impressive
Welcome to Impressive version 0.11.1
command line parse error: no playable files specified
use `/usr/bin/impressive -h' to get help
or visit http://impressive.sourceforge.net/ for full documentation
```

## Impressive 使うメリットは info ファイルかな
info ファイルを使わないなら Impressive 使わないかなって言うくらい私にとっては info ファイルが大事だったりします。

まずは簡単なところから、

プレゼンしたい PDF ファイルを demo.pdf というファイル名で準備したと仮定します。

そしたら、 demo.pdf.info というファイル名で以下の内容を書き込みます。書き込めたら、  `impressive demo.pdf` とするとページ移動時の効果を無効にして表示することができます。

```py:info-#ページ移動時の効果を無効
# coding: utf-8
AvailableTransitions = [None] #ページ移動時の効果
```

ちなみに使用できる効果の一覧は `-l` オプションで表示させることができ、後述する `PageProps` を使えばページごとに設定することも可能です。

```console:効果の一覧（実行結果）
$ impressive -l
Welcome to Impressive version 0.11.1
Available transitions:
  Crossfade       - simple crossfade
  FadeOutFadeIn   - fade out to black and fade in again
  None            - no transition
  PagePeel        - an unrealistic, but nice page peel effect
  SlideDown       - slide downwards
（以下省略）
```

Impressive には経過時間を表示させる機能が備わっていて、 [t] キーで表示/非表示を切り替えられます。表示させると、画面右上に「 12:34 」のように「分:秒」または「時:分:秒」フォーマットで経過時間が表示されます。パラメーターを設定すれば「 12min 」みたいにできるのですが、それでも不満なので、そのあたりを変更してしまいます。

以下のように書けば画面右下に小さく「 12 」って表示されるようになります。そう、 info ファイルでは  Impressive の既存メソッドを上書きできてしまうんです。

```py:info-経過時間を目立たないように表示
# coding: utf-8
#経過時間を表示
TimeDisplay = True #タイマーを表示する（default=False）
OSDTimePos = BottomRight #タイマーの場所を右下に。（default=TopRight）
FontSize = 12 #フォントサイズ。小さく目立たないように。（default=16）
OSDMargin = 1 #マージン（default=16）
MinutesOnly = True #「分」だけ表示（default=False）

#「分」表示をさらに短く
def FormatTime(t, minutes=False):
    if minutes:
        return "%d" % (t / 60)
    elif t < 3600:
        return "%d:%02d" % (t / 60, t % 60)
    else:
        ms = t % 3600
        return "%d:%02d:%02d" % (t / 3600, ms / 60, ms % 60)
```

「分」しか表示されなくなったとはいえ、スライド表示中に経過時間の表示が変わると気になるので、経過時間の更新はページ移動時のみとして、ページを表示させている時は更新されないようにしちゃいます。

```py:info-経過時間をリアルタイムで更新しない
# coding: utf-8
#経過時間をリアルタイムで更新しない
def TimerTick():
    return False
```

さらにさらに、エスケープキーを勢い余って押してしまって終了させてしまうことがあるので、終了は [Q] キーか [Alt] + [F4] キーのみにしちゃいます。

```py:info-エスケープキーで終了を無効
# coding: utf-8
#勢いあまって [Esc] で終了しないようにする。終了は [q] 又は [Alt] + [F4]
BindEvent("escape -= quit")
```

私は使っていなんですけど、もしプログレスバーを表示させる場合でも、細くして目立たないようにすることもできます。

```py:demo.pdf.info
# coding: utf-8
EstimatedDuration = ParseTime("5:00") #所要時間＆プログレスバー表示。
ProgressBarSizeFactor = 0.004 #プログレスバーの太さ。細く目立たないように。（default=0.01）
ProgressBarAlpha = 1 #プログレスバーの透明度。薄く強調しないように。（default=0.5）
```

時間があったら紹介するとか、やっぱりやめというという話になって、表示させたくないページが現れたら、以下のように書いて表示させないようにしています。その場合でも [Tab] キーで一覧表示させた時には表示されるので、そこで選べば表示できるので便利です。

```py:demo.pdf.info
# coding: utf-8
PageProps = {
  1: {'skip': True},
}
```

でもって最終的に使ったのは以下のような感じ。

```py:info最終的に使ったやつ
# coding: utf-8
# Impressive version 0.11.1
#ページ移動時の効果を無効
AvailableTransitions = [None] #ページ移動時の効果

#経過時間を表示
TimeDisplay = True #タイマーを表示する（default=False）
OSDTimePos = BottomRight #タイマーの場所を右下に。（default=TopRight）
FontSize = 12 #フォントサイズ。小さく目立たないように。（default=16）
OSDMargin = 1 #マージン（default=16）
MinutesOnly = True #「分」だけ表示（default=False）

#「分」表示をさらに短く
def FormatTime(t, minutes=False):
    if minutes:
        return "%d" % (t / 60)
    elif t < 3600:
        return "%d:%02d" % (t / 60, t % 60)
    else:
        ms = t % 3600
        return "%d:%02d:%02d" % (t / 3600, ms / 60, ms % 60)

#経過時間をリアルタイムで更新しない
def TimerTick():
    return False

#勢いあまって [Esc] で終了しないようにする。終了は [q] 又は [Alt] + [F4]
BindEvent("escape -= quit")

#titleで日本語が使えるように
FontList = ["TakaoPGothic.ttf"]
def GetCharset(self, charset=None):
  return 'utf-8'
GLFont.GetCharset = GetCharset

#本当はタイトルなんだけどページの覚え書きとして使っちゃう
PageProps = {
  6: {
       'title': 'データ元は気象庁ホームページ https://www.data.jma.go.jp/obd/stats/etrn/index.php',
     },
}
```

## もっともっと info ファイルを書くにはソースコードを見よう
変数やメソッドを変更するような info ファイルを書くなら、やっぱソースコード見なくちゃ書けないところがあるかなって思います。ソースコードは以下のようにすれば簡単にゲットできますし、本家の http://impressive.sourceforge.net/ からでもゲットできます。

```console:ソースコードのゲット
apt source impressive
```

## よく使う操作
よく使う操作は以下くらい。忘れちゃうこともあるのでメモ。

|操作|内容|
|:--|:--|
|[b] と [w] のキー|画面を真っ黒又は真っ白にする|
|[tab] キー|スライド一覧を表示する|
|[r] キー|経過時間をリセットする|
|ドラック&ドロップ|範囲内をハイライトする|

## info ファイルの利用はほどほどに
info ファイルは強力な反面、今回みたいにメソッドの書き換えを行ってしまうと Impressive のバージョンに依存してしまうところがあります。作った時と異なるバージョンの Impressive を使う時はソースコードを見比べたり動作チェックをする必要が出てきますので、そのあたりも考えるとほどほどが良いかなって思ってます。