当使用 lua 打印时,如果日志文件的当前行尚未终止,则 lua tex 将不会从新行开始。这非常烦人,因为很多时候我搜索要打印的一些调试字符串,它不在新行上,而是在 TeX 打印的一些相当长的行的末尾。
例如,
Printing some debug string 1
[1{C:/Users/Administrator/AppData/Local/MiKTeX/2.9/pdftex/config/pdftex.map}]
[2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]Printing another debug string 2
[14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27]`
代替
Printing some debug string 1
[1{C:/Users/Administrator/AppData/Local/MiKTeX/2.9/pdftex/config/pdftex.map}] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]
Printing another debug string 2
[14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27]
第二种情况是首选情况,但如果我打印换行符,\n
那么我会得到我不想要的不必要的空行。
有什么方法可以解决这个问题?基本上,对于每个条目\directlua
或任何使用的内容,我只想在实际打印某些内容时打印一个新行(这样我就不会得到一堆空白行),甚至更好的是,仅当日志文件不以新行结尾时才打印一个新行。
答案1
使用texio.write_nl(...)
:
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
texio.write_nl("Printing some debug string 1")
\end{luacode*}
foo
\clearpage
\begin{luacode*}
texio.write_nl("Printing some debug string 2")
\end{luacode*}
\end{document}
给出
...
(/opt/texlive2012/texmf-dist/tex/luatex/luatexbase/luatexbase-modutils.sty
(/opt/texlive2012/texmf-dist/tex/luatex/luatexbase/modutils.lua))
(/opt/texlive2012/texmf-dist/tex/luatex/luatexbase/mcb.lua)))) (./test.aux)
Printing some debug string 1 [1{/opt/texlive2012/texmf-var/fonts/map/pdftex/upd
map/pdftex.map}]
Printing some debug string 2 (./test.aux) )
267 words of node memory still in use:
...
在一个项目中,我定义了一个辅助函数:
function w( ... )
texio.write_nl("-----> " .. string.format(...))
end
这样我就可以轻松使用格式化的字符串:
w("Printing some debug string %d",1)
答案2
看起来确实很有效的方法是最初跟踪打印新行:
\let\olddirectlua\directlua
\renewcommand{\directlua}[1]{\olddirectlua{print.FirstNewLine = true #1}}
并重载 print,因此第一次使用时,如果 FirstNewLine 为真(随后将其设为假),它将首先打印一个新行。这只在从 lua 添加文本时才向日志添加一个新行。
print = function (...)
if print.FirstNewLine then rawprint.print("") print.FirstNewLine = false end
rawprint.print(...)
end
(rawprint.print 是原始打印例程)