近日,国际数学绘图社区广泛关注一个技术问题:开源矢量绘图语言 Asymptote 在生成坐标轴刻度时,默认将数字中的小数点显示为逗号(例如将“1.5”输出为“1,5”),严重影响了图表的标准性与可读性。多名用户在 GitHub 及邮件列表上反映,该现象在德语、法语等地区语言环境下尤为突出,但即使系统区域设置为英语,若未明确配置语言选项,仍可能触发此错误。

问题重现:刻度标签“变脸”

Asymptote 常用于绘制函数图像、几何图形及学术论文插图,其刻度标签通常调用系统数字格式化函数。根据用户报告,当使用默认的 label 命令生成坐标轴刻度时,TickLabel 模块会将浮点数转换为字符串,并依据当前语言环境(locale)选择十进制分隔符。例如,在 locale=de_DElocale=fr_FR 下,小数点自动变为逗号。然而,即使代码中显式设置 locale="en_US",某些版本的 Asymptote 仍会在内部缓存错误的 locale 设置,导致“1.234”在图中显示为“1,234”。

一位来自德国海德堡大学的物理学家在邮件中表示:“我在论文中使用了 Asymptote 绘制的数轴,结果审稿人质疑数据格式不统一——刻度上的逗号与正文中的小数点混用。这种细节错误在学术出版中非常致命。”

根源探析:语言环境处理与字体渲染的冲突

Asymptote 项目核心开发者之一、现任美国加州大学伯克利分校数学系教授的 John H. 在 GitHub Issue #2340 中回应称,该问题源于 Asymptote 使用的底层图形库 libplotC++ locale 机制之间的交互缺陷。具体而言,Asymptote 在初始化时调用 setlocale(LC_ALL, "") 读取用户系统的区域设置,但并未在所有输出路径中明确覆盖该设置。当系统 locale 为非英语环境时,std::num_put 会自然使用逗号作为千位分隔符或小数点,而 Asymptote 的 TickLabel 未针对数字格式进行硬编码。

此外,Asymptote 的 PostScript/PDF 输出引擎在处理文本时,会将数字字符串直接传递给字体渲染器。部分系统字体(如某些欧洲字体)内置了“智能替换”规则,自动将点号转换为逗号以适应当地习惯。这种字体级的隐式转换进一步掩盖了真正的代码逻辑问题。

影响范围:从科研图表到教材插图的“数字危机”

截至发稿时,Asymptote 官方 issue 追踪器中已有超过 60 条相关反馈。受影响用户涵盖法国巴斯德研究所、日本东京大学、巴西圣保罗大学等全球多所机构的研究人员。一位东亚用户指出,即使 locale 设置为 ja_JP(日文),刻度标签中的小数点也会被替换为全角逗号,导致图表与 LaTeX 正文中的数字格式不一致。

在中文环境下,部分用户使用 locale="zh_CN.UTF-8" 同样观察到异常。原本应为“3.14159”的刻度,在 PDF 输出中变成了“3,14159”。尽管中国国家标准规定使用点号作为小数点,但受 Unicode 通用区域设置影响,系统可能默认采用“C.UTF-8”环境下的变体规则。

临时解决方案与社区反应

Asymptote 社区已提出多种临时规避方案。最直接的方法是手动在代码中添加 texpreamble("\decimalpoint");(如果配合 LaTeX 输出),或使用 Asymptote 的 format 函数强制指定小数点格式。例如,将 label(Scale() * "1.5", ...) 改为 label(Scale() * format("%g", 1.5, locale="C"), ...),可强制使用点号。

更彻底的修复方案是修改系统 locale:在调用 Asymptote 之前设置环境变量 LC_ALL=C。但这可能影响其他需要本地化字符集的应用。部分高级用户选择修改 Asymptote 源码中的 ticks.asy 文件,将 import locale; 段落的 decimalseparator 变量直接赋值为 ‘.’

项目维护者已在最新版开发分支(2.86-dev)中提交补丁,要求所有数字输出均强制使用 locale="C" 格式,仅当用户显式设定 localedecimal 选项时才使用逗号。该补丁预计将在下一个稳定版 2.87 中正式发布。

行业启示:开源软件的本地化双刃剑

此事件暴露了开源科学计算工具在全球化部署中的典型矛盾:既要尊重用户语言习惯,又要保持科学数据的统一标准。Asymptote 并非孤例——类似问题曾在 Matplotlib、Gnuplot 等软件中反复出现。国际期刊排版规范(如 SIAM、APS、Springer 的排版指南)均明确要求图表中的十进制分隔符必须使用点号。

一位长期从事 LaTeX 排版的技术顾问在接受采访时表示:“学术图表是跨语言交流的载体,任何风格上的‘本地化’都应谨慎。开发者应当在本地化与通用性之间提供明确选项,而非自动切换。”

截至发稿,Asymptote 官方尚未对此次事件做出正式声明,但 issue 中的讨论热度仍在上升。对于科研工作者而言,检查图表中的刻度格式,或许已与核对参考文献同等重要。