在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
相关产品推荐
相关产品推荐

