2013-04-28 43 views
9

Tôi có django mẫu này mà tôi sử dụng để tạo ra các file LaTeXLàm cách nào để thoát khỏi các ký tự đặc biệt của LaTeX bên trong các mẫu django?

\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} 

Nhưng tôi không có các cột rất lớn để họ có thể chứa bất kỳ ký tự đặc biệt trong đó. Tôi gặp lỗi khi tạo tệp pdf.

Làm cách nào để thoát khỏi tất cả văn bản trong tất cả các cột?

Trả lời

3

Something như thế này nên làm:

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

Tạo bạn mẫu bộ lọc riêng để lọc các biến của bạn

[sửa]:

Đây là ký tự đặc biệt cho bối cảnh, cho LaTex, điều chỉnh với:

\& \% \$ \# \_ \{ \} \textasciitilde{} \^{} \textbackslash{} 
+1

đừng quên cũng bao gồm r '\ textgreater' r '\ textless' – blueberryfields

+0

hoặc r '\ ensuremath {<}' và r '\ ensuremath {>}' – sastanin

14

Câu trả lời của Alex bao gồm các đề xuất trong mã, nếu bạn muốn o sao chép-dán:

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) 

Xem Easiest way to replace a string using a dictionary of replacements? để tiếp cận thay thế.

+0

Cảm ơn bạn đã viết mã! Tôi nghĩ rằng cũng nên có một không gian sau khi '\ textless' và' \ textgreater'. Tôi nhận được "chuỗi điều khiển không xác định" vì '

+0

Điều này thật tuyệt vời, cảm ơn! – ikku100

Các vấn đề liên quan