[Fixed]-How can I escape LaTeX special characters inside django templates?

30👍

Alex’s answer including suggestions in code, if you want to copy-paste:

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(str(key)) for key in sorted(conv.keys(), key = lambda item: - len(item))))
    return regex.sub(lambda match: conv[match.group()], text)

See Easiest way to replace a string using a dictionary of replacements? for replacement approach.

👤Mark

5👍

Something like this should do:

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 "&%$#_{}~^\\"]))

Create you own template filter to filter your variables

[edit]:

This was the special characters for ConText, for LaTex, adapt with:

\& \% \$ \# \_ \{ \} \textasciitilde{} \^{} \textbackslash{}
👤Alex

Leave a comment