knitr代码块生成空行致LaTeX无效,如何禁止asis输出末尾换行?
解决knitr在
results="asis"输出末尾额外添加空行的问题 确实遇到过这个坑——当用results="asis"输出本身带换行的内容时,knitr默认会多插一个空行,刚好在LaTeX的严格环境(比如equation)里就会触发编译错误。这里有几个实用的解决办法,不用手动去处理每一段输出:
1. 用knitr::asis_output()替代直接cat()
asis_output()函数专门用来生成asis类型的输出,它有个sep参数可以控制输出的分隔符(默认是换行符\n)。把这个参数设为空字符串,就能阻止knitr额外添加空行:
比如你的示例可以改成这样:
<<echo=FALSE, results="asis">>= knitr::asis_output("E=mc^2\n", sep = "") @
这样编译出来的LaTeX代码里,equation环境内就不会有多余的空行,能正常通过编译。
2. 处理print.xtable这类自动输出换行的函数
对于像print.xtable这类会自动输出带结尾换行的函数,我们可以先捕获它的输出,再用asis_output()传递,同样设置sep="":
<<echo=FALSE, results="asis">>= library(xtable) xtab <- xtable(head(mtcars)) # 捕获print.xtable的输出 output_lines <- capture.output(print.xtable(xtab, type = "latex")) # 用asis_output输出,不添加额外换行 knitr::asis_output(output_lines, sep = "") @
这样就不用手动去修剪每一行的末尾换行,省心很多。
3. 全局设置(谨慎使用)
如果你的整个文档都需要禁用asis输出的额外换行,可以在文档开头的chunk里设置全局选项:
<<setup, include=FALSE>>= knitr::opts_chunk$set(sep = "") @
不过要注意,这个设置会影响所有chunk的输出分隔逻辑,如果有些chunk需要默认的换行分隔,就别用这个全局设置,还是针对单个chunk单独设置sep=""更稳妥。
为什么会出现这个问题?
knitr默认给results="asis"的输出添加换行作为分隔符,目的是让不同输出块之间有清晰的分隔。但当你的输出本身已经以换行结尾时,就会叠加出一个空行,而LaTeX的equation等数学环境里不允许出现空行,所以就会编译失败。
内容的提问来源于stack exchange,提问作者Ott Toomet
相关产品推荐
相关产品推荐

