LaTeX 绘图单位避坑指南:为什么你的 Draw.io / Matplotlib 导入后字体总是不对?

张开发
2026/6/10 12:44:31 15 分钟阅读

分享文章

LaTeX 绘图单位避坑指南:为什么你的 Draw.io / Matplotlib 导入后字体总是不对?
导读在学术论文排版中你是否遇到过这些诡异现象Draw.io 里设定的 10pt 字体插入 LaTeX 后变小了Matplotlib 导出的图表缩放后线条粗细与正文不协调这一切的罪魁祸首是TeX pt、PostScript bp 与像素 px 之间的单位混淆。本文用 3 个实验证明差异根源并给出“所见即所得”的终极修正方案。一、核心结论三种 “pt” 的真面目软件/环境显示的单位实际物理含义与英寸的换算LaTeXptTeX point (真正的 pt)1 inch 72.27ptPDF / Word / MatplotlibptBig point (bp)1 inch 72bpDraw.ioptPixel (px)1 inch 100px (默认DPI) 统一换算基准 1 inch 25.4 mm 72.27 pt (TeX pt) 72 bp (PostScript / PDF / Word / Matplotlib) 100 px (Draw.io pt, 默认 DPI100)⚠️关键陷阱当你在 WPS/PDF 阅读器中看到 “7200 pt” 时它实际上是7200 bp。而 LaTeX 读取同一个 PDF 时会将其视为 7200 TeX pt导致物理尺寸被放大了72.27/72≈1.0037572.27/72 \approx 1.0037572.27/72≈1.00375倍。二、三个实验验证单位差异实验 1LaTeX pt ≠ WPS pt在 LaTeX 中插入图片\includegraphics[width1.0\textwidth]{fig.pdf}编译前输出宽度\typeout{TEXTWIDTH \the\textwidth}→ 得到469.75502pt(TeX pt)用 WPS 打开生成的 PDF点击图片查看属性 → 显示468.0pt(实为 bp)计算比值469.755/468.0≈72.27/72469.755 / 468.0 \approx 72.27 / 72469.755/468.0≈72.27/72✅实验 2Draw.io 内部 pt px在 Draw.io 创建 10000×10000 pt 画布导出 PDF缩放 100%切换单位验证pt 模式10000 × 10000inch 模式100.000 × 100.000→ 证明100 pt 1 inchmm 模式2540.0 × 2540.0→ 与 100 inch 2540 mm 完全吻合结论Draw.io 的 “pt” 本质是像素且默认 DPI 100。实验 3各 PDF 查看器的单位混乱同一份 10000 Draw.io pt ( 7200 bp) 的 PDF各软件文档属性显示查看器显示尺寸是否正确备注WPS254.068 cm / 7200 pt✅pt 实为 bpChrome2541 mm✅正确识别 bpVSCode2,540.7 mm✅正确识别 bpEdge3388 mm❌将 bp 误作 CSS px (96 DPI)Edge 异常解析Edge 将 7200 bp 当作 CSS px 处理7200×96729600 px7200 \times \frac{96}{72} 9600 \text{ px}7200×7296​9600px再转毫米9600×25.496≈3388 mm9600 \times \frac{25.4}{96} \approx 3388 \text{ mm}9600×9625.4​≈3388mm。三、Draw.io → LaTeX 完美导入方案方案 A人工预修正适合固定尺寸插入适用场景不使用[width...]参数希望原始尺寸直接匹配 TeX pt操作Draw.io 中所有尺寸、字体、线宽 ×1.384(100/72.27100/72.27100/72.27)原理链N×10072.27 px→导出PDFN×7272.27 bp→LaTeX读取N TeX ptN \times \tfrac{100}{72.27} \text{ px} \xrightarrow{\text{导出PDF}} N \times \tfrac{72}{72.27} \text{ bp} \xrightarrow{\text{LaTeX读取}} N \text{ TeX pt}N×72.27100​px导出PDF​N×72.2772​bpLaTeX读取​NTeX pt注若目标是 WPS/Word乘数改为100/72≈1.389100/72 \approx 1.389100/72≈1.389⭐ 方案 B宽度对齐法强烈推荐所见即所得适用场景使用[widthx\textwidth]缩放要求字体/线宽数值完美还原前提Draw.io 画布宽度数值NNN LaTeX 目标宽度数值TeX pt示例\textwidth 400 pt使用[width0.5\textwidth]→ 目标数值 200 → Draw.io 画布宽度设为200操作Draw.io 按真实需求设定 → 导出 PDF →\includegraphics[width0.5\textwidth]{fig.pdf}原理导出 PDF 宽度 N×72100N \times \frac{72}{100}N×10072​bp N×7272.27N \times \frac{72}{72.27}N×72.2772​TeX ptLaTeX 目标宽度 NNNTeX pt缩放因子 NN×72/72.2772.2772\frac{N}{N \times 72/72.27} \frac{72.27}{72}N×72/72.27N​7272.27​最终显示 设定值×7272.27×72.2772\times \frac{72}{72.27} \times \frac{72.27}{72}×72.2772​×7272.27​设定值✅优势全局等比缩放字体、线宽自动转换为 TeX pt零手动换算。四、Matplotlib → LaTeX 完美导入方案⚠️单位警告Matplotlib 与 Draw.io 不同figsize单位标准英寸 (inch)fontsize/linewidth单位bp (1/72 inch)⭐ 宽度对齐法所见即所得前提figsize宽度(英寸) ×72 LaTeX 目标宽度数值(TeX pt)示例目标宽度 200 TeX pt →figsize宽度 200/72≈2.778200 / 72 \approx \mathbf{2.778}200/72≈2.778英寸操作fig,axplt.subplots(figsize(2.778,2.0))# 宽度精确对齐ax.plot(...,linewidth1.5)# 设定值即最终 TeX pt 值ax.set_title(Title,fontsize12)# 12 bp → 缩放后 12 TeX ptfig.savefig(fig.pdf,bbox_inchestight)

更多文章