【问题标题】:How can knitr keep warning messages inside the box?knitr 如何在盒子内保留警告信息?
【发布时间】:2015-01-30 17:44:38
【问题描述】:

我正在使用 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 将警告保留在框中。我查看了knitr chunk optionsformatR info 上的文档,但找不到解决方案。

谢谢!

【问题讨论】:

    标签: r knitr


    【解决方案1】:

    LaTeX 正在尝试在此处生成左右对齐的文本块。这意味着换行和断字以获得一个很好的直右边缘。您的警告中有很长的文字,LaTeX 不会连字符打字机文本,因此它会溢出分配给它的框并在 TeX 日志文件中打印一个过满警告。

    即使它可以对文本进行断字,它也可能很难找到一个可以断字的好地方。例如,您永远不应该将跨行的“buttoned”打破为“button-toned”。 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 就应该开始一个新行。括在花括号对中,因此正常文本不受影响。我不知道这对代码块还有什么影响,所以请谨慎购买。

    【讨论】:

    • 谢谢,这行得通!你知道是否有办法将 \raggedright 设置为所有代码块的选项?
    猜你喜欢
    • 2018-09-27
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2022-01-06
    • 2020-12-16
    相关资源
    最近更新 更多