来自命令的“内联”数组数据结构(以逗号分隔)元素的参数?

来自命令的“内联”数组数据结构(以逗号分隔)元素的参数?

我有以下代码:

\documentclass{article}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{ll}
   \toprule
    Operation & List \\
    \midrule
    \texttt{create()} & \textbf{Empty} \\
    \texttt{append(1)}& \textbf{1} \\
    \texttt{append(2)} & 1, \textbf{2} \\
    \texttt{prepend(3)} & \textbf{3}, 1, \textbf{2}\\
    \texttt{insert(1,99)} & 3, \textbf{99}, 1, 2\\
    \bottomrule
\end{tabular}
\end{document}

生成结果:

在此处输入图片描述

我想像这样框住列表的条目:

在此处输入图片描述

(在上面,使用 增加了行距\renewcommand{\arraystretch}{1.3}

有没有办法构建一个执行如下操作的命令:

\inlineArray{element1, element2, ..}

可以像下面这样使用吗?

\inlineArray{1,2,3}\texttt{.append(-99)} = \inlineArray{1,2,3,\textbf{-99}}

在此处输入图片描述

这可能吗?我知道可以在 Tikz 中绘制数组,但我想要一些可以内联使用的东西。有什么想法吗?

答案1

我可以提出如下语法

\inlineArray{1,2,3,*-99}

其中,前导星号表示以粗体显示该项目。还有一个选项可以设置单元格的最小宽度(默认为 1.5em)。

\documentclass{article}
\usepackage{booktabs}

\ExplSyntaxOn

\NewDocumentCommand{\inlineArray}{ O{1.5em} m }
 {% #1 = optional width for all items, #2 = list of items
  \group_begin:
  \setlength{\tabcolsep}{0pt}
  \firstuser_array:nn { #1 } { #2 }
  \group_end:
 }

\seq_new:N \l_firstuser_array_in_seq
\seq_new:N \l_firstuser_array_out_seq

\cs_new_protected:Nn \firstuser_array:nn
 {
  \seq_set_from_clist:Nn \l_firstuser_array_in_seq { #2 }
  \ensuremath{\vphantom{\Big|}}
  \seq_if_empty:NTF \l_firstuser_array_in_seq
   {
    \textbf{Empty}
   }
   {
    \__firstuser_array_process:n { #1 }
   }
 }

\cs_new_protected:Nn \__firstuser_array_process:n
 {
  \seq_set_map:NNn \l_firstuser_array_out_seq \l_firstuser_array_in_seq
   {
    \makebox[\dim_max:nn { #1 } { \width+1em }] { \__firstuser_array_item:n { ##1 } }
   }
  \begin{tabular}{ | *{100}{c|} }
  \hline
  \seq_use:Nn \l_firstuser_array_out_seq { & } \\
  \hline
  \end{tabular}
 }

\cs_new_protected:Nn \__firstuser_array_item:n
 {
  \str_if_eq:eeTF { \str_head:n { #1 } } { * }
   {
    \boldmath $\tl_tail:n { #1 }$
   }
   {
    $#1$
   }
 }

\ExplSyntaxOff



\begin{document}

\begin{tabular}{ll}
   \toprule
    Operation & List \\
    \midrule
    \texttt{create()}     & \inlineArray{} \\
    \texttt{append(1)}    & \inlineArray{*1} \\
    \texttt{append(2)}    & \inlineArray{1, *2} \\
    \texttt{prepend(3)}   & \inlineArray{*3, 1, *2} \\
    \texttt{insert(1,99)} & \inlineArray{3, *-99, 1, 2} \\
\midrule % just to show the option
    \texttt{prepend(3)}   & \inlineArray[3.2em]{*3, 1, *2} \\
    \texttt{insert(1,99)} & \inlineArray[3.2em]{3, *-99, 1, 2} \\
    \bottomrule
\end{tabular}

\bigskip

$\inlineArray{1,2,3}\texttt{.append(-99)} = \inlineArray{1,2,3,*-99}$

$\inlineArray{1,2,3}\texttt{.append(-99)} = \inlineArray[3.2em]{1,2,3,*-99}$

\end{document}

列表以逗号分隔;如果结果项目序列为空,则只\textbf{Empty}传递一个。否则,每个项目都用代码修饰,该代码将生成所需宽度的框(可选参数的值或自然宽度加上 1em,以较大者为准)。然后tabular传递一个。

在此处输入图片描述

答案2

也许是这样的:

\documentclass[a4paper, 11pt]{article}

\ExplSyntaxOn
\NewDocumentCommand \inlineArray { m }
  {
    \clist_set:Nn \l_tmpa_clist { #1 }
    \begin { tabular } { | * { 20 } { c | } }
    \hline
    \clist_use:Nn \l_tmpa_clist { & } \\
    \hline
    \end { tabular }
  }
\ExplSyntaxOff

\begin{document}
\inlineArray{1,2,3}\texttt{.append(99)} = \inlineArray{1,2,3,$\mathbf{-99}$}
\end{document}

上述代码的输出

相关内容