Bookdown使用自定义csl时kableExtra latex格式表格引文失效问题问询
根本原因
你遇到的问题是引用处理阶段不匹配导致的:
- 你在配置中指定了
csl: nature.csl且citation_package: none,此时引用完全由pandoc-citeproc在markdown解析阶段处理,只会识别markdown格式的[@引用键]语法,且不会处理已经生成的原生LaTeX代码中的内容。 format="latex"的kable输出是原生LaTeX代码块,pandoc-citeproc不会扫描其中的内容,你写的\\cite{xxx}是LaTeX原生引用命令,在citation_package: none的配置下,LaTeX编译阶段也没有对应的引用处理工具对其解析,最终就会显示为[?]。- 而
format="markdown"的kable输出是markdown格式表格,属于pandoc-citeproc的扫描范围,所以里面的[@引用键]可以正常渲染。
可行解决方案
方案1:预渲染引用后插入LaTeX表格(无需修改现有CSL配置)
提前将需要插入表格的引用用pandoc规则渲染为格式化文本,再填入表格内容即可,修改后的表格代码如下:
# 先定义引用渲染函数 render_cite <- function(key) { knitr::knit(text = paste0("@", key), quiet = TRUE) } tibble(`Column 1 Header` = c("Some fairly short text", "More similarly short text"), Column2 = c(paste0("A very very very very very very very very very very long sentence with citation", render_cite("xie2015"), ". And then another fairly wordy sentence."), paste0("A different but also very very very very very very very very long sentence with different", render_cite("R-base"), ". And then another fairly wordy sentence."))) %>% kable(format = "latex", caption = "Table using Latex Option", longtable = TRUE, booktabs = TRUE, escape = FALSE) %>% column_spec(column = 1, width = "5cm") %>% column_spec(column = 2, width = "8cm")
这个方案可以完全保留你现有的CSL配置,也不需要调整其他构建流程,引用格式和文档其他位置完全一致。
方案2:改用biblatex处理引用(适合需要大量LaTeX原生引用的场景)
如果你需要频繁在LaTeX代码块中使用引用,可以放弃pandoc-citeproc的CSL处理,改用biblatex搭配对应nature风格的格式文件:
- 删掉index.Rmd头部的
csl: nature.csl配置 - 修改
_output.yml中pdf_book的配置,将citation_package: none改为citation_package: biblatex - 在preamble.tex中加入配置指定nature风格的biblatex格式:
\usepackage[style=nature, backend=biber]{biblatex} \addbibresource{book.bib} \addbibresource{packages.bib}
- 原有表格中的
\\cite{xxx}语法可以完全保留,编译时会由biblatex直接处理,表格内外的引用格式完全一致。
内容的提问来源于stack exchange,提问作者c_j_fairfield
相关产品推荐
相关产品推荐

