问题可简化为
\documentclass[zihao=-4]{ctexart}
\usepackage{geometry}
\geometry{a4paper,left=25mm,right=25mm,top=25mm,bottom=25mm, headheight=20mm}
\usepackage{expl3}
\usepackage{tabularx}
\usepackage{layouts}
\ctexset{linestretch=1.245, autoindent=2\ccwd}
\begin{document}
\ExplSyntaxOn
\begin{tabular*}{\linewidth}{p{0.25\linewidth}p{0.25\linewidth}p{0.25\linewidth}p{0.25\linewidth}}
\int_step_inline:nn { 4 } { A. 5 \int_compare:nNnTF {#1} = { 4 } { \\ } { & } }
\end{tabular*}
\par
????????
\ExplSyntaxOff
\end{document}
实际还可进一步简化,
\begin{tabular}{l}
A \\ \relax
\end{tabular}
\par
???????
上面这个同样会出现“多余的”空行。
其原因是,\relax
是在表格新的一行中。这个表格实际有两行,只不过第二行是空白行。
回到你的问题,实际上,将 \int_step_inline:nn
相应的换成 \int_step_function:nN
则不会出现多余的空行。
这涉及到 \int_step_inline:nn
的内部实现。
为了能够处理嵌套的 ...inline:nn
情况,有一个专门记录嵌套数的 int,它在一个新的嵌套开始前加1,在嵌套完成后减 1。在你的代码中,嵌套完成时的最后一个记号是 \\
,在这个记号之后,...inline:nn
还会追加一个减 1 的操作,这操作在 LaTeX 看来,语法上并不属于表格的当前行,因为当前行已经在此前的 \\
处结束了,它是下一行的内容。自然就会留下一个空白行。
想要移除这个空白行也很简单,方法也很多,如自己定义一个不追加加一减一操作的 ...inline:nn
:
\cs_set_protected:Npn \my_int_step_inline:nn #1#2
{
\cs_gset:Npn \__my_tmp:w ##1 {#2}
\int_step_function:nN {#1} \__my_tmp:w
}
这是完全可行的(要注意全局定义 \__my_tmp:w
,因为每一个单元格都在一个组中),只是嵌套使用时会有点小问题。
问 同样的列表环境,用硬编码 和 latex3 循环逻辑生成的 item 之间的空白间隔不一致,求大神指导