为了好玩,我想尝试在 tikz 中创建像这样的精美简历https://fr.freepik.com/vecteurs-libre/modele-cv-minimaliste_13163860.htm#query=cv&position=0&from_view=keyword我需要在 tikz 矩阵的单元中的节点之间画线。
为此,我曾经append after command
添加一个节点并将该节点链接到前一个单元格中的链接……不幸的是,链接出现在错误的位置(水平长度很好,但没有按预期上升)。我猜想矩阵在构建新单元格时还不知道其他单元格的位置……
知道如何修复它吗?
MWE(抱歉缩进得不好,我在用手机)
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepgflibrary{shapes.misc}
\usetikzlibrary{arrows,shadows}
\begin{document}
\begin{tikzpicture}[remember picture,
cventry/.style={
prefix after command={
[very thick]
(\tikzlastnode.north west)node[circle,fill=black,minimum width=1mm](mydot-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn){}
}},
linkprevious/.style={
append after command={
(mydot-\the\numexpr\the\pgfmatrixcurrentrow - 1\relax-\the\pgfmatrixcurrentcolumn) edge[->,red](mydot-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn)
}
},
]
\matrix (m) [matrix of nodes, ampersand replacement=\&, column sep = 1.5cm, row sep = 1.2cm]{
|[cventry]| Hello my dear something is strange\\
|[cventry,linkprevious]| Oui \\
};
\end{tikzpicture}
\end{document}
答案1
当 PGF 构建矩阵时,它还不知道其内容最终将位于何处。为此,PGF 会在内部跟踪矩阵中创建的所有节点,并在矩阵完成时调整它们的引用,以便(<node name>)
正常工作。
在此之前,每个节点仅对其单元格具有本地引用,这意味着使用前一个节点将返回相对于其单元格的坐标,但 PGF 在绘制边缘时不会考虑到这一点和它甚至不知道单元格之间的垂直距离——同样,该行可能包含另一个单元格,并且垂直距离会比创建\draw (0,0) -- (5,0);
单元格时大得多。(您还需要在该边缘上,否则该线实际上永远不会突出到单元格的边界框之外,基本上与不同 TikZ 图片之间的线上的原因相同。)linkprevious
overlay
overlay
您需要从 TikZ-CD 的剧本中取出一页,其中命令\arrow
通过提供仅在矩阵之后执行的宏来延迟绘图直到矩阵之后。
从细胞中获取宏量营养
宏\pgfinteval
只是内容的内部包装器\numexpr
,\pgfutil@g@addto@macro
是 PGF 自己的 LaTeX 版本\g@addto@macro
,它附加#2
到 的定义#1
。这基本上是etoolbox
'\gappto
只要#1
是一个无参数的宏。\pgfutil@empty
是 PGF 自己的\@empty
/ \empty
,基本上是一个“空”宏(\def\pgfutil@empty{}
),用于初始化边列表。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta, matrix}
\makeatletter
\tikzset{
matrix with linkpreviouses/.style=% initialize
/utils/exec=\let\tikz@listofedgesforaftermatrix\pgfutil@empty,
append after command=\tikz@listofedgesforaftermatrix,
matrix with linkpreviouses/.code=% disable key
},
linkprevious/.code={%
\edef\tikz@temp{%
(mydot-\pgfinteval{\pgfmatrixcurrentrow-1}-\the\pgfmatrixcurrentcolumn)
edge[->,red](mydot-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn)}%
\expandafter\pgfutil@g@addto@macro\expandafter
\tikz@listofedgesforaftermatrix\expandafter{\tikz@temp}}%
}
\makeatother
\begin{document}
\begin{tikzpicture}[
cventry/.style={prefix after command={
(\tikzlastnode.north west) node[
very thick, circle,fill=black,minimum width=1mm]
(mydot-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn){}}}]
\matrix (m) [
matrix of nodes,
matrix with linkpreviouses,
ampersand replacement=\&,
column sep = 1.5cm,
row sep = 1.2cm]{
|[cventry]| Hello my dear something is strange\\
|[cventry, linkprevious]| Oui \\
};
\end{tikzpicture}
\end{document}
矩阵后的智能代码
您可能只append after command
在矩阵本身上使用一个,其中有一些代码可以确定要做什么。(我在这里使用chains
库是\chainin
因为它是连接一堆节点的最懒惰的方法,当然您可以手动构建边。)
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta, chains, matrix}
\tikzset{
matrix with linkpreviouses/.style={
append after command={
[start chain=going above, every join/.append style={<-, red}]
\foreach \ENTRY in {\the\pgfmatrixcurrentrow, ..., 1}{
(mydot-\ENTRY-1) [late options={on chain, every chain in/.try, join}]
}}}}
\begin{document}
\begin{tikzpicture}[
cventry/.style={prefix after command={
(\tikzlastnode.north west) node[
very thick, circle,fill=black,minimum width=1mm]
(mydot-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn){}}}]
\matrix (m) [
matrix of nodes,
matrix with linkpreviouses,
ampersand replacement=\&,
column sep = 1.5cm,
row sep = 1.2cm]{
|[cventry]| Hello my dear something is strange\\
|[cventry]| Oui \\
};
\end{tikzpicture}
\end{document}