尝试捕获单元格内容时,表格行尾 \\ 宏失败

尝试捕获单元格内容时,表格行尾 \\ 宏失败

我正在尝试创建一个表格环境,用于捕获相关 Lua 模块的表格单元格内容。然后,Lua 模块将重新格式化表格数据并导出为 C/C++ 和 VHDL 源文件,以最大限度地减少 pdf 设计规范中的转录错误。

此示例前言定义了几个宏来捕获单元数据:

\documentclass{article}

\usepackage{array}
\usepackage{luacode}

%
% Capture a tablular cell's contents.
% The \endCell token serves as an end-of-cell marker and is never defined.
%
\long\def\startCell#1\endCell{%
    % This normally calls a function in a separate Lua module.
    % Just print the cell contents to stdout for this example.
    \luadirect{print("Cell ***" .. [==[#1]==] .. "***")}%
    % Then put the original cell contents back into the TeX stream.
    #1%
}

%
% This macro normally calls a Lua function in a separate module to process the
% cell data captured in the current row. Print to stdout for testing instead.
%
\newcommand\processRow{\luadirect{print("=== End of row ===")}}

然后,表格环境(使用array包)捕获第 2 列和第 3 列:

\begin{document}

\begin{tabular}{
    l % Don't capture data from the first column.
    >{\startCell}l<{\endCell}
    >{\startCell}l<{\endCell\processRow}
}
    1 & 2 & 3 \cr
    4 & 5 & 6 \cr
    7 & 8 & 9 \cr
\end{tabular}

\end{document}

处理lualatex显示终端中第 2 列和第 3 列的预期单元格捕获:

...
Cell ***\ignorespaces 2 \unskip ***
Cell ***\ignorespaces 3 \unskip ***
=== End of row ===
Cell ***\ignorespaces 5 \unskip ***
Cell ***\ignorespaces 6 \unskip ***
=== End of row ===
Cell ***\ignorespaces 8 \unskip ***
Cell ***\ignorespaces 9 \unskip ***
=== End of row ===
...

pdf 输出中的表格也是正确的:
pdf 输出

问题:\\如果使用宏代替结束行的宏,则此方法不起作用\cr。使用表体

    1 & 2 & 3 \\
    4 & 5 & 6 \\
    7 & 8 & 9 \\

捕获一个单元,但随后失败:

...
Cell ***\ignorespaces 2 \unskip ***

! Use of \@@array doesn't match its definition.
\@ifnextchar ... \reserved@d =#1\def \reserved@a {
                                                  #2}\def \reserved@b {#3}\f...

l.32     4 &
           5 & 6 \\
?

注释掉\usepackage{luacode}引用\luadirect会导致稍微不同的错误,但在和下是相同lualatexpdflatex

...
! Misplaced \cr.
\reserved@c ->\ifnum 0=`{}\fi \cr 

l.32     4 &
           5 & 6 \\
? 

使用类似但非捕获表格前导不会产生错误:

    l
    >{\relax}l<{\relax}
    >{\relax}l<{\relax}

版本lualatex如下:

$ lualatex --version
This is LuaTeX, Version 1.07.0 (TeX Live 2018)

使用\cr此方法结束行可能适用于此应用程序,但为什么此单元格捕获逻辑会破坏\\宏?有没有更好的方法来捕获 Lua 脚本的表格单元格数据?

答案1

我很乐意删除它,但使用collcell似乎可以解决你的问题。

\documentclass{article}
\usepackage{array}
\usepackage{collcell}
\usepackage{luacode}
\newcommand\processRow{\luadirect{print("=== End of row ===")}}
\newcommand\mymacroE[1]{\luadirect{print("Cell ***" .. [==[#1]==] .. "***")}#1}
\newcommand\mymacroF[1]{\mymacroE{#1}\processRow}
\newcolumntype{E}{>{\collectcell\mymacroE}c<{\endcollectcell}}
\newcolumntype{F}{>{\collectcell\mymacroF}c<{\endcollectcell}}
\begin{document}
\begin{tabular}{
    l % Don't capture data from the first column.
    EF
}
    1 & 2 & 3 \\
    4 & 5 & 6 \\
    7 & 8 & 9 \\
\end{tabular}
\end{document}

相关内容