Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

\input nested #71

Open
rotcx opened this issue Nov 16, 2023 · 2 comments
Open

\input nested #71

rotcx opened this issue Nov 16, 2023 · 2 comments
Assignees

Comments

@rotcx
Copy link

rotcx commented Nov 16, 2023

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
Copy link
Author

rotcx commented Nov 16, 2023

image

another case

@rotcx
Copy link
Author

rotcx commented Nov 17, 2023

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')) 将合并后的内容写回到原文件。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants