图像居中时出现帧缩放伪影

图像居中时出现帧缩放伪影

使用framezoom命令时,同时使图像居中;\

\documentclass{beamer}

\mode<presentation>{\usetheme{Warsaw}}

\begin{document}

\begin{frame}

\begin{center}

\framezoom<2><3>[border](3.5cm, 1.5cm)(1cm, 1cm)

\pgfimage[height=5cm]{example-image}

\end{center}

\end{frame}

\end{document}

图像将居中并且边框的定位好像中心为 0。但缩放实际上是在图片的一部分上进行缩放,就好像 0 位于幻灯片的左侧一样。

简而言之,边框和缩放不再匹配。我的问题是:我可以在将图像居中时使用带边框的 framezoom 吗

答案1

在我看来,这似乎是个 bug beamer\framezoom可能使用了某种形式的锚点,而这种锚点会受到居中的影响。

解决这个问题的一个方法是\framezoom 外部环境center

\documentclass{beamer}
\usetheme{Warsaw}

\begin{document}

\begin{frame}
\framezoom<2><3>[border](3.5cm, 1.5cm)(1cm, 1cm)
\begin{center}
\pgfimage[height=5cm]{example-image}
\end{center}

\end{frame}

\end{document}

请注意,如果您使用该选项,您可以使用我的adjustbox包非常轻松地将图像置于中心。无论如何,据我所知,它用于PDF 输出。export\includegraphics\pgfimage\includegraphics

\documentclass{beamer}
\usetheme{Warsaw}
\usepackage[export]{adjustbox}
\begin{document}

\begin{frame}
\framezoom<2><3>[border](3.5cm, 1.5cm)(1cm, 1cm)
\includegraphics[height=5cm,center]{example-image}
\end{frame}

\end{document}

答案2

马丁·沙雷尔已经为这个问题提供了很好的解决方法,所以我想填写一些关于为什么会发生这种情况的信息:

相关代码\framezoom可以在beamerbaseframesize.sty,第39-135行:

\def\beamer@framezoom<#1><#2>[#3](#4,#5)(#6,#7){%
  % [...]
  \only<#1>{%
    {\hypersetup{pdfhighlight={/P},pdfborder={0 0 \beamer@zoomborderwidth}}%
    \global\setbox\@tempboxa=\vbox{\hyperlink{\beamer@labelzoomed}{\vbox to #7{\hbox
          to#6{\hfil}\vfil}}}}%
    \ht\@tempboxa=0pt%
    \wd\@tempboxa=0pt%
    \dp\@tempboxa=0pt%
    \setbox\@tempboxa=\vbox{\moveright#4\hbox{\lower#5\vbox{\box\@tempboxa}}}%
    \ht\@tempboxa=0pt%
    \wd\@tempboxa=0pt%
    \dp\@tempboxa=0pt%
    \global\setbox\beamer@zoombox=\vbox to0pt{\unvbox\beamer@zoombox\box\@tempboxa}%
  }%
  % [...]
}

上述代码片段生成可点击的缩放框并将其存储在框中\beamer@zoombox,该框稍后插入到框的开头(在beamerbaseframe.sty\framezoom,l. 144)。因此,一般来说,在框架的任何地方使用它都没有问题,因为参考点始终是框架文本的开头。

但是,在您的示例中,这显然不是事实。原因是您\framezoom在环境中使用 和center更改段落边距。这会弄乱行\leftskip\rightskip

\global\setbox\@tempboxa=\vbox{\hyperlink{\beamer@labelzoomed}{\vbox to #7{\hbox
      to#6{\hfil}\vfil}}}}%

在上述代码中:由于边距变化有效,\hyperlink在 内居中\vbox,导致缩放框放置错误。为了解决这个问题,您必须将链接放在另一个 中\hbox,如下所示:

\global\setbox\@tempboxa=\vbox{\hbox{\hyperlink{\beamer@labelzoomed}{\vbox to #7{\hbox
      to#6{\hfil}\vfil}}}}}%

这可以\patchcmd通过使用etoolbox包裹:

\documentclass{beamer}
\usetheme{Warsaw}

\usepackage{etoolbox}
\makeatletter
  \patchcmd{\beamer@framezoom}{\hyperlink{\beamer@labelzoomed}{\vbox to #7{\hbox to#6{\hfil}\vfil}}}{\hbox{\hyperlink{\beamer@labelzoomed}{\vbox to #7{\hbox to#6{\hfil}\vfil}}}}{}{}
\makeatother

\begin{document}

\begin{frame}
\begin{center}
  \framezoom<2><3>[border](3.5cm, 1.5cm)(1cm, 1cm)
  \pgfimage[height=5cm]{example-image}
\end{center}
\end{frame}

\end{document}

但是,仍有一些特殊的段落参数,这种解决方法也会失败。所以,最好还是遵循beamer手动的

这个命令[即\framezoom]应该在帧的开始处给出。

相关内容