从 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:
它们以反斜杠 \ 开头,然后有一个由以下内容组成的名称
只有字母。命令名称以 space、数字或
任何其他“非字母”。
它们由一个反斜杠和一个非字母组成。
许多命令都以“星号变体”形式存在,其中星号附加到命令名称。
这是您的格式规范的准确翻译:
\(?:[^a-zA-Z]|[a-zA-Z]+)\*?
- 非字母:
[^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.) 我不知道你真正想要得到的效果,所以我不能在这方面给你更多的信息。
我正在尝试从 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:
它们以反斜杠 \ 开头,然后有一个由以下内容组成的名称 只有字母。命令名称以 space、数字或 任何其他“非字母”。
它们由一个反斜杠和一个非字母组成。
许多命令都以“星号变体”形式存在,其中星号附加到命令名称。
这是您的格式规范的准确翻译:
\(?:[^a-zA-Z]|[a-zA-Z]+)\*?
- 非字母:
[^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.) 我不知道你真正想要得到的效果,所以我不能在这方面给你更多的信息。