使用knitr从R代码块中生成漂亮的波浪符~?

7

我有一个线性模型的代码块,我想要在LaTeX中漂亮地显示它。模型调用采用标准形式,带有波浪线~,在LaTeX中排版效果很差。

\documentclass{article}
\begin{document}
<<>>=
lm(Sepal.Width ~ Sepal.Length, data = iris)
@
\end{document}

这段代码使用 knitr::knit(mwe.Rnw) 进行编织,然后通过 PDFLaTeX 运行。

在 LaTeX 中制作漂亮的波浪符非常麻烦,让 knitr 制作它们似乎并不完全容易。检查由 knit 生成的 .tex 文件显示,该代码被放置在三个环境中,其中 \begin{alltt} ... \end{alltt} 是有趣的一个。但是,alltt 包没有为特殊字符的特殊排版提供任何快速修复方法。

1个回答

8

这个解决方案的灵感来自于yihui在钩子上的示例这篇文章和我的朋友RJ。

\documentclass{article}
\usepackage{xspace}
\newcommand{\mytilde}{\lower.80ex\hbox{\char`\~}\xspace}
\begin{document}
<<setup, include=FALSE>>=
library(knitr)
hook_source = knit_hooks$get('source')
knit_hooks$set(source = function(x, options) {
  txt = hook_source(x, options)
  # extend the default source hook
  gsub('~', '\\\\mytilde', txt)
})
@
<<results = "hide">>=
lm(Sepal.Width ~ Sepal.Length, data = iris)
@
\end{document}

它还定义了 \mytilde 命令供一般使用。例如,在R代码的行内示例中: "in the form \texttt{response~\mytilde~predictors} ..."。 xspace 包不是必须的(只要在新的命令中删除 xspace),但可以使命令更易于使用。

这对于回显代码很有效,但是波浪符在结果中仍然“丑陋”。 - han-tyumi
lm()被包含在summary()中时,对我没有起作用。通过设置echo=TRUE,我可以看到波浪号在模型调用中正确显示,但在摘要中却不显示,其中模型也显示为波浪号,但是被抬高了,看起来不对。 - PatrickT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接