直接从 lua 写入 aux 文件

直接从 lua 写入 aux 文件

是否可以直接从命令内部写入 aux 文件\directlua

我正在将一个较旧的包转换为 LuaLaTeX,它有时会构建一个大字符串并将其写入辅助文件(使用\immediate\write\@auxout ...)。现在使用 lua,构建此字符串更加干净和容易,但我如何将其写入辅助文件?

答案1

您可以通过以下方式写入文件

\directlua{
f=io.open("\jobname.aux2","w")
f:write("\string\\def\string\\hello{zzz}")
f:close()
}

应该可以\openout从 tex 端获取打开的 aux 文件的文件句柄,而不是f像上面那样使用,但我目前没有看到这样的界面,除非我错过了什么……

当然你也可以用以下方法将所有内容推送回 tex

\directlua{
tex.print("\string\\write\string\\@auxout{....}")
}

它完成了工作但并没有真正回答如何从 Lua 编写的问题。

也可以(重新)打开同一个文件进行附加操作,尽管时间有点棘手,

\documentclass{article}


\begin{document}
\section{zzz\label{z}}

\makeatletter
\directlua{
f=io.open("\jobname.aux2","w")
f:write("\string\\def\string\\hello{zzz}")
f:close()
%
%
}
\latelua{
f=io.open("\jobname.aux","a")
f:write("\string\\def\string\\hello{zzz append}")
%
%
}


\section{qqqq\label{q}}


\end{document}

上述操作将以下内容写入.aux文件

\relax 
\newlabel{z}{{1}{1}}
\@writefile{toc}{\contentsline {section}{\numberline {1}zzz}{1}}
\newlabel{q}{{2}{1}}
\@writefile{toc}{\contentsline {section}{\numberline {2}qqqq}{1}}
\def\hello{zzz append}

写的是这样的\def\hello{zzz append},但是毕竟是从那一页开始写的。

它还会写入一个.aux2文件

\def\hello{zzz}

答案2

您可以使用未记录的扩展texio.write:除了传递字符串作为第一个参数外,您还可以传递 TeX 输出文件句柄,例如\the\@auxout

\documentclass{article}


\begin{document}
\section{zzz}\label{z}

\makeatletter
\directlua{
texio.write(\the\@auxout, [[\string\def\string\hello{zzz}]])
}
\latelua{
texio.write(\the\@auxout, [[\string\def\string\hello{zzz append}]])
}
\makeatother

\section{qqqq}\label{q}
\end{document}

指向 aux 文件

\relax 
\def\hello{zzz}\@writefile{toc}{\contentsline {section}{\numberline {1}zzz}{1}\protected@file@percent }
\newlabel{z}{{1}{1}}
\def\hello{zzz append}\@writefile{toc}{\contentsline {section}{\numberline {2}qqqq}{1}\protected@file@percent }
\newlabel{q}{{2}{1}}

相关内容