lualatex 打印、directlua env 和换行符

lualatex 打印、directlua env 和换行符

当使用 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 是原始打印例程)

相关内容