0

我正在混合 knitr、beamer 和 xelatex 来制作一些演讲幻灯片。我希望看到我的人物投下阴影,以使我的演示文稿更花哨。

我找到了一种从常规图形中删除阴影的好方法,但我无法让它在 knitr 块中工作。

你们知道我该如何解决这个问题吗?

4

1 回答 1

2

使用块选项 fig.show = "hide",您可以防止knitr将生成的数字包含到您的文档中。这允许您使用您喜欢的任何标记手动包含图形。

请注意,默认情况下,数字存储在目录figure中,文件名遵循模式chunkname-figurenumber,例如第二个数字mychunk具有文件名mychunk-1.pdf。(参见fig.path上面链接的块选项列表。)

这给我们留下了最后一个陷阱:情节的背景颜色。

根据您使用的图形包和设备,默认情况下,绘图的背景可能是透明的(例如 tikz 用于基本图形)或白色(例如ggplot2)。white如果您确实希望基本图形的背景颜色始终为白色,则可以为该选项 设置一个挂钩,如下所示:

<<white-background,eval=FALSE>>=    
knit_hooks$set(white = function(before, options, envir) {if (before) par(bg = 'white')}) 

(引用来自旧版本knitr 图形手册;我在当前版本中找不到。)

如果您需要一个块挂钩,或者设置par(bg = "white")对您来说是否足够,取决于您生成的图表的数量。如果您不知道如何使用块挂钩,请查看本文末尾。

不使用块挂钩并根据问题中链接的答案改编 TEX 代码,以下代码用于knitr生成带阴影的图形:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{shadows,calc}

% code adapted from https://tex.stackexchange.com/a/11483/3954
% code then adapted from https://tex.stackexchange.com/a/81847/37118
%
% some parameters for customization
\def\shadowshift{3pt,-3pt}
\def\shadowradius{6pt}

\colorlet{innercolor}{black!60}
\colorlet{outercolor}{gray!05}

% this draws a shadow under a rectangle node
\newcommand\drawshadow[1]{
    \begin{pgfonlayer}{shadow}
        \shade[outercolor,inner color=innercolor,outer color=outercolor] ($(#1.south west)+(\shadowshift)+(\shadowradius/2,\shadowradius/2)$) circle (\shadowradius);
        \shade[outercolor,inner color=innercolor,outer color=outercolor] ($(#1.north west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$) circle (\shadowradius);
        \shade[outercolor,inner color=innercolor,outer color=outercolor] ($(#1.south east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$) circle (\shadowradius);
        \shade[outercolor,inner color=innercolor,outer color=outercolor] ($(#1.north east)+(\shadowshift)+(-\shadowradius/2,-\shadowradius/2)$) circle (\shadowradius);
        \shade[top color=innercolor,bottom color=outercolor] ($(#1.south west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$) rectangle ($(#1.south east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$);
        \shade[left color=innercolor,right color=outercolor] ($(#1.south east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$) rectangle ($(#1.north east)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$);
        \shade[bottom color=innercolor,top color=outercolor] ($(#1.north west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$) rectangle ($(#1.north east)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$);
        \shade[outercolor,right color=innercolor,left color=outercolor] ($(#1.south west)+(\shadowshift)+(-\shadowradius/2,\shadowradius/2)$) rectangle ($(#1.north west)+(\shadowshift)+(\shadowradius/2,-\shadowradius/2)$);
        \filldraw ($(#1.south west)+(\shadowshift)+(\shadowradius/2,\shadowradius/2)$) rectangle ($(#1.north east)+(\shadowshift)-(\shadowradius/2,\shadowradius/2)$);
    \end{pgfonlayer}
}

% create a shadow layer, so that we don't need to worry about overdrawing other things
\pgfdeclarelayer{shadow}
\pgfsetlayers{shadow,main}

\newsavebox\mybox
\newlength\mylen

\newcommand\shadowimage[2][]{%
\setbox0=\hbox{\includegraphics[#1]{#2}}
\setlength\mylen{\wd0}
\ifnum\mylen<\ht0
\setlength\mylen{\ht0}
\fi
\divide \mylen by 120
\def\shadowshift{\mylen,-\mylen}
\def\shadowradius{\the\dimexpr\mylen+\mylen+\mylen\relax}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[#1]{#2}};
\drawshadow{image}
\end{tikzpicture}}

\begin{document}


<<myfigure, echo = FALSE, fig.show = "hide">>=
par(bg = "white")
plot(1)
@

\begin{frame}
\shadowimage[width=7cm]{figure/myfigure-1}
\end{frame}

\end{document}

图与阴影。

于 2015-08-25T12:38:35.117 回答