You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在tabularx环境中使用Lua统计行数得到3倍预期值的问题

tabularx统计异常的核心原因

tabularx出现该问题是因为其内部的多轮试排版机制:
tabularx要计算X列的自适应宽度时,不会直接渲染最终表格,而是会把表格内容完整执行多轮(默认至少3轮)试排版,测试不同宽度下的内容溢出情况,算出最合适的X列宽度后才会执行最终渲染。
你在\fundsadd里写的\directlua{rows = rows + 1}命令不属于纯排版内容,会在每一轮试排版的时候都被执行一次:你的表格里有3行\fundsadd,3轮试排就会累计执行9次加法操作,最终统计结果自然是9,而非预期的3。
普通tabular环境没有自适应列宽的试排步骤,表格内容只会执行一次,所以统计逻辑可以正常运行。


修复方案

可以利用tabularx内部的\ifmeasuring@判断标记,该标记在试排版阶段为真,最终渲染阶段为假,仅在最终渲染阶段执行计数即可:
修改后的完整代码如下:

\documentclass{report}

\usepackage{environ}
\usepackage{tabularx}

\NewEnviron{funds}{%
    \directlua{rows = 0}
    
    \begin{tabularx}{2cm}{ |X|c| }
     \BODY
    \end{tabularx}
}

\makeatletter
\newcommand\fundsadd{%
    \ifmeasuring@\else
      \directlua{rows = rows + 1}
    \fi
    a & b \tabularnewline
}
\makeatother

\begin{document}

\begin{funds}
    \fundsadd
    \fundsadd
    \fundsadd
\end{funds}

Number of rows: \directlua{tex.sprint{rows}}

\end{document}

修改后运行得到的行数统计结果为3,符合预期。


内容的提问来源于stack exchange,提问作者w382903

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 03:45:08