我正在制作一份 LaTeX 报告,其中在 dlply 调用中生成多个图。 当然,dlply 调用在单个代码块中,在为了更改标签和标题而使用 Steve Powell 的代码片段。 这种方法有效,但似乎 knitr 没有正确格式化输出。 下面是演示的一个简单示例:
\documentclass{article}
\begin{document}
<startup,echo=FALSE,results='hide',message=FALSE,tidy=FALSE,warning=FALSE,fig.keep='all',comment=NA>>=
require(knitr)
require(ggplot2)
opts_knit$set(progress = F, verbose = F)
opts_chunk$set(comment=NA,
tidy=FALSE,
warning=FALSE,
message=FALSE,
echo=FALSE,
dpi=600,
fig.width=6.75, fig.height=4, # Default figure widths
dev=c("pdf",'tiff'),
dev.args=list(pdf=list(NULL),tiff=list(compression='lzw')),
error=FALSE)
@
<<plotloop,results='asis'>>=
for(x in seq(1,20)){
x1<-data.frame(x=seq(1,10),y=seq(1,10))
plt<-ggplot(data=x1,aes(x,y))+geom_point()
figLabel=paste('Figure',x,sep='')
capt<-paste('Caption for fig.',x)
cat(knit(text=(paste("<<",figLabel,",fig.pos='ht',fig.cap='",capt,"'>>=\nplt\n@",sep=''))))
}
@
\end{document}
这几乎可行。问题在于knitr将闭合的\caption大括号放在\label大括号外面,可以在下面的.tex文件片段中看到:
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}
\color{fgcolor}
\begin{figure}[ht]
\includegraphics[width=\maxwidth]{figure/Figure1} \caption[Caption for fig]{Caption for fig. 1\label{fig:Figure1}}
\end{figure}
\end{knitrout}
如果只有少量这样的图形,LaTeX可以处理,但是对于更大量的绘图,它会开始将它们放置不正确。
我也尝试过用
fig.cap=paste('testLoop',seq(1,20))
采用相同的方法可以得到相同的结果。
进一步说明:我在维基百科的LaTeX/Floats...页面上找到了这个内容:(链接)
如果您想标记一个图形,以便以后可以引用它,则必须在标题后添加标签(似乎在LaTeX 2e中内部工作),但必须在浮动环境内部。 如果在外部声明,它将给出节号。
“在LaTeX 2e中内部工作”的部分引起了我的注意。这似乎只是因为忽略了错误多次才能正常工作?我正在使用LaTeX2e <2005/12/01>。我认为代码片段位于hooks-latex.R文件的hook_plot_tex函数的第120行:
fig2 = sprintf('\\caption%s{%s\\label{%s}}\n\\end{%s}\n', scap, cap,
paste(lab, if (mcap) fig.cur, sep = ''), options$fig.env)
这样就解决了吗?
fig2 = sprintf('\\caption%s{%s}\\label{%s}\n\\end{%s}\n', scap, cap,
paste(lab, if (mcap) fig.cur, sep = ''), options$fig.env)
有建议吗?我不熟悉GitHub的流程... 谢谢!
paste()
动态创建代码块。请参考示例 20:https://github.com/yihui/knitr-examples - Yihui Xie