bookdown导出PDF时如何固定modelsummary表格的位置
问题根源
表格位置偏移是两个配置错误导致的:
- 参数用混了:代码块里的
fig.cap、fig.pos、fig.align都是只对图片生效的参数,modelsummary生成的是LaTeXtable浮动环境,这些参数对表格完全无效,还会让bookdown误判代码块的输出类型,打乱浮动排版规则。 - 表格本身没设固定位置:你虽然在YAML里加载了
float包、开了floatsintext: yes,但没有给表格浮动环境指定H位置说明符,LaTeX会按默认的排版优化规则移动表格位置,就会出现表格跑到上一节下方的问题。普通图片因为你正确设置了fig.pos="H",所以位置正常。
修复步骤
- 清理表格代码块的无效参数
删掉两个回归表格代码块里的fig.cap、fig.pos、fig.align、无意义的out.extra=''这类图片专属参数。如果需要bookdown自动给表格编号、支持\@ref(tab:xxx)格式的交叉引用,就把表格标题写到代码块的tab.cap参数里,同时删掉modelsummary()调用里的title参数,避免重复显示标题。 - 给表格加强制位置参数
在modelsummary()的管道链最后加kable_styling(latex_options = "HOLD_position"),这个参数会给生成的LaTeX表格环境加上[H]位置符,强制表格在源码对应的位置输出,不会被LaTeX浮动机制挪走。 - (兜底方案)加浮动屏障
如果修改后还有个别表格偏移,就在YAML的header-includes里加一行\usepackage{placeins},之后在每个章节标题后、表格代码块前插一行\FloatBarrier命令,这个命令会强制所有之前定义的图表浮动体都在屏障位置前排版完成,不会越界跑到后续内容区域。
修改参考
YAML头的header-includes部分调整为:
header-includes: - \usepackage{xcolor} - \usepackage{float} - \usepackage{placeins}
第二个回归表格的代码块参考写法:
{r regression2, echo = F, tab.cap = "Regression 2"} regression2 <- feols(mpg ~ cyl | csw(vs + am, vs^am), mtcars) names(regression2) <- c("Model 1", "Model 2") modelsummary(regression2, coef_omit = "Int", stars = c("***" = 0.01, "**" = 0.05, "*" = 0.1), gof_omit = "IC$|Lik.|RMSE|Std.Errors", coef_rename = c("mpg" = "MPG", "cyl" = "CYL"), gof_map = tribble( ~raw, ~clean, ~fmt, "nobs", "N", 0, "FE: country", "Country fixed effects", 0, "FE: year", "Year fixed effects", 0, "FE: country^year", "Country-year fixed effects", 0, "r.squared", "R2", 2, "adj.r.squared", "R2 Adj.", 2, "r2.within", "R2 Within", 2, "r2.within.adjusted", "R2 Within Adj.", 2 )) %>% footnote(general = "ABC", threeparttable = TRUE) %>% kable_styling(latex_options = "HOLD_position")
第一个回归表格按同样逻辑修改即可。如果不需要做表格交叉引用,也可以保留modelsummary里的title参数,不设置tab.cap,固定位置的效果不会受影响。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

