はじめに

プレゼン中にデモ等を多用する場合、いちいちプレゼン画面とデモに使用するアプリケーションを行き来するのは手間がかかりますが、壁紙を利用してプレゼンをするとすぐにアプリケーションが起動でき、デモの最中でもプレゼン画面を参照できるので便利かと思い、ある集会で実行してみました。そのときの方法を公開します。なお、AppleScriptを使用するためMac OS X限定です。Windows OS やLinuxでも可能と思いますが、ここでは考えません。

準備

画像の用意

前提として連番でファイル名をつけたプレゼン用の画像を用意します。PowerPointの場合は「画像で保存を選ぶ」と各シートを連番で保存します。pdfで作成してある場合は、imagemagickなどを利用して、画像に変換すると連番で保存されます。このページを参照して下さい。なお、1,2,3,...となる場合と01,02,03,...となる場合でshell scriptの処理が少し変わります。

AppleScriptの作成

AppleScriptでは壁紙を指定された画像ファイルに変換する作業を行います。
on run argv
	tell application "Finder" to set desktop picture to POSIX file (item 1 of argv & item 2 of argv & item 3 of argv & ".png")
end run
引数の1番目が画像のあるフォルダへのパス、2番目が画像ファイルのプレフィックス、3番目がファイルの番号です。画像ファイルの拡張子はpngにしていますが、使用する画像ファイルの形式にあわせてください。 このスクリプトをScriptEditorで適当な名前(ここではchange.scpt)をつけて保存します。 このapplescriptファイルを、shell scriptでよびだして使用します。

Shellスクリプトの作成

ここでは画像の連番が0から始まるようにしています。1から始める場合は,変数varの初期値を1にして,条件文の
 -lt 
 -le 
に変えて下さい。また,連番が01,02,03,...の場合はコメントアウトしている
printf -v num "%02d" $var
とその次の行に変更してください。(めったにないと思いますが,シートが100を越えるときは,"%03d"と3桁表示にしてください。)
#!/bin/bash

if [ $# -ne 2 ]
then
echo "画像フォルダまでのパス(最後の/を忘れずに)と共通のprefixを正確に指定してください。" 1>&2
echo "presen.sh path-to-folder prefix" 1>&2
exit 1
fi

var=0
filenum=$(ls $1 | wc -l)

while :
do
if [ $var -lt $filenum ]
then

#printf -v num "%02d" $var
#osascript  '/< path_to_script>/change.scpt' $1 $2 $num

osascript  '/< path_to_script>/change.scpt' $1 $2 $var
else
echo "end"
fi

read -s key

case $key in
	"" ) var=$((var+1))
		 echo "$var";;
	":")  var=$((var-1))
		 echo "$var";;
	* ) ;;
esac

done

このスクリプトファイルを適当な名前(ここではpresen.sh)をつけて保存します。

プレゼンの実行

プレゼンの開始

プレゼンを開始するには,ターミナルを開いて
$sh presen.sh < path-to-folder> < prefix >
を実行します。なお,プレゼン中にページの移動をするためはターミナルが最前面にある必要があります。そのためターミナルメニューが邪魔に感じます。その場合は 以下の方法でターミナルのメニューを一時的に表示しないようにします。なお,.plistの書き換えを行いますので.plistのバックアップは必ずしてください。
Macのメニューバーを隠す方法がありました | ライフハッカー[日本版] プレゼン終了後にもとに戻すときは,Property List EditorでApplication UI Presentation Modeの値をnormalにします。
なお,画像がはみ出す場合は,システム環境設定の「デスクトップとスクリーンセーバ」でデスクトップの画像の表示方法を「画面に収まるサイズに表示」に変更して下さい。

シートの移動

ターミナルのウインドウは端によせておいて最前面に出した状態にします。デモを行った後は,ターミナルの画面をクリックして最前面にします。次のシートへの移動はEnter/Returnキーを押し,前のシートへの移動はコロン(:)+Enter/Returnキーです。キーを変更したい場合は,Shellスクリプトの最後のcase文の場合分けのところを変更して下さい。

画像のサムネール

すべての画像を一覧する場合は,画像フォルダのエイリアスをデスクトップに作成し,さらにファイルの表示をアイコン表示かCoverFlowにしておきます。

時間管理

メニューバーを非表示にしているので時間がわからないので,デスクトップに表示できる時計を用意しておくとよいと思います。

ページ移動に矢印を使いたいとき

上のshell scriptの場合,進むときははEnter/Returnキーの入力のみですが,戻るときは,コロンとEnter/Retuenキーの2度押しになるので戻るときは不便です。また,通常のプレゼンでは矢印キーを用いることが多いのでそれに合わせたいという欲求もあります。ただ,矢印キーを使う場合は,やや工夫が必要です。それは矢印キーの表現が3バイトのためです。そこで,ReadingFunctionKeysInBash - Greg's Wikiを参考にして次のようなScriptに変更します。本当はtimeoutを短くしたいのですが,どうも整数値でないとinvalid timeout specification エラーが出て動きません。
#!/bin/bash

ReadKey(){
if read -s -n 1 _REPLY; then
while read -s -t 1 -n 1  ; do
 _REPLY+="${REPLY}"
 done
fi
}

if [ $# -ne 2 ]
then
echo "画像フォルダまでのパス(最後の/を忘れずに)と共通のprefixを正確に指定してください。" 1>&2
echo "presen.sh path-to-folder prefix" 1>&2
exit 1
fi

var=0
filenum=$(ls $1 | wc -l)
osascript '/< path_to_script >/change.scpt' $1 $2 $var

while ReadKey;
do
if [ $var -lt $filenum ]
then
osascript '/< path_to_script >/change.scpt' $1 $2 $var
else
echo "end"
fi

case ${_REPLY} in
	$'\e[C' ) var=$((var+1))
			  echo "$var";;
	$'\e[D' )  var=$((var-1))
	           echo "$var";;
	* ) ;;
esac

done

欠点

この方法の最大の欠点は,修正がすぐにできないことです。プレゼンの最中はもちろん,プレゼン前に誤字等に気がついてもすぐに修正できません。画像の生成部分までの一連の流れを自動化しておく必要があります。