我无法使用(令人惊奇的)expl3
带有表格环境的包。具体来说,当我使用 创建行时,我的表格中会出现一个完整的额外行\seq_map_inline
。我可以通过不在最后一行中包含 来避免这种行为\cr
(在下面的 MWE 中,这将涉及更多代码行,但在原始用法中并不是什么大问题),然后逐字包含 \cr。在 MWE 中,我故意删除了很多空格“以防万一”,但这并没有改变任何东西(除了让它更难阅读,抱歉)。另一个修复可能是插入负间距,如这个问题,但我很困惑为什么内核要插入某物放入我的表格中(它至少不占用水平空间,通过在Hi
前面添加一个来查看\end{tabular}
)。
坏了但应该是正确的
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand \myTable {m} {
\seq_set_split:Nnn \l_tmpa_seq {,} {#1}
\begin{tabular}{|c|c|}\seq_map_inline:Nn \l_tmpa_seq {Entry&##1\cr}\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\myTable{A,B,C,D}
\end{document}
有效但更复杂
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand \myTable {m} {
\seq_set_split:Nnn \l_tmpa_seq {,} {#1}
\int_zero:N \l_tmpa_int
\begin{tabular}{|c|c|}
\seq_map_inline:Nn \l_tmpa_seq {Entry&##1
\int_gincr:N \l_tmpa_int
\int_compare:nNnTF{\l_tmpa_int}={\seq_count:N\l_tmpa_seq}{}{\cr}
}
\cr
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\myTable{A,B,C,D}
\end{document}
答案1
问题是,该操作在最后一个\\
(或\cr
)之后留下了一些东西,从而启动了一个新单元(尽管不产生输出)。因此,以这种方式在内部进行操作tabular
(又名\halign
)内部以这种方式操作是危险的;您最好在标记列表变量中构建表并传递它:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand \myTable {m}
{
\seq_set_split:Nnn \l_tmpa_seq {,} {#1}
\tl_set:Nn \l_tmpa_tl { \begin{tabular}{|c|c|} }
\seq_map_inline:Nn \l_tmpa_seq
{
\tl_put_right:Nn \l_tmpa_tl { Entry & ##1 \\ }
}
\tl_put_right:Nn \l_tmpa_tl { \end{tabular} }
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\myTable{A,B,C,D}
\end{document}
答案2
当您对行使用显式函数而不是内联函数时,问题就消失了。(顺便说一句,在这种情况下,可以从宏中取出函数,但我更喜欢在本地使用它。)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand \myTable {m} {
\newcommand{\myrow}[1]{Entry&##1\cr}
\seq_set_split:Nnn \l_tmpa_seq {,} {#1}
\begin{tabular}{|c|c|}\seq_map_function:NN \l_tmpa_seq \myrow \end{tabular}
}
\ExplSyntaxOff
\begin{document}
\myTable{A,B,C,D}
\end{document}