我正在尝试设计一个 LuaTeX 解决方案来解决这个问题将指定环境中的文本内容提取到新文件中,但事情变得比想象的还要困难。
首先,我需要解决一个看起来很简单但我无法正确解决的问题。我想使用一些 LuaTeX 回调或钩子将主文档文件每一行的副本转储到文件中。
process_input_buffer
我的第一个方法是使用以下代码来挂钩:
-- luafuncions.lua
f = io.open(tex.jobname .. "-copy.tex", "w")
letpass = function(line)
f:write(line.."\n")
return nil
end
callback.register("process_input_buffer",letpass)
当我使用以下 tex 文档时:
\directlua{dofile("luafunctions.lua")}
% Example.tex
\documentclass{article}
\usepackage{fontspec}
\usepackage{lipsum}
\begin{document}
1. \lipsum[1]
2. \lipsum[2]
3. \lipsum[3]
\end{document}
并通过编译它lualatex
,我得到:
- 预期
Example.pdf
文件一切正常 Example-copy.tex
我期望包含副本的文件Example.tex
(可能除了第一行)
然而,我得到了一个 1.4Mb 的文件(哇!),它的开头和结尾是:
% Example.tex
\documentclass{article}
\usepackage{fontspec}
%%
%% This is file `article.cls',
%% generated with the docstrip utility.
%... 33750 lines omitted
\begin{document}
%... 4874 lines omitted
1. \lipsum[1]
2. \lipsum[2]
3. \lipsum[3]
\end{document}
\relax
因此,有点起作用了:-) 但我猜测正在发生的事情是,从、、.cls
等读取的所有行...也正在由回调处理,因此它们被转储。.sty
.def
.aux
我想避免这种情况。所以我希望我可以将其他回调挂接到外部文件打开(和关闭)的事件上,并设置一个布尔值以让我的函数知道它不应该写入这些部分。
但是我搞不清楚哪个回调函数可以用于实现这一点。回调函数open_read_file
和close
看起来很有希望,但如果我使用这些回调函数,显然我必须提供一个读取器。我希望如果我的钩子返回nil
,那么将使用默认读取器,但事实并非如此。
这个问题有简单的解决办法吗?
答案1
您可以在没有回调的情况下执行此操作,但出于某种原因,也许您需要回调。如果没有,则以下方法有效(据我所知):
--luafunctions.lua
myout = io.open(tex.jobname.."-copy.tex", "w")
myin = io.open(tex.jobname..".tex", "r")
for line in myin:lines() do
myout:write(line.."\n")
end
myout:close()
myin:close()
和你的主体一起.tex
。
\directlua{dofile("luafunctions.lua")}
\documentclass{article}
\usepackage{fontspec}
\usepackage{lipsum}
% Example.tex
\begin{document}
1. \lipsum[1]
2. \lipsum[2]
3. \lipsum[3]
\end{document}
此外,还有一些代码这里这也许有助于实现你最初的目标。