在下面的 MWE 中,我尝试打印\midrule
表格中的每一行(在我的实际实现中,它可能或可能不会取决于某些代码),但它不会编译。我发现我可以\luadirect
在每一行上使用 调用@
,而且我可以手动调用luadirect
来打印\midrule
。但是数组不允许我通过 机制打印\midrule
?@
怎么luadirect
回事?
编辑:解决方案要求我通过我制作的宏\midrule
进行打印,因为在我的实际实现中,我需要在(可能)打印之前运行一些 Lua 代码 - 为了给出一个最小的例子,这些细节被排除在外。\luadirect
\midruleX
@wipet 的解决方案不适用于\luadirect
并且有其他不良副作用。他们声称\mirdule
必须是 之后的第一件事\cr
,但是,此解决方案似乎通过一些\noalign
和\aftergroup
技巧避免了这种情况:https://tex.stackexchange.com/a/182959/186406
\documentclass[parskip=full]{scrartcl}
\usepackage{array,booktabs,makecell,luacode}
\begin{document}
\def\miduleX{\luadirect{tex.print('\\midrule')}}
% \def\miduleX{\noalign{\luadirect{tex.print('\\aftergroup\\midrule')}}} % this did not solve
\begin{tabular}{l}
Hello \\\miduleX % works via manual usage
\end{tabular}
\begin{tabular}{l@{\luadirect{tex.print('foobar')}}} % tex.print text works
Hello \\
\end{tabular}
\def\foo{bar}
\begin{tabular}{l@{\luadirect{tex.print('\\foo')}}} % tex.print other definitions works
Hello \\
\end{tabular}
{\everycr={\midrule} \toksdef\everycr=0
\begin{tabular}{l} % compiles but is not what I want
Hello \\ % 1) midrule appears on top and bottom, not what I want
\makecell{1\\2}
\end{tabular} % and 2) luadirect not used, and 3) makecell is affected
}
% {\everycr={\midruleX} \toksdef\everycr=0
% \begin{tabular}{l} % proposed solution does not work with my luadirect requirement
% Hello \\
% \end{tabular}
% }
%% this is the interface I want
\begin{tabular}{l@{\miduleX}} % not working
Hello \\
\end{tabular}
\end{document}
答案1
您的\luadirect
在这里无关紧要。您可以直接替换,\midrule
效果\luadirect{tex.print(\\midrule)}
相同。
是\midrule
定义为的宏\noalign{...}
,并且此基元只能放在基元之后\cr
(\halign
即\\
从 LaTeX 的角度来看,在表格环境中之后)。您不能将其放在的序言中\halign
。
如果你确实想要\midrule
在每一个之后\cr
,你可以尝试这个技巧:
{\everycr={\midrule} \toksdef\everycr=0
\begin{tabular}{l} % works
Hello \\
\end{tabular}
}
答案2
\def\midruleXaux{\luadirect{tex.print('\\midrule')}}
\def\miduleX{\aftergroup\aftergroup\aftergroup\midruleXaux}
可以解决问题。不过我不知道怎么做——我希望得到解释。