Latex tikz:为节点设置适当的x值

Latex tikz:为节点设置适当的x值,latex,beamer,tikz,Latex,Beamer,Tikz,这个问题源于这个问题 我想制作一个大括号,它跨越一些文本行。 问题是我必须手动对齐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 pictur

这个问题源于这个问题

我想制作一个大括号,它跨越一些文本行。 问题是我必须手动对齐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}
\begin{frame}{Example}
\开始{逐项列出}
\项目长问题1
\tikz[记住图片]\node[坐标,yshift=0.7em](n1){}\\
跨越两条线
\项目问题2
\tikz[记住图片]\node[坐标,xshift=1.597cm](n2){};
\项目问题3
\结束{逐项列出}
\可见的{
\开始{tikzpicture}[覆盖,记住图片]
\绘制[厚,装饰,装饰={支撑,振幅=5pt}]
(n1)-(n2)节点[中间,右=4pt]{1和2是冷的};
\结束{tikzpicture}
}%end可见
\结束{帧}
这将产生所需的结果:

令人不满意的是,我必须通过反复试验(或多或少)计算出1.597cm的xshift值

如果没有xshift参数,结果是:

我想有一种优雅的方法可以避免显式的xshift值

最好的方法是计算两个节点的最大x值并使用该值(如已建议的)


但是,如果能够明确定义两个节点的绝对x值,同时保持它们当前的y值,这将非常方便。这将避免调整小数点后第三个位置以确保大括号看起来垂直的繁琐过程。

这需要
\usetikzlibrary{calc}
。不过,也许有一种更干净的方法

从节点
n2
中删除“
xshift
”,然后使用:

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

这是一个使用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}
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{fit}
\新命令{\bracemark}[1]{\tikz[记住图片]\node[内部sep=0pt](#1){\vphantom{X};}
\开始{document}
\开始{frame}{Example}
\开始{逐项列出}
\项目长问题1\bracemark{n1}\\
免费的文本长行\bracemark{n2}\\
跨越3行\bracemark{n3}
\项目问题2\bracemark{n4}
\项目问题3
\结束{逐项列出}
\可见的{
\开始{tikzpicture}[覆盖,记住图片]
\节点[内部sep=0pt,拟合=(n1)(n2)(n3)(n4)](括号标记){};
\绘制[厚,装饰,装饰={支撑,振幅=5pt}]
(bracemarks.north-east)--(bracemarks.south-east)节点[midway,right=4pt]{1和2都很酷};
\结束{tikzpicture}
}%end可见
\结束{帧}
\结束{document}


OP示例中所需的yshift可以通过将节点设置为实际节点(与坐标相反)并将零宽度X作为文本来避免。

实际上,我认为您不需要计算。您可以使用basweber提供的相同行,但只需将(n3)而不是(n2)放在一起。这个答案的关键是定义直线路径(n3)的转折点。好球!我尝试使用原始代码(带有“中点”),但由于某种原因,最终将节点放置在支架底部(与n2处于相同的y坐标)。我不知道为什么会这样。非常感谢。这是一个干净的解决方案@杰夫:你说得对:($(n1)!0.5!(n3)$)(因此不需要计算)。在我的机器上,两个版本产生相同的结果。谢谢你指出这一点。