多列问题

多列问题

我正在基于 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}

相关内容