Как использовать knitr для получения оверлейных анимаций в латексном проекторе? - PullRequest
1 голос
/ 23 февраля 2020

В латексном проекторе вы можете написать следующее для получения анимации наложения:

\begin{overprint}
  \foreach \x in {1,2,3}{%
    \only<\x>{%
      \includegraphics{figure/plot-\x.pdf}
    }
  }
\end{overprint}

Как получить knitr для создания такого вывода и использования анимации наложения?

PS: I Я знаю о fig.out='animate', но он работает только с Acrobat, тогда как я хочу универсальное решение.

1 Ответ

2 голосов
/ 23 февраля 2020

Мне удалось написать chunk_hook, который сканирует выходные данные чанка и добавляет среду надпечатки, а также части \only<i> вокруг каждого графика:

Вот хук:

library(stringi)
overlay_hook = function(x, options) {
  x = knitr:::.chunk.hook.tex(x, options)
  if (!is.null(options$overlay_start)) {
    ind_matches = stri_locate_all_regex(x, "\\\\includegraphics")[[1]]
    stri_sub_all(x, from = ind_matches[,2]+1, length = 0) = 
      paste0("<", seq_len(nrow(ind_matches)) + options$overlay_start - 1 ,">")
  }
  return(x)
}
knitr::knit_hooks$set(chunk = overlay_hook)

Чтобы использовать его, вы должны установить значение overlay_start (например, 1, если оно должно начинаться с первого шага анимации)

<<plot, results='hide', overlay_start = 1, fig.height=3>>=
for (i in 1:3)
  plot(function(x) x^i)
@
...