tikz: установить соответствующее значение x для узла

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

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

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

\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,597 см методом проб и ошибок (более или менее).

Без аргумента xshift результат будет следующим:

tikz, пример 1

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

Лучшим способом, имхо, было бы вычислить максимальное значение x двух узлов и использовать его (как уже было предложено Джеффом )

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


person cknoll    schedule 05.05.2010    source источник


Ответы (2)


Для этого требуется \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}
person ESultanik    schedule 06.05.2010
comment
На самом деле, я не думаю, что вам нужен calc. Вы можете использовать ту же строку, что и basweber, но просто поставьте (n3) вместо (n2). Ключевым моментом в этом ответе является определение точки поворота прямолинейного пути (n3). Хороший звонок! - person Geoff; 06.05.2010
comment
Я попытался использовать исходный код (со средней точкой), но по какой-то причине это закончилось тем, что узел оказался внизу скобки (с той же координатой y, что и n2). Я не уверен, почему это было так. - person ESultanik; 06.05.2010
comment
Большое тебе спасибо. Это работает, и это чистое решение. @Geoff: Вы правы: ($ (n1)! 0.5! (N3) $) (и, следовательно, calc) не требуется. На моей машине две версии дают одинаковый результат. Спасибо что подметил это. - person cknoll; 06.05.2010

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

\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}

Изображение вывода

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

person Frentos    schedule 06.02.2017