Как я могу избежать специальных символов LaTeX внутри шаблонов Django?
У меня есть этот шаблон Django, который я использую для создания файлов LaTeX
\documentclass[11pt]{report}
\begin{document}
\begin{table}
\centering
\begin{tabular}{lcr}
\hline
{% for col in head %}
\textbf{ {{col}} }
{% if not forloop.last %}
&
{% endif %}
{% endfor %}
\\
\hline
{% for row in table %}
{% for cell in row %}
{% if not forloop.last %}
&
{% endif %}
{% endfor %}
\\
{% endfor %}
\hline
\end{tabular}
\caption{Simple Phonebook}
\label{tab:phonebook}
\end{table}
\end{document}
Но мое количество столбцов очень большое, поэтому в них могут содержаться любые специальные символы. Я получаю ошибку при создании PDF-файла.
Как я могу избежать всего текста во всех столбцах?
2 ответа
Ответ Алекса, включая предложения в коде, если вы хотите скопировать и вставить:
import re
def tex_escape(text):
"""
:param text: a plain text message
:return: the message escaped to appear correctly in LaTeX
"""
conv = {
'&': r'\&',
'%': r'\%',
'$': r'\$',
'#': r'\#',
'_': r'\_',
'{': r'\{',
'}': r'\}',
'~': r'\textasciitilde{}',
'^': r'\^{}',
'\\': r'\textbackslash{}',
'<': r'\textless{}',
'>': r'\textgreater{}',
}
regex = re.compile('|'.join(re.escape(unicode(key)) for key in sorted(conv.keys(), key = lambda item: - len(item))))
return regex.sub(lambda match: conv[match.group()], text)
См. Самый простой способ заменить строку, используя словарь замен? для замены подход.
Нечто подобное должно сделать:
CHARS = {
'&': r'\&',
'%': r'\%',
'$': r'\$',
'#': r'\#',
'_': r'\letterunderscore{}',
'{': r'\letteropenbrace{}',
'}': r'\letterclosebrace{}',
'~': r'\lettertilde{}',
'^': r'\letterhat{}',
'\\': r'\letterbackslash{}',
}
print("".join([CHARS.get(char, char) for char in "&%$#_{}~^\\"]))
Создайте свой собственный шаблонный фильтр для фильтрации ваших переменных
[редактировать]:
Это были специальные символы для ConText, для LaTex, адаптированные с помощью:
\& \% \$ \# \_ \{ \} \textasciitilde{} \^{} \textbackslash{}