在Matplotlib的LaTeX渲染模式下定义\widebar命令的方法咨询
Matplotlib LaTeX模式下实现宽横杆的解决方案
问题背景
使用Matplotlib默认数学渲染时,$\widebar{A}$命令可直接使用:
import matplotlib.pyplot as plt plt.plot([1,2]) plt.gca().set_ylabel(r"$\widebar{A}$")
但启用LaTeX渲染(例如需要Palatino作为数学字体)后,该命令失效。LaTeX自带的\overline效果不佳,尝试添加Hendrik Vogt定义的宽横杆代码到Matplotlib预amble时遇到障碍:
- 自定义
.mplstyle文件添加失败,推测#被识别为注释 - 运行时通过
plt.rc设置预amble触发LaTeX解析错误,报错信息如下:
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=latex) restricted \write18 enabled. entering extended mode (../d49352dbf7e233191e06411a7bb3d1ee.tex LaTeX2e <2020-02-02> patch level 2 L3 programming layer <2020-02-14> (/usr/share/texlive/texmf-dist/tex/latex/base/article.cls Document Class: article 2019/12/20 v1.4l Standard LaTeX document class (/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo)) (/usr/share/texlive/texmf-dist/tex/latex/type1cm/type1cm.sty) (/usr/share/texmf/tex/latex/cm-super/type1ec.sty (/usr/share/texlive/texmf-dist/tex/latex/base/t1cmr.fd)) (/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty) (/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty) (/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty (/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty))) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty For additional information on amsmath, use the `?' option. (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty)) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty) (/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty))) Runaway argument? {\makeatletter \@ifpackageloaded {underscore}{}{\usepackage [strings]\ETC. ! File ended while scanning use of \@argdef. <inserted text> \par <*> ../d49352dbf7e233191e06411a7bb3d1ee.tex No pages of output.
解决方案
1. 正确设置运行时LaTeX预amble
Matplotlib支持在预amble中添加复杂LaTeX代码,关键是使用原始字符串保留格式,避免转义错误。以下是集成Hendrik Vogt定义的示例:
import matplotlib.pyplot as plt # 配置LaTeX渲染及自定义宽横杆命令 plt.rcParams.update({ "text.usetex": True, "font.family": "serif", "font.serif": ["Palatino"], "text.latex.preamble": r""" \makeatletter \newcommand{\widebar}[1]{% \hbox{% \vbox{% \hrule height 0.5pt % \kern 0.5ex % \hbox{% \kern -0.1em % \ensuremath{#1}% \kern -0.1em % }% }% }% } \makeatother """ }) # 测试宽横杆效果 plt.plot([1,2]) plt.gca().set_ylabel(r"$\widebar{A}$") plt.show()
三重引号的原始字符串能完整保留LaTeX代码的换行和命令结构,避免解析错误。
2. 自定义.mplstyle文件的正确写法
在样式文件中添加复杂预amble时,需将LaTeX中的#转义为##(避免被识别为注释),并将多行命令合并为一行:
text.usetex: True font.family: serif font.serif: Palatino text.latex.preamble: \makeatletter \newcommand{\widebar}[1]{{\hbox{{\vbox{{\hrule height 0.5pt \kern 0.5ex \hbox{{\kern -0.1em \ensuremath{##1} \kern -0.1em }}}}}}} \makeatother
3. 替代方案:使用现成LaTeX包
若不想自定义命令,可直接使用mathabx包的\widebar命令,只需在预amble中添加包引用:
plt.rcParams.update({ "text.usetex": True, "font.family": "serif", "font.serif": ["Palatino"], "text.latex.preamble": r"\usepackage{mathabx}" })
注意:mathabx会修改部分默认符号样式,需确认是否符合需求。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

