在 \directlua 中抛出警告

在 \directlua 中抛出警告

我正尝试从内部发出\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 行)。您想将其展开,“就像从宏执行一样”。

说到这,\ExplSyntaxOnany 内部{...}几乎总是错误的:宏 - 为什么 \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一些文档。

相关内容