5

听起来这应该是一个常见的问题,但我没有找到明显的技巧。考虑下面的 knitr Rnw 文件,

\documentclass[twocolumn, 12pt]{article}
\usepackage{graphicx}
\begin{document}
%\SweaveOpts{dev=pdf, fig.align=center}
\begin{figure*}
<<aaa, fig.width=8, fig.height=5, fig.show=hold>>=
plot(1,1)
@
\end{figure*}
\end{document}

我希望这个宽图跨越两列,使用{figure*}LaTeX 环境。有钩子吗?

编辑:包装块figure*给出以下输出。

在此处输入图像描述

4

3 回答 3

7

两个事实:

  1. knitr使您可以访问所有内容,因此通常不需要 LaTeX 技巧;
  2. 有一个chunk钩子,你可以用它来包装你的块结果;

一个简单的解决方案是:

knit_hooks$set(chunk = function(x, options) {
                       sprintf('\\begin{figure*}\n%s\n\\end{figure*}', x)
})

我把剩下的工作留给你来处理更多的细节options(例如options$fig.keep == 'none',你不应该将输出包装在 中figure*)。您可能想查看LaTeX的默认chunk钩子是如何定义的,knitr以更好地了解该chunk钩子是如何工作的。

但是,在这种情况下,我倾向于在文档中自己编写 LaTeX 代码,而不是自动创建它。得到之后figure*,你可能会开始思考\caption{}\label{}不难,但我还是想在 LaTeX 中看到它们)。

于 2012-01-24T02:26:08.797 回答
2

不知道 knitr 如何,但对于 Sweave(和基本乳胶),实际上有一个技巧:让 R 代码生成一个 pdf 文件,然后使用标准\includegraphics将其拉入。

所以有了这个:

\documentclass[twocolumn, 12pt]{article}
\usepackage{graphicx}
\begin{document}
%\SweaveOpts{dev=pdf}

<<aaa,fig=FALSE,print=FALSE,echo=FALSE>>=
pdf("mychart.pdf", width=6, height=3)
set.seed(42)
plot(cumsum(rnorm(100)), type='l', main="yet another random walk")
invisible(dev.off())
@

\begin{figure*}
  \includegraphics{mychart.pdf}
\end{figure*}

\end{document}

我得到了下面的文档(然后我将其从 pdf 转换为 png):

在此处输入图像描述

于 2012-01-23T23:17:58.570 回答
1

在准备一个应该跨越 IEEE 两栏会议论文中两栏的图形时,我也遇到了类似的问题。

设置块挂钩在我的设置中导致了一些奇怪的错误。 即使是这个简单的钩子:knit_hooks$set(chunk = function(x, options) x)

但是在研究之后knitr::opts_chunk$get(),我意识到简单的设置fig.env="figure*"以一种优雅的方式解决了这个问题。

这是我的块在 Rnw 文件中的样子:

<<fig1, fig.width=18, fig.height=6, fig.env="figure*">>=
@
于 2016-04-05T21:40:39.213 回答