从 Lua 发出 \egroup ("}") 时出现问题

从 Lua 发出 \egroup ("}") 时出现问题

我想使用 Lua 定义一个命令,该命令将\savebox根据是否带星号来启动和结束。我们称此命令为\switchcolumn

这是代码(第一个\switchcolumn启动框的代码被文字替换,因为它与问题无关):

\documentclass[11pt, paper = B5]{scrbook}
\usepackage{fontspec}
\usepackage{luacode}
\usepackage{xparse}

\setmainfont{Libertinus Serif}

\begin{luacode}
    dofile(kpse.find_file("mwe.lua"))
\end{luacode}

\NewDocumentCommand{\switchcolumn}{}{\directlua{SwitchColumn()}}

\begin{document}

\newsavebox{\aaa}
\savebox{\aaa}[0.5\textwidth] {
Hello World!
\switchcolumn

\end{document}

mwe.lua

function SwitchColumn()
    tex.cprint(2, "}")
end

它不起作用。结束的花括号没有出现在 TeX 的引擎输入中:

Runaway argument?
{ Hello World! \switchcolumn \par \end {document} 
! File ended while scanning use of \@isavebox.

我试过了tex.print,,tex.sprint都一样。

怎样才能纠正这种情况?

答案1

函数的确切 Lua 形式并不重要,因为在 TeX 扫描参数时不会执行宏和命令,因此会到达文件末尾寻找结束符}并且\switchcolumn永远不会扩展。

您可以使用环境形式,lrbox但它没有宽度参数,因此我重新使用框来\makebox设置宽度。

在此处输入图片描述

Lua(尽管在这里你可以更轻松地使用 tex 定义)

function SwitchColumn()
tex.print('\\end{lrbox}')
end

特克斯

\documentclass[11pt, paper = B5]{scrbook}
\usepackage{fontspec}
\usepackage{luacode}
\usepackage{xparse}

\setmainfont{Libertinus Serif}

% over complicated:
%\begin{luacode}
%    dofile(kpse.find_file("mwe.lua"))
%\end{luacode}
\directlua{require 'mwe'}

\NewDocumentCommand{\switchcolumn}{}{\directlua{SwitchColumn()}}

\begin{document}

\newsavebox{\aaa}
\begin{lrbox}{\aaa}
Hello World!
\switchcolumn


X\makebox[0.5\textwidth]{\unhbox\aaa}X
\end{document}

相关内容