
Я пытаюсь заставить текст появиться в правильном месте на конце стрелки, нарисованной с помощью tikzmark. Код выглядит следующим образом
\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage{booktabs}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{kbordermatrix}
\usepackage{bigstrut}
\usetikzlibrary{tikzmark,arrows.meta,patterns,calc}
%\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[4][]{%
\tikz[overlay,remember picture]{%
\coordinate (TopLeft) at ($(pic cs:#2)+(-0.2em,0.9em)$);
\coordinate (BottomRight) at ($(pic cs:#3)+(0.2em,-0.3em)$);
%
\path (TopLeft); \pgfgetlastxy{\XCoord}{\IgnoreCoord};
\path (BottomRight); \pgfgetlastxy{\IgnoreCoord}{\YCoord};
\coordinate (LabelPoint) at ($(\XCoord,\YCoord)!0.5!(BottomRight)$);
%
\draw [red,#1] (TopLeft) rectangle (BottomRight);
\node [below, #1, fill=none, fill opacity=1] at (LabelPoint) {#4};
}
}
\newcommand\DrawArrow[4][]{
\begin{tikzpicture}[
remember picture,
overlay,
arr/.style={draw=gray,line width=2pt, {-latex}, #1},
xshift=1em,
yshift=-3ex,
]
\draw[arr]
([xshift=1ex]pic cs:#2)
to[out=-50,in=-150,looseness=1.0] node[below=0pt] {#4}
([xshift=-1ex]pic cs:#3);
\end{tikzpicture}
}
\newcommand\DrawArrowB[4][]{
\begin{tikzpicture}[
remember picture,
overlay,
arr/.style={draw=gray,line width=2pt, {-latex}, #1},
xshift=-1ex,
yshift=1ex,
]
\draw[arr]
([xshift=-1ex]pic cs:#2)
to[out=-50,in=-150,looseness=1.0] node[below=0pt] {#4}
([xshift=-2ex]pic cs:#3);
\end{tikzpicture}
}
\newcommand\DrawArrowC[4][]{
\begin{tikzpicture}[
remember picture,
overlay,
arr/.style={draw=black,line width=0.5pt, {-latex}, #1},
xshift=1.5ex,
yshift=-0.8ex,
]
\draw[arr]
([xshift=-1ex]pic cs:#2)
to[out=100,in=10,looseness=0] node[below=10pt] {#4}
([xshift=-2ex]pic cs:#3);
\end{tikzpicture}
}
\newcommand\DrawArrowD[4][]{
\begin{tikzpicture}[
remember picture,
overlay,
arr/.style={draw=black,line width=0.5pt, {-latex}, #1},
xshift=1.5ex,
yshift=-0.8ex,
]
\draw[arr]
([xshift=-1ex]pic cs:#2)
to[out=100,in=10,looseness=0] node[below=10pt] {#4}
([xshift=8ex]pic cs:#3);
\end{tikzpicture}
}
\begin{document}
\begin{table}[htbp]
\centering
\caption{Issue 2}
\begin{tabular}{@{}rrrrrrr@{}}
\toprule
& \multicolumn{6}{c}{Development year} \\
\cmidrule(l){2-7}
{Year} & {1} & {2} & {3} & {4} & {5} & {6} \\
\midrule
2009 & \tikzmark{lefta}443 & \tikzmark{leftb}1,136 & 2,128 & 2,898 & 3,403 & 3,873 \\
2009 & 443 & 1,136 & 2,128 & 2,898 & 3,403 & 3,873 \\
2010 & 396 & 1,333 & 2,181 & 2,986 & 3,692 & \\
2011 & 441 & 1,288 & 2,420 & 3,483 & & \\
2012 & 359 & 1,421 & 2,864 & & & \\
2013 & 377\tikzmark{righta} & 1,363\tikzmark{rightb} & & & & \\
2014 & 344& - & - & - & - & - \\
&\phantom{377}\tikzmark{line1end}&\phantom{1,363}\tikzmark{line2end}&&&&\\
\end{tabular}%
\DrawBox[thick, black]{lefta}{righta}{}
\DrawBox[thick, black]{leftb}{rightb}{}
\DrawArrowC{righta}{line1end}{Sum=2,016}
\DrawArrowD{rightb}{line2end}{Sum=6,542}
\label{tab:first two col sums}
\end{table}%
\end{document}
Это производит:
Я хочу, чтобы слова "Sum=6,542" отображались по центру под стрелкой, но, похоже, не получается переместить текст вправо. Может ли кто-нибудь помочь? Кроме того, если у кого-то есть более элегантные способы достижения такого типа маркировки в таблице, то я был бы рад увидеть любые предложения. Например, я задавался вопросом, будет ли выглядеть лучше, если бы содержимое "Sum=..." было само по себе в рамках, возможно?
Большое спасибо.
решение1
Ваш node
(внутри команды \DrawArrowC
and D
) находится в неправильном положении. Если вы говорите:
\draw (0,0) -- node{A} (2,0);
По умолчанию текст A
будет размещен midway
по пути (в данном случае по адресу (1,0)
), если вы поместите узелпослепоследняя координата, то по умолчанию она будет помещена в самый конец пути, а именно в последнюю входную координату:
\draw (0,0) -- (2,0) node{A};
В этом случае A
будет помещен в (2,0)
. Другой вариант — явно указать позицию узла через pos
ключ, сказав
\draw node[pos=1]{A} (0,0) -- (2,0);
Где 1
конец пути и 0
начало. Это поместит узел в самую конечную координату пути (псевдоним для этого — key at end
). Таким образом, если вы явно дадите ключ pos
(или один из его псевдонимов midway
, at start
и at end
) узлу, он будет помещен туда, куда pos
ведет этот ключ.
Что касается вашего вопроса о том, как это выглядит, это, безусловно, вопрос мнения. По моему мнению, делать это с TiкZ портит таблицу, создайте ряд и впишите в него суммы, это будет выглядеть намного лучше.
Что касается представленного кода, я не понимаю, зачем вы делаете так много \DrawArrowX
команд, это те же самые команды с некоторыми небольшими изменениями. Вы можете достичь того же результата с помощью только одного \DrawArrow
и обширного использования TiкZ-стили, тогда вам не нужно помнить, что \DrawArrowX
есть что, и у вас еще больше гибкости, так как вы можете менять стили в середине документа. Черт, вы даже можете сделать стили, называемые A
, B
и что угодно, что изменяет arr
стиль, так что у вас нет нескольких \DrawArrowX
команд. Вот пример того, как это можно сделать:
\documentclass{article}
\usepackage{booktabs}
\usepackage{tikz}
\usetikzlibrary{tikzmark,arrows.meta,patterns,calc}
%\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[4][]{%
\tikz[overlay,remember picture]{%
\coordinate (TopLeft) at ($(pic cs:#2)+(-0.2em,0.9em)$);
\coordinate (BottomRight) at ($(pic cs:#3)+(0.2em,-0.3em)$);
%
\path (TopLeft); \pgfgetlastxy{\XCoord}{\IgnoreCoord};
\path (BottomRight); \pgfgetlastxy{\IgnoreCoord}{\YCoord};
\coordinate (LabelPoint) at ($(\XCoord,\YCoord)!0.5!(BottomRight)$);
%
\draw [red,#1] (TopLeft) rectangle (BottomRight);
\node [below, #1, fill=none, fill opacity=1] at (LabelPoint) {#4};
}
}
\tikzset{arr draw/.style={draw=gray,line width=2pt,-latex},
arr to/.style={out=-50,in=-150},
arr node/.style={below=1mm, inner sep=1pt}}
\newcommand\DrawArrow[4][]{
\begin{tikzpicture}[remember picture,overlay, #1]
\draw[arr draw] (pic cs:#2) to[arr to] (pic cs:#3) node[arr node] {#4};
\end{tikzpicture}
}
\begin{document}
\begin{table}[htbp]
\centering
\caption{Issue 2}
\begin{tabular}{@{}rrrrrrr@{}}
\toprule
& \multicolumn{6}{c}{Development year} \\
\cmidrule(l){2-7}
{Year} & {1} & {2} & {3} & {4} & {5} & {6} \\
\midrule
2009 & \tikzmark{lefta}443 & \tikzmark{leftb}1,136 & 2,128 & 2,898 & 3,403 & 3,873 \\
2009 & 443 & 1,136 & 2,128 & 2,898 & 3,403 & 3,873 \\
2010 & 396 & 1,333 & 2,181 & 2,986 & 3,692 & \\
2011 & 441 & 1,288 & 2,420 & 3,483 & & \\
2012 & 359 & 1,421 & 2,864 & & & \\
2013 & 377\tikzmark{righta} & 1,363\tikzmark{rightb} & & & & \\
2014 & 344& - & - & - & - & - \\
&\phantom{377}\tikzmark{line1end}&\phantom{1,363}\tikzmark{line2end}&&&&\\
\end{tabular}%
\DrawBox[thick, black]{lefta}{righta}{}
\DrawBox[thick, black]{leftb}{rightb}{}
% You can change the all the "arr's" styles globally by using \tikzset
% in the middle of the document, then all \DrawArrow commands will follow such style
% or locally through the optional argument of \DrawArrow, then just that command will follow that sytle.
\DrawArrow[arr to/.style={bend left}, arr draw/.style={->}, arr node/.style={left, font=\tiny}]{righta}{line1end}{Sum=2,016}
\DrawArrow{rightb}{line2end}{Sum=6,542}
\label{tab:first two col sums}
\end{table}%
\end{document}