对齐文本列的可视化

对齐文本列的可视化

这个问题既涉及图形设计,也涉及通过 LaTeX 进行有效实现。

我想可视化几个对齐的字符串列。这些列要从上到下读取,有时可能包含空白字段。显然,对齐不能被破坏,并且各个字符串应该保持可读性。

COL1 COL2 COL3
foo  foo  foo
bar  bar  bar
baz       baz
qux  qux     
     quux quux

在 TEX 中可视化这些列的有效方法是什么?

下面是一个通过 ASCII 的示例,其中字符串被装箱并且方框之间由垂直线连接。

 ---      ---      --- 
|foo|    |foo|    |foo|
 ---      ---      --- 
  |        |        |  
 ---      ---      --- 
|bar|    |bar|    |bar|
 ---      ---      --- 
  |        |        |  
 ---       |       --- 
|baz|      X      |baz|
 ---       |       --- 
  |        |        |  
 ---      ---       | 
|qux|    |qux|      X
 ---      ---       | 
  |        |        |  
  |       ---      --- 
  X      |quux|   |quux|
          ---      --- 

答案1

由于您将其视为列,因此我假设您更愿意逐列输入字符串,而不是逐行输入。一种方法是使用包forest

\documentclass[tikz, border=5pt]{standalone}

\usepackage{forest}
\forestset{%
  my columns/.style={%
    for descendants={rectangle, draw}, 
    for children={no edge}, 
    phantom, s sep=1cm,
  },
  % Pick one of these styles
  hidden empty nodes/.style={%
    delay={%
      where content={}{%
        shape=coordinate,
      }{},
    },
  },
  x empty nodes/.style={%
    delay={%
      where content={}{%
        content=\textsf{x}, draw=none
      }{},
    },
  },
}
\begin{document}

\begin{forest} my columns, hidden empty nodes [
  [foo [bar [baz [qux []]]]]
  [foo [bar [ [qux [quxx]]]]]
  [foo [bar [baz [ [quxx]]]]]
  ]
\end{forest}

\begin{forest} my columns, x empty nodes [
  [foo [bar [baz [qux []]]]]
  [foo [bar [ [qux [quxx]]]]]
  [foo [bar [baz [ [quxx]]]]]
  ]
\end{forest}

\end{document}

隐藏空节点              x 个空节点

当然,forest在这种情况下似乎有点过头了,并且在源代码中留下了稍微奇怪的符号......

编辑:要使空节点使用项目符号而不是 xs,您可以将其替换content=\textsf{x}content=\textbullet。在这种情况下,您可能还想设置inner sep=0空节点,以便线条接触项目符号。另一方面,将节点绘制为实心圆可能更容易,就像我在下面的示例中所做的那样。

要添加列标题,一种选择是向每列的第一个节点添加标签,例如[foo, label={Col 1} [bar [baz [qux []]]]]。在这种情况下,您可以通过设置来控制标题和第一个节点之间的距离,例如\tikzset{label distance=1em}。另一方面,如果您想先写列标题,您只需从每列的第一个节点中删除框和边即可。生成的代码如下所示

\documentclass[tikz, border=5pt]{standalone}

\usepackage{forest}
\forestset{%
  my columns/.style={%
    for descendants={
      rectangle, draw,
      anchor=center, % vertically align (empty) nodes at the middle
      font=\strut, % make the box size independent of ascenders/descenders
      l sep=0em, % make the level height independent of box height
    },
    for children={no edge,
      draw=none, inner sep=0pt, outer sep=0pt, font={}, % style of column header
      for children={no edge,
        l=2em, % header distance (minimum 1em)
      }
    },
    phantom, % hide the root node
    s sep=1cm, % distance between columns
    bullet empty nodes
  },
  bullet empty nodes/.style={%
    delay={%
      where content={}{%
        circle, inner sep=.5mm, fill, font={}
        % draw=none, content=\textbullet, font={}, inner sep=-1pt,
      }{},
    },
  },
}
\begin{document}

\begin{forest} my columns [
  [Col 1 [foo [bar [baz [qux []]]]]]
  [Col 2 [foo [bar [ [qux [bar]]]]]]
  [Col 3 [foo [bar [baz [ [quxx]]]]]]
  ]
\end{forest}

\end{document}

项目符号空节点

在这里我还添加了一些东西,使得上升部和下降部(或缺少上升部)不会改变盒子的高度,并且使得空节点向其列添加与非空节点相同的高度(即使空节点本身小于非空节点)。

答案2

一种可能的方法是定义一个宏。

代码:

\documentclass{amsart}
\usepackage{etoolbox}
\newcommand{\example}[3] {
  $\boxed{{\sim\text{#1}\sim}}$&$\boxed{{\sim\text{#2}\sim}}$&$\boxed{{\sim\text{#3}\sim}}$\\\|&\|&\|\\}
\newcommand{\finish}[3] {
  $\boxed{{\sim\text{#1}\sim}}$&$\boxed{{\sim\text{#2}\sim}}$&$\boxed{{\sim\text{#3}\sim}}$}
\begin{document}
\Huge
\begin{tabular}{c c c}
COL1&COL2&COL3\\
\example{foo}{foo}{foo}
\example{bar}{bar}{bar}
\example{baz}{}{baz}
\example{qux}{qux}{}
\finish{}{quux}{quux}
\end{tabular}
\end{document}

得出:

在此处输入图片描述

相关内容