平衡点
2026/06/04
_ Beamer で画像も covered/uncover しつつ, 陰影を付けたり[TeX]
前回: Beamer で画像も covered/uncover を使いたい: 平衡点(2026-05-27) の続き
オプションで影を付ける様にしてみた.
% ----------------------------------------------------------------------------
% 図に影を付ける
% code adapted from https://tex.stackexchange.com/a/11483/3954
%
\makeatletter
% --- 影の設定と描画マクロの定義 ---------------------------------------------
\def\shadowshift{3pt,-3pt}
\def\shadowradius{6pt}
\colorlet{innercolor}{black!60}
\colorlet{outercolor}{gray!05}
% \drawshadow に不透明度(opacity)のオプション引数[#1]を追加(デフォルトは1)
\newcommand\drawshadow[2][1]{%
\begin{pgfonlayer}{shadow}
\shade[outercolor,inner color=innercolor,outer color=outercolor,opacity=#1] ($(#2.south west)+(\shadowshift)+(\shadowradius/2,\shadowradius/2)$) circle (\shadowradius);
\shade[outercolor,inner color=innercolor,outer color=outercolor,opacity=#1] ($(#2.north west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$) circle (\shadowradius);
\shade[outercolor,inner color=innercolor,outer color=outercolor,opacity=#1] ($(#2.south east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$) circle (\shadowradius);
\shade[outercolor,inner color=innercolor,outer color=outercolor,opacity=#1] ($(#2.north east)+(\shadowshift)+(-\shadowradius/2,-\shadowradius/2)$) circle (\shadowradius);
\shade[top color=innercolor,bottom color=outercolor,opacity=#1] ($(#2.south west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$) rectangle ($(#2.south east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$);
\shade[left color=innercolor,right color=outercolor,opacity=#1] ($(#2.south east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$) rectangle ($(#2.north east)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$);
\shade[bottom color=innercolor,top color=outercolor,opacity=#1] ($(#2.north west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$) rectangle ($(#2.north east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$);
\shade[outercolor,right color=innercolor,left color=outercolor,opacity=#1] ($(#2.south west)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$) rectangle ($(#2.north west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$);
\filldraw[opacity=#1] ($(#2.south west)+(\shadowshift)+(\shadowradius/2,\shadowradius/2)$) rectangle ($(#2.north east)+(\shadowshift)-(\shadowradius/2,\shadowradius/2)$);
\end{pgfonlayer}
}
\pgfdeclarelayer{shadow}
\pgfsetlayers{shadow,main}
% --- covered時の透過度設定 --------------------------------------------------
\newcommand{\coveredopacity}{0.15}
% --- graphicxのオプション(Gin)に shadow キーを追加 --------------------------
\newif\if@Gin@shadow
\define@key{Gin}{shadow}[true]{%
\lowercase{\def\@tempa{#1}}%
\def\@tempb{true}%
\ifx\@tempa\@tempb \global\@Gin@shadowtrue \else \global\@Gin@shadowfalse \fi
}
% --- \includegraphics の再定義 ----------------------------------------------
\let\originalincludegraphics\includegraphics
\RenewDocumentCommand{\includegraphics}{ d<> O{} m }{%
\global\@Gin@shadowfalse % 毎回影のフラグをリセット
\IfNoValueTF{#1}{%
% オーバーレイ指定がない場合
\begin{tikzpicture}[baseline=(image.south)]
\node[anchor=south west, inner sep=0pt, outer sep=0pt, opacity=1] (image) at (0,0) {\originalincludegraphics[#2]{#3}};
\if@Gin@shadow \drawshadow[1]{image} \fi
\end{tikzpicture}%
}{%
% オーバーレイ指定がある場合
\begin{tikzpicture}[baseline=(image.south)]
\alt<#1>{%
% 通常表示時
\node[anchor=south west, inner sep=0pt, outer sep=0pt, opacity=1] (image) at (0,0) {\originalincludegraphics[#2]{#3}};
\if@Gin@shadow \drawshadow[1]{image} \fi
}{%
% grayout時
\node[anchor=south west, inner sep=0pt, outer sep=0pt, opacity=\coveredopacity] (image) at (0,0) {\originalincludegraphics[#2]{#3}};
\if@Gin@shadow \drawshadow[\coveredopacity]{image} \fi
}%
\end{tikzpicture}%
}%
}
\makeatother
もう少し簡単な方法もありそうだけれど, まあこれで良いか.
あとは ox-beamer での画像指定で, overlay まで指定できると完璧なんだが, どうするかな.
[ツッコミを入れる]