- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的情况是我必须为最终用户将 python 表达式转换为 Latex 位图(他们有足够的信心自己编写 python 函数,但更喜欢在 Latex 中观看结果)。
我正在使用 Matplotlib.mathtext 使用以下代码完成这项工作(来自翻译的 latex 原始字符串)。
import wx
import wx.lib.scrolledpanel as scrolled
import matplotlib as mpl
from matplotlib import cm
from matplotlib import mathtext
class LatexBitmapFactory():
""" Latex Expression to Bitmap """
mpl.rc('image', origin='upper')
parser = mathtext.MathTextParser("Bitmap")
mpl.rc('text', usetex=True)
DefaultProps = mpl.font_manager.FontProperties(family = "sans-serif",\
style = "normal",\
weight = "medium",\
size = 6)
# size is changed from 6 to 7
#-------------------------------------------------------------------------------
def SetBitmap(self, _parent, _line, dpi = 150, prop = DefaultProps):
bmp = self.mathtext_to_wxbitmap(_line, dpi, prop = prop)
w,h = bmp.GetWidth(), bmp.GetHeight()
return wx.StaticBitmap(_parent, -1, bmp, (80, 50), (w, h))
#-------------------------------------------------------------------------------
def mathtext_to_wxbitmap(self, _s, dpi = 150, prop = DefaultProps):
ftimage, depth = self.parser.parse(_s, dpi, prop)
w,h = ftimage.get_width(), ftimage.get_height()
return wx.BitmapFromBufferRGBA(w, h, ftimage.as_rgba_str())
EXP = r'$\left(\frac{A \cdot \left(vds \cdot rs + \operatorname{Vdp}\left(ri, Rn, Hr, Hd\right) \cdot rh\right) \cdot \left(rSurf + \left(1.0 - rSurf\right) \cdot ft\right) \cdot \left(1.0 - e^{- \left(\left(lr + \frac{\operatorname{Log}\left(2\right)}{tem \cdot 86400.0}\right)\right) \cdot tFr \cdot 3600.0}\right)}{rc \cdot \left(lr + \frac{\operatorname{Log}\left(2\right)}{tem \cdot 86400.0}\right) \cdot tFr \cdot 3600.0} + 1\right)$'
class aFrame(wx.Frame):
def __init__(self, title="Edition"):
wx.Frame.__init__(self, None, wx.ID_ANY, title=title, size=(600,400),
style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
self.SetBackgroundColour(wx.Colour(255,255,255))
sizer = wx.FlexGridSizer(cols=25, vgap=4, hgap=4)
panel = scrolled.ScrolledPanel(self)
image_latex = LatexBitmapFactory().SetBitmap(panel, EXP)
sizer.Add(image_latex, flag=wx.EXPAND|wx.ALL)
panel.SetSizer(sizer)
panel.SetAutoLayout(1)
panel.SetupScrolling()
app = wx.App(redirect=True, filename="latexlog.txt")
frame = aFrame()
frame.Show()
app.MainLoop()
最佳答案
TL;DR mathtext.py
的下一行有一个错误Line 727 .它涉及大小 Bigg
处的右括号到索引 '\x21'
,但这是感叹号的索引。带有一点上下文的行读取
_size_alternatives = {
'(' : [('rm', '('), ('ex', '\xa1'), ('ex', '\xb3'),
('ex', '\xb5'), ('ex', '\xc3')],
')' : [('rm', ')'), ('ex', '\xa2'), ('ex', '\xb4'),
('ex', '\xb6'), ('ex', '\x21')],
mathtext.py
的本地副本。阅读如下:
_size_alternatives = {
'(' : [('rm', '('), ('ex', '\xa1'), ('ex', '\xb3'),
('ex', '\xb5'), ('ex', '\x28')],
')' : [('rm', ')'), ('ex', '\xa2'), ('ex', '\xb4'),
('ex', '\xb6'), ('ex', '\x29')]
bigg
中替换尺码 -
'\xb5'
和
'xb6'
size=6
重现这个问题使用提供的代码
size = 7
重现“修复” ,但如果我去
size = 8
我可以或更高 - 表明这可能是一个令人讨厌的边缘案例错误,并且可能与系统有关......
matplotlib
唯一的例子产生了一个非常好的
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rc('image', origin='upper')
mpl.rc('text', usetex=True)
DefaultProps = mpl.font_manager.FontProperties(family = "sans-serif",\
style = "normal",\
weight = "medium",\
size = 6)
EXP = r'$\left(\frac{A \cdot \left(vds \cdot rs + \operatorname{Vdp}\left(ri, Rn, Hr, Hd\right) \cdot rh\right) \cdot \left(rSurf + \left(1.0 - rSurf\right) \cdot ft\right) \cdot \left(1.0 - e^{- \left(\left(lr + \frac{\operatorname{Log}\left(2\right)}{tem \cdot 86400.0}\right)\right) \cdot tFr \cdot 3600.0}\right)}{rc \cdot \left(lr + \frac{\operatorname{Log}\left(2\right)}{tem \cdot 86400.0}\right) \cdot tFr \cdot 3600.0} + 10589 \right)$'
plt.title(EXP, fontsize=6)
plt.gca().set_axis_off() # Get rid of the plotting axis for clarity
plt.show()
wxPython
size = 6
上运行良好。 ,但在
size = 3
处再次开始失败.这意味着问题在于其中一个库认为它不能以一定数量的像素呈现元素。
self.parser.to_png('D:\\math_out.png', _s, color=u'black', dpi=150)
mathtext_to_wxbitmap(self, _s, dpi = 150, prop = DefaultProps)
的第一行.这给出了一个不错的输出
png
,让我觉得可能不是 matplotlib 解析器有问题...
编辑 基于
@Baptiste's useful answer ,我对此进行了更多测试。实际上 - 如果我明确传入
fontsize
对于这个调用,我可以复制感叹号的外观。另外,
dpi
传递给这个调用被忽略 - 所以在我的测试中,我实际上处理的是 300 dpi 的图像。所以,重点应该放在
MathTextParser
这可能是 dpi 问题。
print(result)
直接拨打
parseString()
后
here .使用运行良好并打印出文本表示的工作表达式。在错误的场景中,我看到:
Traceback (most recent call last):
File "D:\baptiste_test.py", line 9, in <module>
parser.to_png(filename, s, fontsize=size)
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 3101, in to_
png
rgba, depth = self.to_rgba(texstr, color=color, dpi=dpi, fontsize=fontsize)
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 3066, in to_
rgba
x, depth = self.to_mask(texstr, dpi=dpi, fontsize=fontsize)
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 3039, in to_
mask
ftimage, depth = self.parse(texstr, dpi=dpi, prop=prop)
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 3012, in par
se
box = self._parser.parse(s, font_output, fontsize, dpi)
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 2339, in par
se
print(result[0])
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 1403, in __r
epr__
' '.join([repr(x) for x in self.children]))
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 1403, in __r
epr__
' '.join([repr(x) for x in self.children]))
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 1403, in __r
epr__
' '.join([repr(x) for x in self.children]))
File "C:\Python27\lib\site-packages\matplotlib\mathtext.py", line 1403, in __r
epr__
' '.join([repr(x) for x in self.children]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb3' in position 1:
ordinal not in range(128)
N
的情况下进行复制。 Baptiste 的最小例子中的字母。
print('Getting glyph for symbol',repr(unicode(sym)))
print('Returning',cached_font, num, symbol_name, fontsize, slanted)
_size_alternatives = {
'(' : [('rm', '('), ('ex', '\xa1'), ('ex', '\xb3'),
('ex', '\xb5'), ('ex', '\xc3')],
')' : [('rm', ')'), ('ex', '\xa2'), ('ex', '\xb4'),
('ex', '\xb6'), ('ex', '\x21')], ## <---- Incorrect line.
'\x21'
是错的 - 但我不知道什么是正确的
'\x29'
很接近,但“太弯曲了”。我猜在
'\xc4'
遵循模式,但这是一个向下的箭头。希望其中一位核心开发人员可以根据它呈现的字形轻松查找此数字(十进制 195)并进行更正。
关于python - 为什么 matplotlib 在 latex 表达式中用 "!"替换右括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826091/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!