我从另一边得到了以下代码。如何才能不让线和点重叠?
\documentclass[
fontsize=12pt,
twoside,
open=right,
toc=bibnumbered,
toc=listof,
captions=abovetable,% <- ergänzt
ngerman
]{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{booktabs}
\usepackage{hyperref}
\newcommand\zeilenabstand{10pt}
\tikzset{vp/.style={circle,fill,inner sep=2pt}}
\newcommand\verbindungslinie[3]{
\node[#1,vp]at([yshift=-.15*\zeilenabstand]#2.south){};
\foreach [remember=\p as \lastp (initially #2)] \p in {#3}
\draw[ultra thick,#1,draw opacity=.4]([yshift=-.15*\zeilenabstand]\lastp.south)--([yshift=-.15*\zeilenabstand]\p.south)node[vp]{};
}
\begin{document}
\begin{center}
\begin{minipage}{\linewidth}
\captionof{table}{Morphologischer Kasten Getriebevarianten}\label{morphologischer_kasten}
\begin{tikzpicture}
\matrix[
matrix of nodes ,
inner sep=0pt,
row sep=\zeilenabstand,
column sep=15pt,
nodes={font=\strut},
nodes in empty cells,
column 2/.style={text width=5cm},
column 3/.style={text width=3.5cm,align=center},
column 4/.style={text width=3.5cm,align=center},
column 5/.style={text width=3.5cm,align=center}
](m)
{
1& Übertragung
& Schneckenradsatz
& Innenradpaarung
& Strinradpaarung\\
2& Schmierung
& Tauchschmierung
& Trockenschmierung
& Sprühschmierung\\
3& Gesamtgröße
& Klein
& Mittel
& Groß\\
4& Kleiner Durchlass
& Ja
& Nein
&\\
&&&&\\
&
&|[red]|{\textbf{LV1}}
&|[blue]|{\textbf{LV2}}
&|[green]|{\textbf{LV3}}\\
};
% Kopfzeile
\node(ul)[anchor=south west]
at ([yshift={\zeilenabstand+\aboverulesep+\belowrulesep}]m.north west)
{Teilfunktion};
\node(or)[anchor=south east] at (ul.north-|m-1-2.east){Lösungsvarianten};
\foreach[count=\i from 3] \l in {1,2,3}
\node[anchor=base] at (or.base-|m-1-\i){\l};
% Tabellenlinien
\draw[line width=\lightrulewidth](or.north-|ul.west)--(or.east|-ul.south)
([yshift=-\aboverulesep]ul.south-|m.west)
--([yshift=-\aboverulesep]ul.south-|m.east);
\draw[line width=\heavyrulewidth]([yshift=\belowrulesep]or.north-|m.west)
--([yshift=\belowrulesep]or.north-|m.east)
([yshift={-\aboverulesep}]m.south west)
--([yshift={-\aboverulesep}]m.south east);
% Verbindungslinien
\verbindungslinie{red}{m-1-3}{m-2-3,m-3-3,m-4-3,m-5-3}
\verbindungslinie{blue}{m-1-4}{m-2-4,m-3-4,m-4-3,m-4-4,m-5-4}
\verbindungslinie{green}{m-1-5}{m-2-4,m-3-4,m-4-4,m-5-5}
\end{tikzpicture}
\end{minipage}
\end{center}
\end{document}
答案1
我不清楚你到底想实现什么。但也许你想自动移动节点,以便同一单元格中的两个节点不会相互重叠。你可以用以下方法实现这一点:
\documentclass[border=10pt]{standalone}
\usepackage{booktabs}
\usepackage{tikz}
\usetikzlibrary{matrix, backgrounds}
\newcommand\zeilenabstand{10pt}
\def\GetNodeColumn(#1-#2-#3){#3}
\tikzset{vp/.style={circle, fill, inner sep=2pt}}
\newcommand\verbindungslinie[4][10pt]{
\node[#2, vp] at ([yshift=-.15*\zeilenabstand]#3.south) {};
\edef\co{\noexpand\GetNodeColumn(#3)}
\foreach[remember=\p as \lastp (initially #3)] \p in {#4}
\edef\cl{\noexpand\GetNodeColumn(\lastp)}
\edef\cp{\noexpand\GetNodeColumn(\p)}
\draw[ultra thick, #2, draw opacity=.4]
([yshift=-.15*\zeilenabstand,xshift={#1*(\co-\cl)}]\lastp.south) --
([yshift=-.15*\zeilenabstand,xshift={#1*(\co-\cp)}]\p.south)
node[vp] {};
}
\begin{document}
\begin{tikzpicture}
\matrix[
matrix of nodes,
inner sep=0pt,
row sep=\zeilenabstand,
column sep=15pt,
nodes={font=\strut},
nodes in empty cells,
column 2/.style={text width=5cm},
column 3/.style={text width=3.5cm,align=center},
column 4/.style={text width=3.5cm,align=center},
column 5/.style={text width=3.5cm,align=center}
](m)
{
1 & Übertragung
& Schneckenradsatz
& Innenradpaarung
& Strinradpaarung\\
2 & Schmierung
& Tauchschmierung
& Trockenschmierung
& Sprühschmierung\\
3 & Gesamtgröße
& Klein
& Mittel
& Groß\\
4 & Kleiner Durchlass
& Ja
& Nein
&\\
&&&&\\
&
&|[red]|{\textbf{LV1}}
&|[blue]|{\textbf{LV2}}
&|[green]|{\textbf{LV3}}\\
};
% Kopfzeile
\node(ul)[anchor=south west]
at ([yshift={\zeilenabstand+\aboverulesep+\belowrulesep}]m.north west)
{Teilfunktion};
\node(or)[anchor=south east] at (ul.north-|m-1-2.east){Lösungsvarianten};
\foreach[count=\i from 3] \l in {1,2,3}
\node[anchor=base] at (or.base-|m-1-\i){\l};
% Tabellenlinien
\draw[line width=\lightrulewidth](or.north-|ul.west)--(or.east|-ul.south)
([yshift=-\aboverulesep]ul.south-|m.west)
--([yshift=-\aboverulesep]ul.south-|m.east);
\draw[line width=\heavyrulewidth]([yshift=\belowrulesep]or.north-|m.west)
--([yshift=\belowrulesep]or.north-|m.east)
([yshift={-\aboverulesep}]m.south west)
--([yshift={-\aboverulesep}]m.south east);
% Verbindungslinien
\begin{scope}[on background layer]
\verbindungslinie{red}{m-1-3}{m-2-4,m-3-3,m-4-3,m-5-3}
\verbindungslinie{blue}{m-1-4}{m-2-4,m-3-4,m-4-3,m-5-3}
\verbindungslinie{green}{m-1-5}{m-2-4,m-3-4,m-4-4,m-5-3}
\end{scope}
\end{tikzpicture}
\end{document}
我改变了您原始图中某些点的位置,以显示点将根据它们是向右移动还是向左移动而向两个方向移动,并且如果距离较大,它们将移动得更多。
行中的第一个点不会发生偏移。您可以通过设置可选参数(例如)来更改偏移的距离\verbindungslinie[10pt]{red}{m-1-3}{m-2-4,m-3-3,m-4-3,m-5-3}
。
最后,我使用该库将所有线条放在文本后面backgrounds
。