是否可以直接从命令内部写入 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}}