如何在 LaTeX 中显示数组(如计算机科学中的数据结构,而不是数学版本)?

如何在 LaTeX 中显示数组(如计算机科学中的数据结构,而不是数学版本)?

我发现这非常难以搜索,因为“数组”的数学含义在 LaTeX 文档中更为常见。我本质上想要一行框,我可以在其中输入数字、字符串等。有人能给我指出正确的方向吗?

编辑:

在此处输入图片描述

上面的图片是我正在寻找的东西的一个例子(它不必完全像这样)。

答案1

将某物放入框架中最直接的方法就是\fbox命令。

\documentclass{article}
\begin{document}
  \newcommand{\sep}{\hspace*{.5em}}
  \noindent
  $\fbox{5} \sep \fbox{2} \sep \fbox{7} \sep \fbox{-5} \sep \fbox{16} \sep \fbox{12}$
\end{document}

fboxed 条目

现在看起来不太好看,盒子的大小不同,取决于里面的东西。为了解决这个问题,我们需要额外的宏来确定输入中最长的数字,等等。

最好使用蒂克兹

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
  \begin{tikzpicture}
    \coordinate (s) at (0,0);
    \foreach \num in {5,2,7,-5,16,12}{
      \node[minimum size=6mm, draw, rectangle] at (s) {\num};
      \coordinate (s) at ($(s) + (1,0)$);
    }
  \end{tikzpicture}
\end{document}

在此处输入图片描述

这些框看起来好多了,此外它还为您提供了示例中阴影和括号的选项。看看手册,Tikz 几乎可以做任何事情。

为了完整起见,我将添加一些代码来获得接近您在问题中给出的示例图片的东西。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcounter{nodeidx}
\setcounter{nodeidx}{1}
\newcommand{\nodes}[1]{%
    \foreach \num in {#1}{
      \node[minimum size=6mm, draw, rectangle] (\arabic{nodeidx}) at (\arabic{nodeidx},0) {\num};
      \stepcounter{nodeidx}
    }
}
\newcommand{\brckt}[4]{% from, to, lvl, text
  \draw (#1.south west) ++($(-.1, -.1) + (-.1*#3, 0)$) -- ++($(0,-.1) + (0,-#3*1.25em)$) -- node [below] {#4} ($(#2.south east) + (.1,-.1) + (.1*#3, 0) + (0,-.1) + (0,-#3*1.25em)$) -- ++($(0,#3*1.25em) + (0,.1)$);%
}
\begin{document}
  \begin{tikzpicture}
    \pgftransparencygroup
    \nodes{5,2,7,-5,16,12}
    \endpgftransparencygroup
    \pgfsetstrokeopacity{0.5}
    \pgfsetfillopacity{0.5}
    \pgftransparencygroup
    \nodes{?,?,?,?,?,?}
    \endpgftransparencygroup
    \pgfsetstrokeopacity{.75}
    \pgfsetfillopacity{.75}
    \pgftransparencygroup
    \brckt{1}{6}{0}{size=6}
    \endpgftransparencygroup
    \pgfsetfillopacity{0.5}
    \pgfsetstrokeopacity{0}
    \pgftransparencygroup
    \brckt{7}{12}{0}{free space}
    \endpgftransparencygroup
    \pgfsetstrokeopacity{0.5}
    \pgftransparencygroup
    \brckt{1}{12}{1}{capacity=12}
    \endpgftransparencygroup
  \end{tikzpicture}
\end{document}

这提供了一个\nodes命令,该命令接受数组值列表并相应地创建框。这里使用计数器是为了使标记比使用更新的坐标更容易一些。请注意,当您想要创建一个新数组时,应该重置计数器。该\brckt命令允许绘制一个括号,并将索引从、索引到、级别和要放在括号上的文本作为参数。级别用于确定应在离节点多远的地方绘制括号。使用透明度组是因为我遇到了一些奇怪的问题,无法弄清楚到底发生了什么,所以只是将所有内容包装在一个组中以使其工作。如果有人知道为什么需要这些群组,请添加它并告诉我?

最终结果如下: 使用 Tikz 的完整示例

修复间距和括号位置以完全匹配示例留给读者作为(不太难的)练习。

答案2

这是一个无tikz排版数组的方法。etoolbox包裹提供使用带有一个参数的\docsvlist元素级通用命令来处理逗号分隔值 (CSV) 列表的功能。通过重新定义,您可以修改对每个元素执行的操作。\do\do

在以下最小工作示例中,将\printarray[<width>]{<csv list>}排版<csv list>为数组。该命令首先扫描列表以确定列表中的元素数量。然后,在第二次解析期间,它使用标准 排版每个元素\framebox。可选参数允许修改每个框内容的宽度(默认固定为1em)。

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage{mathtools}% http://ctan.org/pkg/mathtools
\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\begin{document}

\newcounter{listcount} \newcounter{totcount}
%\setlength{\fboxsep}{0.5pt}%

\newcommand{\printarray}[2][1em]{% \printarray[<width>]{<array list>}
  \unskip \setcounter{totcount}{0}% Reset totcount counter
  \renewcommand*{\do}[1]{\stepcounter{totcount}}% Count elements
  \docsvlist{#2}% Process list a first time to obtain # of elements
  \setcounter{listcount}{0}% Reset listcount counter
  \renewcommand*{\do}[1]{%
    \stepcounter{listcount}% Move to next element
    \framebox[#1][c]{\rule{0pt}{1.5ex}\smash{\ensuremath{##1}}}%
    \ifnum\value{listcount}<\value{totcount}\thickspace\fi
  }
  \docsvlist{#2}% Process list a second time to typeset each element
}

The array \printarray{1,2,3,4} is really trivial. However, \printarray[2em]{1,-3,2,16} is not. Also%
\[
  \color{black!50}%
  \underbracket[0.5pt]{{\thickspace}%
    \underbracket[0.5pt][5pt]{{\thickspace}%
      \color{black}\printarray[2em]{5,2,7,-5,16,12}\thickspace}_{\textrm{size}=6}\negthickspace%
    \color{black!25}\underbracket[0pt][5.5pt]{{\thickspace}%
      \printarray[2em]{?,?,?,?,?,?}\thickspace}_{\textrm{free~space}}%
  \thickspace}_{\textrm{capacity}=12}
\]

\end{document}

打印数组

\underbracket[<thickness>][<height>]{<arg>}由提供mathtools,而颜色阴影则由xcolor。修改长度\fboxsep(删除注释\setlength命令)会改变框架框与其内容之间的间隙。为了视觉美观,框架框的内容被\smash设置为固定高度1.5ex

答案3

我喜欢不使用 Tikz 来排版这种东西的想法,因为对于这么简单的事情来说,它可能有点过分。但我们不需要使用外部包,因为 tex 已经可以很好地处理逗号分隔的列表。我们还可以轻松添加一些代码来处理框的宽度。看起来就像这样:

\documentclass{article}
\makeatletter
\let\dotlessi\i
\newlength{\longest} 
\newlength{\@temp}
\newlength{\sep}
\setlength{\sep}{5pt}
\newcommand{\findlongest}[1]{%
  \setlength{\longest}{0pt}%
  \@for\i:=#1\do{%
    \settowidth{\@temp}{\ensuremath{\i}}%
    \ifdim\longest<\@temp%
      \setlength{\longest}{\@temp}%
    \fi
  }
}
\newcommand{\printarray}[1]{%
  \ifx#1\empty\else
    \findlongest{#1}%
    \addtolength{\longest}{2\sep}%
    \@for\i:=#1\do{%
      \framebox[\longest]{\rule{0pt}{1.5ex}\smash{\ensuremath{\i}}}\hskip2\sep%
    }%
    \hskip-2\sep% remove final skip
    \ %add space
  \fi
}
\let\i\dotlessi
\makeatother
\begin{document}
  \printarray{5,2,7,-5,16,12,?,?,?,?,?,?}
\end{document}

\findlongest是一种辅助方法,它可以找到列表中最宽的元素并将长度设置\longest为该宽度。然后将所有东西放入一个高度和宽度\printarray均为 1.5ex 的盒子中。\longest

最终结果如下: 排版数组

答案4

我来晚了一点,希望你不介意(用普通话来说):

\newdimen\boxitspace\boxitspace=3pt% boxit from eplain
\long\def\boxit#1{\vbox{\hrule\hbox{\vrule\kern\boxitspace\vbox{%
  \kern\boxitspace\parindent0pt#1\kern\boxitspace}%
  \kern\boxitspace\vrule}\hrule}}
\def\aryitem#1{\boxit{\hbox to 1.4em{\hfil#1\hfil}}}% change 1.4em if needed
\let\MS\multispan% shorten a little
\halign{&\thinspace\aryitem{$\mathstrut#$}\thinspace\cr
  5&2&7&-5&16&12&\omit\quad&?&?&?&?&?&?\cr
  \MS6\upbracefill&\omit&\MS6\upbracefill\cr
  \MS6\hfill size $=6$\hfill&\omit&\MS6\hfill free space\hfill\cr
  \MS{13}\upbracefill\cr
  \MS{13}\hfill capacity $=12$\hfill\cr
}
\bye

看起来像
阿里

相关内容