我正在尝试从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命令的格式可以有三种类型 -
格式:
他们以反斜杠\开头,然后命名为 只有字母。命令名称由空格,数字或终止 任何其他'非信。'
它们由反斜杠和正好一个非字母组成。
“星号变体”中存在许多命令,其中星号附加到命令名称。
答案 0 :(得分:3)
以下是您的格式规范的确切翻译:
\\(?:[^a-zA-Z]|[a-zA-Z]+)\*?
[^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
等)我不知道你真正想要的效果,所以我不能在这方面给你更多的信息。