我正在制作一份乳胶报告,在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}
Run Code Online (Sandbox Code Playgroud)
这几乎可行.问题是knitr将关闭\标题括号放在\ 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}
Run Code Online (Sandbox Code Playgroud)
乳胶可以处理这个,如果只有这样的几个数字,但有大量的情节,它开始错误地放置它们.我也试过这个
fig.cap=paste('testLoop',seq(1,20))
Run Code Online (Sandbox Code Playgroud)
接近并获得相同的结果.
进一步说明:我在维基百科的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)
Run Code Online (Sandbox Code Playgroud)
这会解决它吗?
fig2 = sprintf('\\caption%s{%s}\\label{%s}\n\\end{%s}\n', scap, cap,
paste(lab, if (mcap) fig.cur, sep = ''), options$fig.env)
Run Code Online (Sandbox Code Playgroud)
建议?我不熟悉github进程...谢谢!
简短的回答是它似乎是由太多\ includegraphics命令和没有分页符导致的LaTeX问题.用循环内的标题和标签完成多个数字的功能(信用给Steve Powell和Yihui):
plot.knit<-function(chunkLabel,#text for chunk label which is also used for figure file name
capt,#text for caption
plt)#plot object to be placed
{
cat(knit(text=(paste("<<",chunkLabel,",fig.pos='h',fig.cap='",capt,"'>>=\nplt\n@",sep=''))))
}
cat('\\newpage')#some sort of page break must be inserted along the way to keep latex from breaking.
Run Code Online (Sandbox Code Playgroud)
可以修改此选项以添加您想要的任何块选项.
长答案:这是我为了让它发挥作用所做的.我从github下载了knitr,做了上面建议的修改,编译并运行了示例.改变后的代码没有改变结果.对乳胶错误的进一步调查将我带到了LaTeX常见问题解答,其中指出:
错误也发生在很长的浮动环境序列中,没有插入文本.除非环境适合"在这里"(并且你允许它们"在这里"),否则永远不会有分页符,因此LaTeX永远不会有机会重新考虑展示位置.(当然,如果序列足够延长,浮点数不能全部适合"此处":一旦页面填充,LaTeX将不会再放置浮点数,从而导致错误.
解决方法可能涉及使用float包的[H] float限定符重新定义浮点数,但是如果不经常使用\ clearpage,则不太可能逃脱.
所以,我补充道
cat('\\clearpage')
Run Code Online (Sandbox Code Playgroud)
在循环的每个步骤中生成图之后.这导致没有错误被抛出并且数字在正确的位置.也,
cat('\\newpage')
Run Code Online (Sandbox Code Playgroud)
在我的实际文档中将数字2放在页面上时,工作并且似乎做得更好.
工作代码:
\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='h',fig.cap='",capt,"'>>=\nplt\n@",sep=''))))
cat('\\newpage')
}
@
\end{document}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2712 次 |
| 最近记录: |