我正在尝试创建一个表格环境,用于捕获相关 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 ===
...
问题:\\
如果使用宏代替结束行的宏,则此方法不起作用\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
会导致稍微不同的错误,但在和下是相同lualatex
的pdflatex
:
...
! 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}