R Markdown编译PDF时调用tex文件报\toprule未定义错误求助
报错原因
编译抛出! Undefined control sequence. l.106 \toprule错误,是代码配置存在三个问题共同导致的:
- 命令依赖缺失:
\toprule、\midrule、\bottomrule是LaTeX三线表宏包booktabs定义的专属命令,默认编译环境不自带;表格中大量使用的\num{}数字格式化命令是siunitx宏包提供的,同样没有提前加载。 - 引入路径配置错误:YAML配置中
in_header对应的是LaTeX导言区位置(即\begin{document}标签之前),仅支持放宏包加载、格式定义类命令,不能放表格、正文这类需要出现在正文区的内容。你把存放表格的table1.tex放在in_header下引入,本身就不符合LaTeX文档结构规范,这也是你之前手动在tex文件里加\begin{document}的直接诱因。 - 冗余标签冲突:
table1.tex中写的\begin{document}是多余标签,R Markdown渲染PDF时会自动生成完整的LaTeX文档结构,包含完整的文档类型声明、\begin{document}、\end{document}标签,手动重复添加会造成结构冲突。
解决步骤
- 第一步:修改
table1.tex文件,删掉开头冗余的\begin{document}行,文件仅保留表格本身的代码即可,修正后内容如下:
\begin{table} \centering \begin{tabular}[t]{lccc} \toprule & Model 1 & Model 2 & Model 3\\ \midrule lag(YGrowth, 1) & \num{1.000}(\num{0.000})*** & \num{-0.347}(\num{0.030})*** & \num{-0.436}(\num{0.068})***\\ lag(Inputs, 1) & \num{0.000}(\num{0.000}) & \num{-0.100}(\num{0.127}) & \num{2.321}(\num{1.078})*\\ lag(GDPGR, 1) & \num{0.000}(\num{0.000})* & \num{0.270}(\num{0.069})*** & \num{0.341}(\num{0.531})\\ lag(lnPDENS, 1) & \num{0.000}(\num{0.000}) & \num{-0.124}(\num{0.031})*** & \num{0.158}(\num{0.076})*\\ lag(GRRAT, 1) & \num{0.000}(\num{0.000}) & \num{-0.280}(\num{0.095})** & \num{0.858}(\num{0.378})*\\ lag(EMPGR, 1) & \num{0.000}(\num{0.000})* & \num{0.317}(\num{0.138})* & \num{0.708}(\num{1.571})\\ \midrule Num.Obs. & \num{1070} & \num{1025} & \\ R2 & \num{1.000} & \num{0.141} & \\ R2 Adj. & \num{1.000} & \num{0.076} & \\ AIC & \num{-79950.8} & \num{-2904.1} & \\ BIC & \num{-79781.6} & \num{-2911.2} & \\ RMSE & \num{0.00} & \num{0.06} & \\ \bottomrule \end{tabular} \end{table}
- 第二步:修正R Markdown的YAML头配置,一是把表格文件的引入位置从
in_header改为before_body(对应正文开头位置),二是添加缺失的宏包加载声明,修正后的YAML如下:
--- title: "Ag Productivity" author: "Abdullah Mamun" date: '2022-06-23' output: pdf_document: includes: before_body: "table1.tex" header-includes: - \usepackage{booktabs} - \usepackage{siunitx} ---
如果你不想修改YAML的宏包配置,也可以直接在table1.tex的最开头(表格代码之前)加上两行宏包加载语句,效果一致:
\usepackage{booktabs} \usepackage{siunitx}
- 第三步:清理编译缓存,重新渲染R Markdown文件即可正常生成PDF。
补充说明
- 如果你需要把表格放到文档的指定位置,不建议用
includes方式引入,直接把LaTeX表格代码粘贴到R Markdown文档对应位置即可,排版更灵活。 - 后续遇到同类LaTeX编译报
Undefined control sequence错误时,优先检查报错指向的未知命令所属的宏包,提前通过header-includes加载对应宏包,就能解决绝大多数同类问题。
内容的提问来源于stack exchange,提问作者Abdullah Mamun
相关产品推荐
相关产品推荐

