我正尝试从内部发出\directlua
带有准确行号的 TeX 警告(指向.tex
文档中有问题的行)。
当我使用 lualatex 编译下面的 MWE 时,\TestTex
发出一个正确指向第 40 行的警告。但是,\TestLua
两者\TestLuaIndirect
都发出指向第 1 行的警告。
任何帮助都将不胜感激。谢谢!
\documentclass{article}
\ExplSyntaxOn
\msg_new:nnn { test } { test-warning } { #1 ~ \msg_line_context: }
\NewDocumentCommand { \TestTex } { }
{
\ExplSyntaxOn
\msg_warning:nnn { test } { test-warning } { tex ~ warning }
\ExplSyntaxOff
}
\NewDocumentCommand { \TestLua } { }
{
\directlua
{
tex.sprint('\\ExplSyntaxOn'
.. '\\msg_warning:nnn { test } { test-warning }'
.. '{ lua ~ warning }'
.. '\\ExplSyntaxOff')
}
}
\NewDocumentCommand { \TestLuaIndirect } { }
{
\directlua
{
tex.sprint('\\TestTex')
}
}
\ExplSyntaxOff
\begin{document}
Test.
\TestTex
\TestLua
\TestLuaIndirect
\end{document}
答案1
基本上,sprint
在输入堆栈中创建一个新的“类似文件的层”(假设\input{tmpfile}
执行了 a,警告本身位于临时文件的第 1 行)。您想将其展开,“就像从宏执行一样”。
说到这,\ExplSyntaxOn
any 内部{...}
几乎总是错误的:宏 - 为什么 \makeatletter 在 \newcommand 中不起作用? - TeX - LaTeX Stack Exchange
以下是一个可能的解决方法,用于\futurelet
强制展开输入堆栈,类似于我的问题/答案中的情况luatex - 如何制作从 tex.print tail-recursive 调用的宏? - TeX - LaTeX Stack Exchange。请注意,sprint
必须是最后的一个在\directlua
块中,以使其工作。
\documentclass{article}
\ExplSyntaxOn
\msg_new:nnn { test } { test-warning } { #1 ~ \msg_line_context: }
\NewDocumentCommand { \TestTex } { }
{
\msg_warning:nnn { test } { test-warning } { tex ~ warning }
}
\NewDocumentCommand { \TestLua } { }
{
\directlua
{
tex.sprint('\\ExplSyntaxOn\\def\\tmp{'
.. '\\msg_warning:nnn { test } { test-warning }'
.. '{ lua ~ warning }'
.. '}\\ExplSyntaxOff\\futurelet\\tmpa\\tmp')
}
}
\NewDocumentCommand { \TestLuaIndirect } { }
{
\directlua
{
tex.sprint('\\futurelet\\tmpa\\TestTex')
}
}
\ExplSyntaxOff
\begin{document}
Test.
\TestTex
\TestLua
\TestLuaIndirect
\end{document}
当然缺点是catcode是固定的。
另一种方法是直接打印令牌:
\documentclass{article}
\ExplSyntaxOn
\msg_new:nnn { test } { test-warning } { #1 ~ \msg_line_context: }
\NewDocumentCommand { \TestTex } { }
{
\msg_warning:nnn { test } { test-warning } { tex ~ warning }
}
\NewDocumentCommand { \TestLuaIndirect } { }
{
\directlua
{
token.put_next(token.create('TestTex'))
}
}
\ExplSyntaxOff
\begin{document}
Test.
\TestTex
\TestLuaIndirect
\end{document}
參閱LuaTeX 中的 Lua 部分可以了解标记吗?以及texdoc luatex
一些文档。