SUSYUSTC / MathTranslate

translate scientific papers in latex, especially arxiv papers
https://github.com/SUSYUSTC/MathTranslate
Apache License 2.0
1.03k stars 69 forks source link

\input nested #71

Open rotcx opened 8 months ago

rotcx commented 8 months ago

image

def merge_complete(tex):
    '''
    for replace all \input commands by the file content
    '''
    path = f'{tex}.tex'
    dirname = os.path.dirname(path)
    encoding = get_file_encoding(path)
    content = open(path, encoding=encoding).read()
    content = remove_tex_comments(content)
    pattern_input = re.compile(r'\\input{(.*?)}')
    while True:
        result = pattern_input.search(content)
        if result is None:
            break
        begin, end = result.span()
        match = result.group(1)
        filename = os.path.join(dirname, match)
        if os.path.exists(f'{filename}.tex'):
            filename = f'{filename}.tex'
        print('merging', filename)
        assert os.path.exists(filename)
        encoding = get_file_encoding(filename)
        new_content = open(filename, encoding=encoding).read()
        new_content = remove_tex_comments(new_content)
        content = content[:begin] + new_content + content[end:]
    print(content, file=open(path, "w", encoding='utf-8'))

函数解析 该函数的主要目标是将LaTeX文档中的\input命令替换为对应文件的内容,也就是说,它将所有被\input的文件内容合并到主tex文件中。

  1. 函数定义 函数merge_complete(tex)接收一个参数tex,这个参数应该是一个不包含扩展名的LaTeX文件名。

  2. 函数实现 首先,函数通过os.path.dirname(path)获取主tex文件的目录名,然后通过get_file_encoding(path)获取文件的编码方式。

然后,函数打开主tex文件,并读取其内容。同时,它使用remove_tex_comments(content)函数移除了文件中的所有LaTeX注释。

接着,函数使用正则表达式re.compile(r'\input{(.*?)}')匹配所有的\input命令。

在一个无限循环中,函数搜索第一个\input命令。如果找不到\input命令,就跳出循环。

如果找到了\input命令,函数就获取该命令的位置(begin和end),以及\input命令中的文件名(match)。

函数检查\input命令中的文件是否存在。如果存在,就打开该文件,并读取其内容。同时,它使用remove_tex_comments(new_content)函数移除了文件中的所有LaTeX注释。

最后,函数将\input命令替换为对应文件的内容,然后继续查找下一个\input命令。

当所有的\input命令都被替换后,函数将合并后的内容写入主tex文件。

  1. 注意事项 这个函数假设所有的\input命令都在主tex文件的同一目录或其子目录中。

这个函数不会处理\input命令中的相对路径。例如,如果\input命令中的文件名是../other.tex,函数将无法正确地找到该文件。

这个函数不会处理嵌套的\input命令。例如,如果一个被\input的文件中还包含\input命令,这个函数将无法正确地处理这种情况。

这个函数不会处理\include命令,这是LaTeX中另一种包含文件的命令。

rotcx commented 8 months ago

image

another case

rotcx commented 8 months ago
def merge_complete(tex):
    '''
    for replace all \input commands by the file content
    '''
    path = f'{tex}.tex'
    dirname = os.path.dirname(path)
    encoding = get_file_encoding(path)
    content = open(path, encoding=encoding).read()
    content = remove_tex_comments(content)
    pattern_input = re.compile(r'\\input{(.*?)}')
    while True:
        result = pattern_input.search(content)
        if result is None:
            break
        begin, end = result.span()
        match = result.group(1)
        filename = os.path.join(dirname, match)
        if os.path.exists(f'{filename}.tex'):
            filename = f'{filename}.tex'
        print('merging', filename)
        assert os.path.exists(filename)
        encoding = get_file_encoding(filename)
        new_content = open(filename, encoding=encoding).read()
        new_content = remove_tex_comments(new_content)
        content = content[:begin] + new_content + content[end:]
    print(content, file=open(path, "w", encoding='utf-8'))

将LaTeX文件中的\input{}命令替换为被引用文件的内容,即将所有被\input{}引用的文件内容合并到主文件中。

详细解释:

def merge_complete(tex): 定义了一个名为merge_complete的函数,它接受一个参数tex,这个参数应该是一个LaTeX文件的名称(不包括.tex扩展名)。

path = f'{tex}.tex' 将输入的文件名与.tex扩展名结合,形成完整的文件路径。

dirname = os.path.dirname(path) 获取文件所在的目录。

encoding = get_file_encoding(path) 使用get_file_encoding函数(在代码中未给出)获取文件的编码。

content = open(path, encoding=encoding).read() 打开文件,并以相应的编码读取文件内容。

content = remove_tex_comments(content) 使用remove_tex_comments函数(在代码中未给出)移除文件内容中的LaTeX注释。

pattern_input = re.compile(r'\input{(.*?)}') 使用正则表达式匹配\input{}命令。

while True: 循环直到没有\input{}命令。

result = pattern_input.search(content) 在文件内容中搜索\input{}命令。

if result is None: 如果没有找到\input{}命令,就跳出循环。

begin, end = result.span() 获取\input{}命令在文件内容中的位置。

match = result.group(1) 获取\input{}命令中的文件名。

filename = os.path.join(dirname, match) 将目录名和文件名结合,形成完整的文件路径。

if os.path.exists(f'{filename}.tex'): 如果文件存在,就添加.tex扩展名。

assert os.path.exists(filename) 确保文件存在。

new_content = open(filename, encoding=encoding).read() 读取被\input{}引用的文件内容。

new_content = remove_tex_comments(new_content) 移除文件内容中的LaTeX注释。

content = content[:begin] + new_content + content[end:] 将\input{}命令替换为被引用文件的内容。

print(content, file=open(path, "w", encoding='utf-8')) 将合并后的内容写回到原文件。