从Latex代码文件中提取所有Latex命令

时间:2015-03-23 18:22:33

标签: python regex latex

我正在尝试从tex文件中提取所有乳胶命令。我必须使用Python。我尝试使用Re模块在列表中提取latex命令。

问题是此列表不包含名称中包含特殊字符的乳胶命令(例如\ alpha *,\ a',\#,\ $,+,:,\;等)。它只包含由字母组成的乳胶命令。

我目前正在使用re.match python命令:

    "I already know the starting index of '\' which is at self.i.
     The example Latex code string could be:
     \documentclass[envcountsame,envcountchap]{svmono}"

     match_text = re.match("[\w]+", search_string[self.i + 1:])

我能够提取'documentclass'。但是假设有另一个命令,如:

     "\abstract*[alpha]{beta}"
     "\${This is a latex document}"
     "\:" 

如何从这些字符串中仅提取'abstract *','$',':'?

我是Python新手并尝试了各种方法,但无法提取所有这些命令名称。如果有一个普通的python正则表达式可以处理所有这些情况,那将是有用的。

注意:一本名为“不那么简短的LaTeX简介”的书定义了LaTeX命令的格式可以有三种类型 -

  

格式:

  • 他们以反斜杠\开头,然后命名为 只有字母。命令名称由空格,数字或终止 任何其他'非信。'

  • 它们由反斜杠和正好一个非字母组成。

  • “星号变体”中存在许多命令,其中星号附加到命令名称。

2 个答案:

答案 0 :(得分:3)

以下是您的格式规范的确切翻译:

\\(?:[^a-zA-Z]|[a-zA-Z]+)\*?

Demo

  • 非信件:[^a-zA-Z]
  • 或字母:[a-zA-Z]+
  • 已加星标的变体:\*?

如果您的格式描述准确无误,那么应该这样做。不幸的是,我不认识LaTeX,所以我不确定它是否100%正常。


根据评论中的反馈,事实证明星号仅适用于字母命令,并且还可以存在一些其他终止字符。最终的正则表达式是:

\\(?:[^a-zA-Z]|[a-zA-Z]+[*=']?)

答案 1 :(得分:0)

LaTeX是一个TeX宏程序包,因此,适用于TeX的所有内容也适用于LaTeX。

你问的问题很难,因为TeX不是常用语言。如果您只想处理命令,则必须检查\\([A-Za-z]+ *|.|\n)正则表达式(请参阅demo),并注意在TeX中您有活动字符,即唯一存在就像命令一样的字符。如果要处理命令参数,则必须检查各个命令定义,因为TeX是波兰表示法(运算符或命令是前缀,具有可变数量的位置参数)语言。对于参数提取,TeX使用大括号匹配,它不受上下文限制,因此您需要一个完整的解析器。

TeX允许您重新定义所有字符类,因此您可以重新定义数字以充当字母,并可用作命令名称(例如\a23是一个有效的命令名称)(这发生在包内定义,其中@用作字母,以便能够生成用户无法访问但在包内可用的命令)

出于这个原因,消除LaTeX标记是一件困难的事情,您只能获得部分结果。有许多不同的问题需要解决(如何处理\include指令,如何处理\chapter参数或\footnote等参数中的有效文本,您希望包含索引等。 )

此外,您必须小心,就像您尝试消除命令参数一样,您也将删除部分文本(例如\footnote中的文字,\abstract,{{ 1}},\title等)我不知道你真正想要的效果,所以我不能在这方面给你更多的信息。