当前位置: 首页 > news >正文

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

💡 导读
在学术论文排版中,你是否遇到过这些诡异现象:Draw.io 里设定的 10pt 字体,插入 LaTeX 后变小了?Matplotlib 导出的图表,缩放后线条粗细与正文不协调?
这一切的罪魁祸首,是TeX pt、PostScript bp 与像素 px 之间的单位混淆。本文用 3 个实验证明差异根源,并给出“所见即所得”的终极修正方案

一、核心结论:三种 “pt” 的真面目

软件/环境显示的单位实际物理含义与英寸的换算
LaTeXptTeX point (真正的 pt)1 inch =72.27pt
PDF / Word / MatplotlibptBig point (bp)1 inch =72bp
Draw.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, 默认 DPI=100)

⚠️关键陷阱:当你在 WPS/PDF 阅读器中看到 “7200 pt” 时,它实际上是7200 bp。而 LaTeX 读取同一个 PDF 时,会将其视为 7200 TeX pt,导致物理尺寸被放大了72.27/72≈1.0037572.27/72 \approx 1.0037572.27/721.00375倍。

二、三个实验验证单位差异

实验 1:LaTeX pt ≠ WPS pt

  1. 在 LaTeX 中插入图片:\includegraphics[width=1.0\textwidth]{fig.pdf}
  2. 编译前输出宽度:\typeout{TEXTWIDTH = \the\textwidth}→ 得到469.75502pt(TeX pt)
  3. 用 WPS 打开生成的 PDF,点击图片查看属性 → 显示468.0pt(实为 bp)
  4. 计算比值:469.755/468.0≈72.27/72469.755 / 468.0 \approx 72.27 / 72469.755/468.072.27/72

实验 2:Draw.io 内部 pt = px

  1. 在 Draw.io 创建 10000×10000 pt 画布,导出 PDF(缩放 100%)
  2. 切换单位验证:
    • pt 模式:10000 × 10000
    • inch 模式:100.000 × 100.000→ 证明100 pt = 1 inch
    • mm 模式:2540.0 × 2540.0→ 与 100 inch = 2540 mm 完全吻合
  3. 结论:Draw.io 的 “pt” 本质是像素,且默认 DPI = 100。

实验 3:各 PDF 查看器的单位混乱

同一份 10000 Draw.io pt (= 7200 bp) 的 PDF,各软件文档属性显示:

查看器显示尺寸是否正确备注
WPS254.068 cm / 7200 ptpt 实为 bp
Chrome2541 mm正确识别 bp
VSCode2,540.7 mm正确识别 bp
Edge3388 mm将 bp 误作 CSS px (96 DPI)

🔍Edge 异常解析:Edge 将 7200 bp 当作 CSS px 处理:7200×9672=9600 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.43388mm

三、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.27100px导出PDFN×72.2772bpLaTeX读取NTeX pt
  • 注:若目标是 WPS/Word,乘数改为100/72≈1.389100/72 \approx 1.389100/721.389

⭐ 方案 B:宽度对齐法(强烈推荐,所见即所得)

适用场景:使用[width=x\textwidth]缩放,要求字体/线宽数值完美还原

  • 前提:Draw.io 画布宽度数值NNN= LaTeX 目标宽度数值(TeX pt)

    📌示例\textwidth= 400 pt,使用[width=0.5\textwidth]→ 目标数值 = 200 → Draw.io 画布宽度设为200

  • 操作:Draw.io 按真实需求设定 → 导出 PDF →\includegraphics[width=0.5\textwidth]{fig.pdf}
  • 原理
    1. 导出 PDF 宽度 =N×72100N \times \frac{72}{100}N×10072bp =N×7272.27N \times \frac{72}{72.27}N×72.2772TeX pt
    2. LaTeX 目标宽度 =NNNTeX pt
    3. 缩放因子 =NN×72/72.27=72.2772\frac{N}{N \times 72/72.27} = \frac{72.27}{72}N×72/72.27N=7272.27
    4. 最终显示 = 设定值×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/722.778英寸

  • 操作
    fig,ax=plt.subplots(figsize=(2.778,2.0))# 宽度精确对齐ax.plot(...,linewidth=1.5)# 设定值即最终 TeX pt 值ax.set_title("Title",fontsize=12)# 12 bp → 缩放后 = 12 TeX ptfig.savefig("fig.pdf",bbox_inches='tight')
http://www.cnnetsun.cn/news/2858712.html

相关文章:

  • Granite Time Series TTM R2 时间序列大模型交通流量预测实战教学
  • 【新版 SeaTunnel Web 最佳实践9】:11 个场景讲清楚 MySQL 到 Oracle 单表同步
  • 【技术干货】深度解析 Frontier Code: AI 代码生成的新基准与可合并性评测
  • Django 框架 深度学习
  • 匠心智造赋能发酵产业 信安诺亮相 2026 第 17 届杭州生物发酵展
  • OpenClaw连接使用chrome浏览器共享缓存cookie的方法
  • 公众号无限回调系统二开实战:破除域名限制的商用 PHP 方案
  • 百度内部启动青木、风雷两大计划,百度大动作该咋看?
  • 从唐诗到商品推荐:我用Neo4j Desktop给电商数据做了个“知识图谱”实验
  • 别再只会用插值了!用PyTorch的PixelShuffle给图像超分换个思路(附代码示例)
  • STM32H7超频到480MHz?聊聊时钟配置里的那些“潜规则”与稳定性测试
  • 告别“啥啥啥”:快速上手Xilinx MMCM原语,搞定多路时钟生成与相位调整
  • 保姆级教程:手把手教你从零写一个Rimworld 1.4 Mod的About.xml配置文件
  • 别再只用默认值了!深入解读达梦DM8的V$CIPHERS加密算法视图
  • 文本任务评估指标选择指南:匹配、生成、排序三类问题的正确解法
  • GPT-4的1.8万亿参数与2%激活率:硬件代价与工程真相
  • STM32项目实战:用NRF24L01+和HAL库DIY一个简易无线遥控器(带按键和LED反馈)
  • 别再让雷劈坏你的设备了!手把手教你为RS485接口选配TVS、GDT和TBU(附IEC标准解读)
  • 当自监督学习遇上OoD检测:不用人工标注,用CSI和SSD算法发现数据中的‘未知数’
  • 别再为PDF乱码发愁!Elsevier投稿时LaTeX的.cls文件保姆级获取指南
  • 警惕技术术语虚构:MCP并非真实存在的LLM通信协议
  • 用Python的tifffile库搞定病理大图:从生成带金字塔的OME-TIFF到用QuPath流畅查看
  • 3Dmax ProOptimizer自动减面脚本避坑指南:解决‘Calculate’不执行和UV丢失问题
  • LCD屏冬天‘拖影’、黑色不纯还漏光?从液晶分子偏转速度聊透这些老毛病
  • STM32H7实战:如何为你的25MHz外部晶振配置出400MHz系统时钟(附性能测试对比)
  • 深入解析NXP LPC3180 ARM9微控制器:架构、外设与嵌入式开发实战
  • YOLOv5车牌识别实战:从CCPD原始数据到训练完成的完整数据流水线搭建
  • 别再手动改Capture.ini了!SPB17.4 CIS库配置保姆级避坑指南(含路径设置详解)
  • 量子支持向量机在雷达微多普勒分类中的应用与优势
  • 年轻星体红外光变研究:27年数据揭示恒星形成奥秘