Тень в трикотаже

Я смешиваю Knitr, Beamer и Xelatex, чтобы сделать несколько слайдов для лекции. Я хотел бы, чтобы мои фигуры отбрасывали тени, чтобы сделать мою презентацию более причудливой.

Я нашел отличный способ отбрасывать тени от обычных фигур, но я не мог заставить его работать внутри кусков трикотажа.

Ребята, вы знаете, как я могу решить эту проблему?


person Marcus Nunes    schedule 24.08.2015    source источник


Ответы (1)


С помощью параметра фрагментирования 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}

Фигура с тенью.

person CL.    schedule 25.08.2015