TeX-рендеринг, фигурные скобки и синтаксис форматирования строк в matplotlib

У меня есть следующие строки для рендеринга аннотаций TeX в моем графике matplotlib:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc

rc('text', usetex=True)
rc('font', family='serif')

voltage = 220

notes = r"\noindent $V_2 = {0:.5} V$".format(voltage)

plt.annotate(notes, xy=(5,5), xytext=(7,7))
plt.show()

Это работает отлично, но мой первый nitpick состоит в том, что V является единицей измерения, поэтому он должен быть в текстовом режиме, а не в (курсивом) математическом режиме. Я пробую следующую строку:

notes = r"\noindent $V_2 = {0:.5} \text{V}$".format(voltage)

Это вызывает ошибку, потому что { фигурные скобки } являются собственностью синтаксиса форматирования строки Python. В приведенной выше строке используется только {0:.5}; {V} рассматривается как чужой. Например:

s1 = "Hello"
s2 = "World!"
print "Some string {0} {1}".format(s1, s2)

должен дать Some string Hello World!.

Как убедиться, что фигурные скобки TeX { } не мешают Python { фигурные скобки }?

Ответ 1

Вам нужно удвоить фигурные скобки, которые нужно обрабатывать буквально:

r"\noindent $V_2 = {0:.5} \text{{V}}$".format(voltage)

Кстати, вы также можете написать

\text V

но лучше всего

\mathrm V

так как единица не является текстовым символом.

Ответ 2

Вы дублируете их:

>>> print '{{asd}} {0}'.format('foo')
{asd} foo