Python избегает обратной косой черты в необработанной строке

Я хочу использовать латекс на своих участках с помощью matplotlib. Пока что это работает, но теперь обратная косая черта усложняет задачу.

Вот что я пробовал:

r'$a_{{\text{{test}}}}$ ({})'.format('foo')
Out[13]: '$a_{\\text{test}}$ (foo)'

Но мой ожидаемый результат

'$a_{\text{test}}$ (foo)'

Я пробовал много возиться с этим, но безрезультатно: экранирование обратной косой черты в необработанной среде естественным образом создает 4 из них. Как получить ожидаемую одинарную обратную косую черту?


То, что принципиально не работает, строит это в matplotlib

import matplotlib.pyplot as plt
plt.plot(np.array([1, 1]), label=r'$a_{{\text{{test}}}}$ ({})'.format('foo'))
plt.legend()

что приводит к следующей ошибке:

RuntimeError: latex was not able to process the following string:
b'$a_{\\\\text{test}}$ (foo)'
Here is the full report generated by latex:
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=latex)
 restricted \write18 enabled.
entering extended mode
(/home/saman/.cache/matplotlib/tex.cache/3d4d47cda002ea7b54e89aca2a4b3fae.tex
LaTeX2e <2017-04-15>
Babel <3.18> and hyphenation patterns for 84 language(s) loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h 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/texlive/texmf-dist/tex/latex/psnfss/helvet.sty
(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty))
(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def))
(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty)
(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty)
(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty)
Package geometry Warning: Over-specification in `h'-direction.
    `width' (5058.9pt) is ignored.
Package geometry Warning: Over-specification in `v'-direction.
    `height' (5058.9pt) is ignored.
)
No file 3d4d47cda002ea7b54e89aca2a4b3fae.aux.
(/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd)
*geometry* driver: auto-detecting
*geometry* detected driver: dvips
(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ot1phv.fd)
! Undefined control sequence.
l.13 ...{10.000000}{12.500000}{\sffamily $a_{\text
                                                  {test}}$ (foo)}
No pages of output.
Transcript written on 3d4d47cda002ea7b54e89aca2a4b3fae.log.

Вы получаете ошибку, заключающуюся в том, что \text не определен, и действительно, он не определен (вы не вызывали amsmath). Возможно, вы хотели \mathrm или \textnormal. См. Также tex.stackexchange.com/q/98406/95042

torek 18.11.2018 12:05

@torek Действительно, это ответ, и его стоит сформулировать как единое целое :)

FooBar 18.11.2018 12:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
734
2

Ответы 2

После форматирования не сырье. Выход в порядке. Попробуйте сохранить это в переменной, а затем распечатать.

s = r"\{}"
print(s)
res = s.format("foo")
print(res)

В качестве альтернативы можно использовать r'string'.decode('string_escape').

Colby Hunter 18.11.2018 11:52

Я обновил вопрос, так как вы предполагаете, что результат в порядке: в целом, matplotlib не нравится строка, поэтому я попытался отладить ее так, как был.

FooBar 18.11.2018 11:57

@FooBar, значит, с латексом что-то не так. вы заметили выход? l.13 ...{10.000000}{12.500000}{\sffamily $a_{\text {test}}$ (foo)}, это правильно? =

Netwave 18.11.2018 12:37

У вас есть только одна обратная косая черта. Я не знаю, как вы смотрите на свою строку, но вывод имеет необработанную строковую нотацию, поэтому вы видите \\. Но это только для демонстрационных целей. Например, вывод также показывает одинарные кавычки ('...'), которые на самом деле также не являются частью вашей строки.

Попробуйте print(r'$a_{{\text{{test}}}}$ ({})'.format('foo')).

Я обновил вопрос, так как вы предполагаете, что результат в порядке: в целом, matplotlib не нравится строка, поэтому я попытался отладить ее так, как был.

FooBar 18.11.2018 11:57

@FooBar Ошибка LaTeX l.13 ...{10.000000}{12.500000}{\sffamily $a_{\text {test}}$ (foo)} показывает, что это действительно \text{test}. Что-то еще не так (например, действительно ли \text{...} действителен LaTeX?).

melpomene 18.11.2018 12:00

Вне python $a_{\text{test}}$ (foo) прекрасно компилируется прямо в латексе. Вы предлагаете мне открыть новый вопрос, посвященный matplotlib?

FooBar 18.11.2018 12:11

@FooBar В этом есть смысл, да.

melpomene 18.11.2018 12:14

Другие вопросы по теме