Anchors/coordinates inside a node’s text

The matrix is imho the best solution. If you don’t want all lines crampled, why did you put node={inner sep=0pt}? Removing this option gives:

Result

As the OP noted in a comment, the above solution produces more padding than the standard rectangle solution. This can be avoided by giving inner sep=0pt to the outer matrix node, and inner sep=3.333pt (which is the default inner sep) to each of the inner nodes (cells).
There is a MWE which includes the rectangle for comparison:

usetikzlibrary{positioning, matrix}
deflegendlines#1#2{
  draw (#1) -- (#2);
  draw (#2.north west) -- (#2.south west);
}
tikzset{
  mynode/.style={draw,fill=blue!30,align=center},
  mylegend/.style={align=left, font=scriptsize, inner sep=1pt}
}

% Using a matrix, the inter-line space is wrong. I can add row sep=42pt, but I don't know what is the correct value.
begin{tikzpicture}
  node[mynode, inner sep=0pt, matrix of nodes,nodes={inner sep=3.33pt}] (N123) {Node line one\Node line two\Node line three\};
  % Coordinates along the east side of N123
  coordinate (N1east) at (N123-1-1.east -| N123.east);
  coordinate (N2east) at (N123-2-1.east -| N123.east);
  coordinate (N3east) at (N123-3-1.east -| N123.east);
  % Legend texts
  node[mylegend, right=1.0cm of N1east] (L1) {Legend 1};
  node[mylegend, right=1.2cm of N2east] (L2) {Legend 2};
  node[mylegend, right=1.4cm of N3east] (L3) {Legend 3};
  % Legend lines
  legendlines{N1east}{L1}
  legendlines{N2east}{L2}
  legendlines{N3east}{L3}
end{tikzpicture}

begin{tikzpicture}
 node[mynode] (N123) {Node line one\Node line two\Node line three};
  node[mylegend, xshift=1cm, at=(N123.east), anchor=west] (L123) {Legend 1\Legend 2\Legend 3};
  legendlines{N123}{L123}
end{tikzpicture}

Result

Here’s a solution using subnode from the experimental tikzmark package. “Experimental” in this case means “not yet on CTAN”: you need to download it from the TeX-SX Launchpad site. Download the file tikzmark.dtx and run tex tikzmark.dtx (if you run latex or pdflatex it will complain of a missing file – ignore that). Put the resulting files somewhere that tex can find them.

Here’s your code with the subnode last.

documentclass{article}
%url{http://tex.stackexchange.com/q/86456/86}
usepackage{tikz}
usetikzlibrary{positioning, matrix,tikzmark}
deflegendlines#1#2{
  draw (#1) -- (#2);
  draw (#2.north west) -- (#2.south west);
}
begin{document}
tikzset{
  mynode/.style={draw,fill=blue!30,align=center},
  mylegend/.style={align=left, font=scriptsize, inner sep=1pt}
}
% I can't access the position of each line using a rectangle node
begin{tikzpicture}
  node[mynode] (N123) {Node line one\Node line two\Node line three};
  node[mylegend, xshift=1cm, at=(N123.east), anchor=west] (L123) {Legend 1\Legend 2\Legend 3};
  legendlines{N123}{L123}
end{tikzpicture}

% Using a matrix, the inter-line space is wrong. I can add row sep=42pt, but I don't know what is the correct value.
begin{tikzpicture}
  node[mynode, matrix, matrix of nodes, nodes={inner sep=0pt}] (N123) {Node line one\Node line two\Node line three\};
  % Coordinates along the east side of N123
  coordinate (N1east) at (N123-1-1.east -| N123.east);
  coordinate (N2east) at (N123-2-1.east -| N123.east);
  coordinate (N3east) at (N123-3-1.east -| N123.east);
  % Legend texts
  node[mylegend, right=1.0cm of N1east] (L1) {Legend 1};
  node[mylegend, right=1.2cm of N2east] (L2) {Legend 2};
  node[mylegend, right=1.4cm of N3east] (L3) {Legend 3};
  % Legend lines
  legendlines{N1east}{L1}
  legendlines{N2east}{L2}
  legendlines{N3east}{L3}
end{tikzpicture}

% Using an invisible rule
begin{tikzpicture}
  node[mynode, matrix, matrix of nodes, nodes={inner sep=0pt}] (N123) {Node line one\rule{0cm}{baselineskip}Node line two\rule{0cm}{baselineskip}Node line three\};
  % Coordinates along the east side of N123
  coordinate (N1east) at (N123-1-1.east -| N123.east);
  coordinate (N2east) at (N123-2-1.east -| N123.east);
  coordinate (N3east) at (N123-3-1.east -| N123.east);
  % Legend texts
  node[mylegend, right=1.0cm of N1east] (L1) {Legend 1};
  node[mylegend, right=1.2cm of N2east] (L2) {Legend 2};
  node[mylegend, right=1.4cm of N3east] (L3) {Legend 3};
  % Legend lines
  legendlines{N1east}{L1}
  legendlines{N2east}{L2}
  legendlines{N3east}{L3}
end{tikzpicture}

begin{tikzpicture}[remember picture]
  node[mynode] (N123) {subnode{mynode-1}{Node line one}\subnode{mynode-2}{Node line two}\subnode{mynode-3}{Node line three}};
  coordinate (L123) at=(N123.east);
  foreach k in {1,2,3} {
  node[mylegend,xshift=k cm,anchor=base west] (Lk) at (mynode-k.base -| L123) {Legend k};
  legendlines{mynode-k.mid west -| N123.mid east}{Lk}
}
end{tikzpicture}

end{document}

This produces:

subnode division of node

Leave a Comment