我正在基于 tabularx 开发一个新环境,并使用了一些 luatex 函数。实际上,我有以下代码。
\documentclass[10pt,oneside]{article}
\usepackage{luatextra}
\usepackage{tabularx}
\begin{luacode*}
function fline(value)
n = value
tex.print([[\multicolumn{1}{c}{} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} \\\cline{2-3}]])
end
function nline(input)
n = n+1
tex.print(tostring(n),[[ & ]],input,[[ \\\cline{2-3}]])
end
\end{luacode*}
\newenvironment{calc}[3][A1]{%
\newcolumntype{x}{>{\centering\arraybackslash}X}%
\newcommand{\fline}{\luaexec{fline(0)}}
\newcommand{\nline}[1]{\luaexec{nline(\luastring{##1})}}
\tabularx{#2}{c#3}\fline}{%
\endtabularx}
\begin{document}
\begin{calc}{5cm}{|x|x|}
\nline{a & b}
\nline{c & d}
\end{calc}
问题是\multicolumn{1}{c}{}
infline
函数生成Misplaced \omit
错误。我不太明白为什么以及应该使用哪种代码。感谢您对此提供的任何帮助。
答案1
\directlua
是可扩展的,但\luaexec
通过以下方式定义
> \luacode@execute=\long macro:
#1->\begingroup \escapechar 92 \newlinechar 10 \edef \\{\string \\}\edef ~{\str
ing ~}\let \%=\luacode@percentchar \let \#=\luacode@sharpchar \expandafter \exp
andafter \expandafter \endgroup \luacode@dbg@exec {#1}.
因此在\multicolumn
直接使用原语通常更容易:
\documentclass[10pt,oneside]{article}
%%%\usepackage{luatextra}
\usepackage{tabularx}
\directlua{\unexpanded{%
function fline(value)
n = value
tex.print([[\multicolumn{1}{c}{} & \multicolumn{1}{c}{1} & \multicolumn{1}{c}{2} \\\cline{2-3}]])
end
function nline(input)
n = n+1
tex.print(tostring(n),[[ & ]],input,[[ \\\cline{2-3}]])
end
}}
\newenvironment{calc}[3][A1]{%
\newcolumntype{x}{>{\centering\arraybackslash}X}%
\newcommand{\fline}{\directlua{fline(0)}}
\newcommand{\nline}[1]{\directlua{nline("\luaescapestring{#1}")}}
\tabularx{#2}{c#3}\fline}{%
\endtabularx}
\begin{document}
\begin{calc}{5cm}{|x|x|}
\nline{a & b}
\nline{c & d}
\end{calc}
\end{document}
答案2
这是一个解决方案,其中 (a) 使用\directlua
而不是\luaexec
并且 (b) 不使用[[
and]]
来分隔 Lua 字符串。
\documentclass{article}
\usepackage{luacode}
\usepackage{tabularx}
\begin{luacode*}
function fline(value)
n = tonumber(value)
tex.print("\\multicolumn{1}{c}{} & \\multicolumn{1}{c}{1} & \\multicolumn{1}{c}{2} \\\\\\cline{2-3}")
end
function nline(input)
n = n+1
tex.print(tostring(n),"&",input,"\\\\\\cline{2-3}")
end
\end{luacode*}
\newcolumntype{x}{>{\centering\arraybackslash}X}%
\newcommand{\fline}{\directlua{fline(0)}}
\newcommand{\nline}[1]{\directlua{nline(\luastring{#1})}}
\newenvironment{calc}[3][A1]{%
\tabularx{#2}{c#3}
\fline}{%
\endtabularx}
\begin{document}
\begin{calc}{5cm}{|x|x|}
\nline{a & b}
\nline{c & d}
\end{calc}
\end{document}