是否可以通过编程方式在 \makecell 内添加换行符?

是否可以通过编程方式在 \makecell 内添加换行符?

我发现自己处于一种需要在多个实例中动态添加单元格内字符串列表的情况tabular,每个字符串都在自己的行中。为了解决这个问题,我尝试采用以下方法,使用makecellforarray包:

\documentclass{article}
\usepackage{makecell}
\usepackage{forarray}

\begin{document}

\newcommand{\listcontacts}[1]{\ForEach{,}{\scriptsize\textbf{\thislevelitem}\\}{#1}}

\begin{tabular}{ r r }
    \hline
    \textbf{NAME} & \textbf{CONTACT} \\ 
    \hline
    John Doe & \makecell[r]{\listcontacts{Number One,Number Two,Number Three}} \\ % Error: Tried to expand an \endforeachtoken. Something is wrong.
    \hline
\end{tabular}

\listcontacts{Number One,Number Two,Number Three} % renders fine

\end{document}

在此处输入图片描述

如您所见,列表在表格外部呈现正常,但makecell由于以编程方式添加的换行符,列表内部的行为异常,并且受影响的行会抛出错误。使用除换行符以外的任何方式,列表在单元格内部呈现正常。

我已经尝试使用pgfmath另一种迭代方式,以及\StrSubstitutexstring包中直接用换行符替换逗号。即使是命令参数本身中的换行符也无法被正确处理makecell

这让我很疑惑,除了静态添加换行符之外,还有其他方法吗makecell?我该如何实现呢?

答案1

使用 L3\clist_map_inline:nn代替forarray此方法可达到预期效果。问题是 中的每一行都\makecell构成嵌套 中的一个单元格tabular,因此是一个组。 的循环似乎forarray不能很好地处理这个问题。

\documentclass{article}
\usepackage{makecell}

\ExplSyntaxOn
\NewDocumentCommand \listcontacts { m }
  { \clist_map_inline:nn {#1} { \scriptsize \textbf {##1} \\ } }
\ExplSyntaxOff

\begin{document}

\begin{tabular}{ r r }
    \hline
    \textbf{NAME} & \textbf{CONTACT} \\ 
    \hline
    John Doe & \makecell[r]{\listcontacts{Number One,Number Two,Number Three}} \\ % Error: Tried to expand an \endforeachtoken. Something is wrong.
    \hline
\end{tabular}

\listcontacts{Number One,Number Two,Number Three} % renders fine

\end{document}

但这样我们\\在末尾会得到一个额外的内容,这会导致\makecell在底部显示一个空行。为了消除这种情况,我们需要将第一行与其他行(或最后一行,但这将更难实现)区别对待。此外,如果您在 之外使用宏,则会发生tabular泄漏\scriptsize并影响其他内容,因此我们将其放入 的参数中以\textbf使其保持本地状态。

所有东西粘在一起后看起来是这样的:

\documentclass{article}
\usepackage{makecell}

\ExplSyntaxOn
\seq_new:N \l_strikeagainst_contacts_seq
\NewDocumentCommand \listcontacts { m }
  {
    \seq_set_from_clist:Nn \l_strikeagainst_contacts_seq {#1}
    \seq_pop_left:NNT \l_strikeagainst_contacts_seq \l_tmpa_tl
      {
        \textbf { \scriptsize \l_tmpa_tl }
        \seq_map_inline:Nn \l_strikeagainst_contacts_seq
          { \\ \textbf { \scriptsize ##1 } }
      }
  }
\ExplSyntaxOff

\begin{document}

\begin{tabular}{ r r }
    \hline
    \textbf{NAME} & \textbf{CONTACT} \\ 
    \hline
    John Doe & \makecell[r]{\listcontacts{Number One,Number Two,Number Three}} \\ % Error: Tried to expand an \endforeachtoken. Something is wrong.
    \hline
\end{tabular}

\listcontacts{Number One,Number Two,Number Three} % renders fine

\end{document}

在此处输入图片描述

相关内容