引用TeX输入的字符串

时间:2013-02-14 12:33:37

标签: python string tex quoting

我正在编写一个Python脚本,它将纯文本作为输入并生成 LaTeX代码作为输出。在某些时候,脚本必须引用所有 在TeX中具有特殊含义的字符,例如%&\等等 上。

这比我预期的要困难。目前我有这个:

def ltx_quote(s):
    s = re.sub(r'[\\]', r'\\textbackslash{}', s)
    # s = re.sub(r'[{]', r'\\{{}', s)
    # s = re.sub(r'[}]', r'\\}{}', s)
    s = re.sub(r'[&]', r'\\&{}', s)
    s = re.sub(r'[$]', r'\\${}', s)
    s = re.sub(r'[%]', r'\\%{}', s)
    s = re.sub(r'[_]', r'\\_{}', s)
    s = re.sub(r'[\^]', r'\\^{}', s)
    s = re.sub(r'[~]', r'\\~{}', s)
    s = re.sub(r'[|]', r'\\textbar{}', s)
    s = re.sub(r'[#]', r'\\#{}', s)
    s = re.sub(r'[<]', r'\\textless{}', s)
    s = re.sub(r'[>]', r'\\textgreater{}', s)
    return s

问题是{}字符,因为它们可能是由早期替换(\ - &gt; \textbackslash{})产生的,在这种情况下不应该&#39被替换。我认为解决方案是一步完成所有替换,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:3)

也许尝试使用未记录的re.Scanner

import re
scanner = re.Scanner([
    (r"[\\]", r'\\textbackslash{}'),
    (r"[{]", r'\\{{}'),
    (r"[}]", r'\\}{}'), 
    (r".", lambda s, t: t)
])

tokens, remainder = scanner.scan("\\foo\\{bar}")
print(''.join(tokens))

产量

\\textbackslash{}foo\\textbackslash{}\\{{}bar\\}{}

与您发布的代码不同,如果您查看the source code,则re.Scanner.scan只能通过字符串进行一次传递。一旦匹配,下一场比赛将从最后一场比赛结束开始。

re.Scanner的第一个参数是lexicon - 一个包含2元组的列表。每个2元组都是正则表达式和动作。该操作可以是字符串,可调用(函数)或None(无操作)。

模式都被编译成一个复合模式。因此,词典中列出模式的顺序非常重要。第一个匹配胜利的模式。

如果匹配,则在可调用时调用操作,或者在字符串时返回操作。返回值收集在列表tokens中。