我有一个聊天记录文件(chat.tex)
,并且想将其不同部分包含到我的文档的不同部分中。
我可以使用正则表达式或字符串索引提取我想要的相关部分,例如:
聊天文本
% 2021-12-30 00:00:00
First text of the day
% 2021-12-30 00:00:01
Second text of the day
% 2021-12-30 00:00:02
Third text of the day
% 2021-12-30 00:00:03
Fourth text of the day
我想在文档的一部分中包含% 2021-12-30 00:00:01
和之间的所有文本% 2021-12-30 00:00:03
:
Second text of the day
% 2021-12-30 00:00:02
Third text of the day
理想情况下,为了防止对文件的多次读取请求chat.tex
,应该将其内容存储为变量,并从该变量中获取文本。
如果这是 python 的代码:
chat = open("chat.tex", "r").read()
def extract(start, end):
return chat[chat.index(start):chat.index(end)]
extract('% 2021-12-30 00:00:01', '% 2021-12-30 00:00:03')
(这可能部分重复使用正则表达式解析文件并返回第一个匹配项- 但我不明白答案,而且认为它可能非常过时,而且在我的场景中成本高昂。我也不打算根据行号来包含文件\仅输入文件的一部分,而不会丢失 SyncTeX 支持?)
答案1
感谢@user202729 解决方案如下:
- 将 tex 引擎更改为
lualatex
,因为此解决方案依赖于一些 lua 代码。 - 创建一个 lua 函数来读取文件并查找以下行:
-- chat.lua
local f = assert(io.open("chat.tex", "r"))
local chat_file = f:read("*all")
f:close()
function readchat(starts, ends)
i1 = string.find(chat_file, starts) + string.len(starts)
i2 = string.find(chat_file, ends) - 2
sub_content = string.sub(chat_file, i1, i2)
--- tex.print treats the string as one line...
for line in string.gmatch(sub_content,"[^\r\n]*") do
tex.print(line)
end
end
- 为该函数创建一个 latex 别名
\newcommand{\readchat}[2]{\directlua{readchat(#1, #2)}}
- 将文件包含
lua
在文档开头
\directlua{dofile("chat.lua")}
- 搜索匹配项
\readchat{"7/1/21T18:11:46"}{"7/2/21T09:44:20"}