tikz: установить соответствующее значение x для узла - PullRequest
5 голосов
/ 06 мая 2010

Этот вопрос возник из вопроса здесь

Я хочу создать фигурную скобку, которая занимает несколько строк текста. Проблема в том, что я должен выровнять координату х вручную, что не является чистым решением.

В настоящее время я использую

\begin{frame}{Example}

\begin{itemize}
\item The long Issue 1
\tikz[remember picture] \node[coordinate,yshift=0.7em] (n1) {}; \\
spanning 2 lines


\item Issue 2
  \tikz[remember picture] \node[coordinate, xshift=1.597cm] (n2) {};
\item Issue 3

\end{itemize}

\visible<2->{
\begin{tikzpicture}[overlay,remember picture]
  \draw[thick,decorate,decoration={brace,amplitude=5pt}]
        (n1) -- (n2) node[midway, right=4pt] {One and two are cool};
\end{tikzpicture}
 } % end visible

\end{frame}

, который дает желаемый результат:

tikz example1

Неудовлетворительно то, что мне пришлось вычислять значение xshift 1,559 см методом проб и ошибок (более или менее)

Без аргумента xshift результат:

tikz example 1

Я думаю, что есть элегантный способ избежать явного значения xshift.

Наилучшим способом будет вычислить максимальное значение x для двух узлов и использовать его (как уже предложено Geoff )

Но было бы очень удобно иметь возможность явно определять абсолютные значения x обоих узлов при сохранении их текущих значений y. Это позволило бы избежать изнурительной процедуры адаптации третьего после десятичного знака, чтобы скобка выглядела вертикально.

Ответы [ 2 ]

6 голосов
/ 06 мая 2010

Для этого требуется \usetikzlibrary{calc}. Хотя может быть и чище.

Удалите «xshift» из узла n2 и затем используйте:

\begin{tikzpicture}[overlay,remember picture]
  \path (n2) -| node[coordinate] (n3) {} (n1);
  \draw[thick,decorate,decoration={brace,amplitude=5pt}]
        (n1) -- (n3);
  \node[right=4pt] at ($(n1)!0.5!(n3)$) {One and two are cool};
\end{tikzpicture}
1 голос
/ 06 февраля 2017

Вот версия, использующая библиотеку подгонки, в которой не нужно беспокоиться о том, какая строка самая длинная, за счет маркировки каждой строки.

\documentclass{beamer}

\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{fit}

\newcommand{\bracemark}[1]{\tikz[remember picture] \node[inner sep=0pt] (#1) {\vphantom{X}};}

\begin{document}
\begin{frame}{Example}

\begin{itemize}
\item The long Issue 1        \bracemark{n1} \\
gratuitious long line of text \bracemark{n2} \\
spanning 3 lines              \bracemark{n3}

\item Issue 2                 \bracemark{n4}
\item Issue 3

\end{itemize}

\visible<2->{
\begin{tikzpicture}[overlay,remember picture]
  \node [inner sep=0pt, fit=(n1) (n2) (n3) (n4)] (bracemarks) {};
  \draw[thick,decorate,decoration={brace,amplitude=5pt}]
        (bracemarks.north east) -- (bracemarks.south east) node[midway, right=4pt] {One and two are cool};
\end{tikzpicture}
 } % end visible

\end{frame}

\end{document}

Image of output

Чтобы избежать yshift, необходимого в образце OP, нужно сделать узлы фактическими узлами (в отличие от координат) с нулевой шириной X в качестве текста.

...