тикз:установите подходящее значение 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}
что дает желаемый результат:
Неудовлетворительно то, что мне пришлось вычислять значение xshift 1,597 см методом проб и ошибок (более или менее).
Без аргумента xshift результат:
Я думаю, есть элегантный способ избежать явного значения xshift.
По моему мнению, лучшим способом было бы вычислить максимальное значение x двух узлов и использовать его (как уже предлагалось Джефф)
Но уже было бы очень удобно иметь возможность явно определять абсолютные значения x обоих узлов, сохраняя при этом их текущие значения y.Это позволит избежать трудоемкой процедуры адаптации третьей позиции после запятой, чтобы скобка выглядела вертикально.
Решение
Это требует \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}
Другие советы
Вот версия, использующая библиотеку подгонки, которая не требует от вас беспокойства о том, какая строка длиннее, за счет маркировки каждой строки.
\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}
Необходимого в образце OP сдвига y можно избежать, сделав узлы фактическими узлами (в отличие от координат) с X нулевой ширины в качестве текста.