Travis上Bookdown LaTeX编译失败:\includegraphics用px单位报错
解决Bookdown + XeLaTeX编译PDF时的"非法度量单位"错误
问题分析
你遇到的这个错误(! Illegal unit of measure (pt inserted))本质是XeLaTeX不支持将px像素作为图片宽度的单位——虽然PDFLaTeX可能在某些环境下能兼容px,但XeLaTeX(Bookdown默认用于编译UTF-8文档的引擎)对LaTeX原生长度单位的要求更严格。px是屏幕显示单位,并非LaTeX原生支持的长度单位(LaTeX原生支持的是pt、cm、mm、in、\textwidth这类相对/绝对单位)。
解决方案
这里有两种靠谱的解决思路,推荐优先用第一种:
1. 改用LaTeX原生长度单位(最稳妥)
直接把图片的out.width参数从像素单位换成LaTeX支持的单位,推荐使用相对单位(比如\textwidth的比例)来保证PDF在不同页面尺寸下的自适应:
- 比如把
out.width="700px"改成out.width="0.8\textwidth"(表示宽度占页面文本宽度的80%) - 如果一定要用固定宽度,也可以换算成厘米:1px≈0.026458cm,700px≈18.52cm,所以可以写
out.width="18.5cm"
修改后,你的Bookdown代码块应该类似:
{width=0.8\textwidth}
或者用R代码调用的方式:
knitr::include_graphics("images/pasta1.jpg", out.width = "0.8\\textwidth")
(注意在R代码里需要转义反斜杠,写成\\textwidth)
2. 在LaTeX预定义中添加px单位支持(不推荐,仅当必须用px时)
如果你一定要保留px单位,可以在Bookdown的preamble.tex文件中添加以下代码,手动定义px对应的LaTeX长度:
\makeatletter % 定义1px = 1/96英寸(对应屏幕96dpi的标准),1英寸=2.54cm \def\px@unit{0.026458cm} \newlength{\px} \setlength{\px}{\px@unit} % 让graphicx包识别px单位 \DeclareGraphicsOption{width}{\setbox\@tempboxa\hbox{\includegraphics{##1}}\resizebox{#1\px}{!}{\box\@tempboxa}} \makeatother
不过这种方法需要额外配置,而且px作为屏幕单位在PDF中并没有实际意义,所以还是优先推荐第一种方案。
验证你的MWE
把你提供的最小示例中的px单位换成LaTeX原生单位,修改后的代码可以正常编译:
\documentclass[12pt,a4paper]{article} \usepackage{graphicx} \begin{document} \noindent\includegraphics[width=3cm]{example-image-a}\qquad \includegraphics[width=3cm]{example-image-golden}\qquad \includegraphics[width=1.32cm]{example-grid-100x100pt} % 50px ≈ 1.32cm \includegraphics[width=0.8cm]{example-grid-100x100pt} % 30px ≈ 0.8cm \end{document}
内容的提问来源于stack exchange,提问作者Florian Oswald
相关产品推荐
相关产品推荐

