【问题标题】:new font style for stargazer latex table when using knitr使用 knitr 时 stargazer 乳胶表的新字体样式
【发布时间】:2014-12-03 12:01:30
【问题描述】:

我想以等宽字体打印使用stargazer() 生成的乳胶表,并且我想使用knitr 以可重现的方式执行此操作(即,无需手动乳胶编码)。我尝试定义一个名为mymono 的环境,然后通过\begin{}\end{} 将knitr 块包装在此环境中。这是行不通的;表格以默认字体样式打印。

\documentclass{article} 
\newenvironment{mymono}{\ttfamily}{\par}
\begin{document}   
<<lm, echo=FALSE>>=  
df <- data.frame(x=1:10, y=rnorm(10))
library(stargazer)  
lm1 <- lm(y ~ x ,data=df)  
@

% reproducible
\begin{mymono}
<<table_texstyle, echo=FALSE, results='asis', message=FALSE>>=  
stargazer(lm1, label="test")  
@  
\end{mymono}

\end{document}

我认为stargazer() 中除了font.size 之外没有字体设置。

# > sessionInfo()
# R version 3.0.2 (2013-09-25)
# Platform: x86_64-apple-darwin10.8.0 (64-bit)
# other attached packages:
# [1] stargazer_5.1

比将整个 table{} 包裹在新字体样式中更好的是仅包裹 tabular{} 以便标题保持默认样式。我不知道是否有办法以编程方式将乳胶代码插入stargazer() 输出。

【问题讨论】:

  • 你可以capture.output() stargazer 结果然后编辑它,在你想要的地方插入你想要的行。
  • 是的,但这是不可重现的。或者您是否正在考虑其他方式来实现自动化?
  • 为什么不能重现?写一个小函数来完成它。
  • capture.output() 很清楚。对我来说,如何编写函数来获取这个字符向量并自动在正确的位置添加乳胶代码对我来说并不明显。也许用\begin{mymono}\begin{tabular} 替换\begin{tabular} 并用\end{tabular}\end{mymono} 替换\end{tabular} 的东西。我将不得不更多地考虑这一点。我仍然很好奇为什么我原来的帖子中的方法不起作用。如果我犯了一些小错误,在某些方面调整它会更容易。

标签: r latex knitr stargazer


【解决方案1】:

评论太长了,所以这里是一个答案的开始。使用问题中的模型:

\documentclass{article} 
\begin{document}  

<<lm, echo=FALSE, message=FALSE, include=FALSE>>=
df <- data.frame(x=1:10, y=rnorm(10))
library(stargazer)  
lm1 <- lm(y ~ x ,data=df)  

tabular_tt <- function(orig.table) {
    library(stringr)
    tabular.start <- which(str_detect(orig.table, "begin\\{tabular\\}"))
    tabular.end <- which(str_detect(orig.table, "end\\{tabular\\}"))
    new.table <- c(orig.table[1:(tabular.start - 1)],
                   "\\texttt{",
                   orig.table[tabular.start:tabular.end],
                   "}",
                   orig.table[(tabular.end + 1):length(orig.table)])
    return(new.table)
}
@

<<print, results='asis', echo=FALSE>>=
cat(tabular_tt(capture.output(stargazer(lm1, label="test"))), sep="\n")
@

\end{document}

您可以根据需要轻松调整它。如果你遇到问题,我会确保你的目标 LaTeX 语法是正确的,只在 LaTeX 中玩一个小玩具表,也许玩你编织时生成的 tex 文件。

您可能需要创建函数cat(new.table, sep = "\n") 才能将其正确输出到 knitr 文档中。

【讨论】:

  • 谢谢,@Gregor。我认为browser() 正在为我破解代码。运行以下命令将为我提供正确的输出以传递给您的函数:cat(capture.output(stargazer(lm1, label="test")), sep="\n")。使用browser(),它会中断。没有它,我会得到Error in 1:(tabular.start - 1) : argument of length 0
  • 哎呀,有browser() 在那里进行调试。我没有在 Rnw 文档中尝试过,但在我的 R 控制台中,它现在按我的问题工作。
  • 我必须做一个小改动(将第三个t 添加到\textt)才能使其正常工作。完成后,我添加了 knitr 块代码来生成 pdf。看起来很棒。非常感谢。
  • @EricGreen 很高兴听到它有帮助! \texttt vs \textt,这是我之前犯过很多次的错误:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2011-03-04
相关资源
最近更新 更多