平衡点


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 まで指定できると完璧なんだが, どうするかな.


連絡先など

portrait

最近の日記

一覧

Back to Top ▲