knitr怎么能在盒子里面留下警告信息?

时间:2015-01-30 17:44:38

标签: r knitr

我正在使用knitr编写教程,我想展示一些学生可能会遇到的警告和错误。虽然我能够使用tidy=TRUE选项很好地在框中显示代码块,但我不了解如何处理警告和错误的显示。例如,如果我有以下代码:

\documentclass{article}
\begin{document}
<<setupOp, include=FALSE>>=
opts_chunk$set(tidy=TRUE,
           tidy.opts=list(blank=FALSE, width.cutoff=20))
@

<<ErrorTest>>=
warning(paste("A suuuuuuuuuuuuuuuuuper", "loooooooooooong waaaaaaaaaaaaarning"))
@

\end{document}

警告代码行很好地显示在框内,但警告本身超出了框。我有一种感觉,它与警告信息是一个非常长的字符串这一事实有关,但我不知道如何告诉编织者将警告保持在框内。我已经查看了knitr chunk optionsformatR info上的文档,但我无法找到解决方案。

谢谢!

1 个答案:

答案 0 :(得分:4)

LaTeX正在尝试在此处生成左右对齐的文本块。这意味着自动换行和连字以获得良好的直线右边缘。你的警告里面有很长的字样,LaTeX没有连字符打字机文字,所以它溢出了为它分配的盒子,并向TeX日志文件打印了一个过满的警告。

即使它可以对文本进行连字,也可能很难找到一个连接一个奇数单词的好地方。例如,你永远不应该打破&#34;按钮&#34;跨越线条#34;但是调和了#34; TeX有一个复杂的算法。

解决方案可能是为R块设置\ raggedright:

{
  \raggedright
<<setupOp, include=FALSE>>=
opts_chunk$set(tidy=TRUE,
           tidy.opts=list(blank=FALSE, width.cutoff=20))
@

<<ErrorTest>>=
warning(paste("A suuuuuuuuuuuuuuuuuper", "loooooooooooong waaaaaaaaaaaaarning"))
@
}

就像这样,每当一个单词出现在框外时,TeX应该开始一个新行。括在一个花括号对中,使普通文本不受影响。我不知道这可能会对代码块中的其他内容产生什么影响,因此需要注意。