如何更改Plots.jl用于LaTeX字符串的字体包?
解决Plots.jl中\mathcal{I}显示为\mathcal{J}的字体问题
核心问题原因
Plots.jl默认使用的LaTeX字体(如Computer Modern)中,\mathcal{I}的字形设计与\mathcal{J}高度相似,导致视觉上误显示为\mathcal{J}。此外,直接全局设置fontfamily会与LaTeX渲染引擎冲突,引发报错。
解决方案1:局部指定LaTeX字体包(最小侵入)
在需要显示\mathcal{I}的LaTeX字符串中加载calrsfs包,该包的手写体字体中\mathcal{I}为标准竖线带顶杠的样式,完全区分于\mathcal{J}:
using Plots using LaTeXStrings plot([1],[1], ylabel=L"\usepackage{calrsfs}\mathcal{I}")
此方法无需修改全局配置,仅针对单个标签调整,适合已有大量代码的场景。
解决方案2:全局设置LaTeX渲染字体
若需所有LaTeX文本统一使用正确字体,可通过default()设置texfont参数,指定支持标准\mathcal{I}的字体(如cmbright或mathpazo):
using Plots using LaTeXStrings default(texfont="cmbright") # 或 "mathpazo" plot([1],[1], ylabel=L"\mathcal{I}")
全局生效后,所有LaTeX标签都会自动使用指定字体,无需逐个修改。
解决自定义字体与LaTeX冲突的报错问题
之前设置fontfamily="Bookman"或Times Roman报错,是因为全局字体设置仅作用于普通文本,与LaTeX渲染引擎的字体配置不兼容。需分开设置普通文本字体和LaTeX渲染字体:
using Plots using LaTeXStrings # 设置普通文本字体 default(fontfamily="Times Roman") # 设置匹配的LaTeX字体(确保支持标准手写体) default(texfont="times") plot([1],[1], ylabel=L"\mathcal{I}")
注意:不要混用普通字符串与LaTeX字符串拼接(如string("𝓘", L"1")),此类操作会触发渲染冲突,应直接在LaTeX字符串内完成内容编写(如L"\mathcal{I}1")。
内容的提问来源于stack exchange,提问作者Derick Diana
相关产品推荐
相关产品推荐

