输入 - 根据内容包含部分文件

输入 - 根据内容包含部分文件

我有一个聊天记录文件(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 解决方案如下:

  1. 将 tex 引擎更改为lualatex,因为此解决方案依赖于一些 lua 代码。
  2. 创建一个 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
  1. 为该函数创建一个 latex 别名
\newcommand{\readchat}[2]{\directlua{readchat(#1, #2)}}
  1. 将文件包含lua在文档开头
\directlua{dofile("chat.lua")}
  1. 搜索匹配项
\readchat{"7/1/21T18:11:46"}{"7/2/21T09:44:20"}

相关内容