如何使用 luatex 回调生成输入文件的逐字副本

如何使用 luatex 回调生成输入文件的逐字副本

我正在尝试设计一个 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,我得到:

  1. 预期Example.pdf文件一切正常
  2. 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_fileclose看起来很有希望,但如果我使用这些回调函数,显然我必须提供一个读取器。我希望如果我的钩子返回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}

此外,还有一些代码这里这也许有助于实现你最初的目标。

相关内容