我想使用 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}