我有以下代码:
\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}