3

我一直在尝试使用knitr. 在\LaTeX我希望定义一个名为myplot. 然后我想说一些诸如此类的话:

编码

<<myplot, tidy = FALSE>>=
plot(runif(9), runif(9),
     xlab = "x",
     ylab = "y",)
@

结果Figure~\ref{fig:myownlabel}

\begin{figure}[hh]
\begin{center}
<<myplotfig, out.width='.50\\linewidth', width=6.6, height=4.8, echo=FALSE>>=
par(las = 1, mfrow = c(1, 1), mar = c(5, 4, 1, 1)+0.1)
<<myplot>>
@
\caption{
I insist to have the caption in \LaTeX.
\label{fig:myownlabel}
}
\end{center}
\end{figure}

我知道如何在 Sweave 中做到这一点,但似乎无法在knitr. 也就是说,代码块被读者看到了。你能给我一些建议吗?提前致谢。托马斯

4

1 回答 1

4

这是 Sweave 和 Sweave 之间的一个区别knitr:默认情况下,Sweave 不保留图(除非您指定fig=TRUE),但knitr会保留(除非您真的不想要它们,使用fig.keep='none')。

<<myplot, tidy = FALSE, fig.keep = 'none'>>=
plot(runif(9), runif(9),
     xlab = "x",
     ylab = "y",)
@

\begin{figure}[hh]
\begin{center}
<<myplotfig, out.width='.50\\linewidth', fig.width=6.6, fig.height=4.8, echo=FALSE>>=
par(las = 1, mfrow = c(1, 1), mar = c(5, 4, 1, 1)+0.1)
<<myplot>>
@
\caption{
I insist to have the caption in \LaTeX.
\label{fig:myownlabel}
}
\end{center}
\end{figure}

虽然到目前为止问题已经解决,但我还有一些其他意见:

  1. 当您使用knitr( >= 1.1) 时,您应该能够看到有关代码块语法的警告,并且您需要调用Sweave2knitr()以解决问题;您将意识到(使用和)中的width并且height不是有效的块选项;看到这里了解更多信息knitrfig.widthfig.height
  2. 对于 chunk myplot,我会使用eval=FALSE,因为您可能不想两次评估代码;
  3. 使用knitr,您实际上可以通过块选项完成所有操作,例如

    <<myplot, tidy=FALSE, eval=FALSE, echo=-1>>=
    @
    <<myplot, out.width='.5\\linewidth', fig.width=6.6, fig.height=4.8, fig.align='center', echo=FALSE, fig.pos='hh', fig.cap='I insist to have the caption in \\LaTeX.'>>=
    par(las = 1, mfrow = c(1, 1), mar = c(5, 4, 1, 1)+0.1)
    plot(runif(9), runif(9),
         xlab = "x",
         ylab = "y",)
    @
    

    这为您提供centerfigure环境,并自动生成标签fig:myplot

于 2013-08-06T00:31:30.213 回答