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

Extracting all Latex commands from a Latex code File

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

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

我目前正在使用 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 正则表达式可以处理所有这些情况,那将会很有用。

注意:一本名为 'The Not So Short introduction to LaTeX' 的书定义了 LaTeX 命令的格式可以是三种类型 -

FORMATS:

这是您的格式规范的准确翻译:

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

Demo

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

如果您的格式描述准确无误,就应该这样做。不幸的是,我不知道 LaTeX,所以我不确定它是否 100% OK。


从评论中的反馈来看,星号只适用于字母命令,也可以有一些其他的终止符。最终的正则表达式是:

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

LaTeX 是一个 TeX 宏包,因此,适用于 TeX 的也适用于 LaTeX。

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

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

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

此外,您必须小心,因为如果您试图消除命令参数,您也会消除部分文本(例如 \footnote\abstract 中的文本, \title, \chapter{...}, etc.) 我不知道你真正想要得到的效果,所以我不能在这方面给你更多的信息。