这个问题既涉及图形设计,也涉及通过 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}
当然,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}
得出: