2010-05-05 17 views
5

Esta pregunta se debió a la pregunta hereTikZ: establecer el valor de x apropiada para un nodo

quiero producir una llave que se extiende por algunas líneas de texto. El problema es que tengo que alinear la coordenada x manualmente, lo cual no es una solución limpia.

Actualmente uso

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

que produce el resultado deseado:

tikz example1

Lo insatisfactorio es, que tenía que averiguar el valor xshift de 1.597cm por ensayo y error (más o menos)

Sin argumento xshift el resultado es:

tikz example 1

Supongo que hay una forma elegante de evitar el valor explícito de xshift.

La mejor manera sería que en mi humilde opinión sea para calcular el valor máximo de x de dos nodos y usar esto, (como ya se ha sugerido por Geoff)

Pero ya sería muy útil para poder definir explícitamente la absoluta x valores de ambos nodos mientras se mantienen sus valores y actuales. Esto evitaría el complicado procedimiento de adaptar la tercera posición decimal posterior para garantizar que la abrazadera se vea vertical.

Respuesta

4

Esto requiere \usetikzlibrary{calc}. Sin embargo, puede haber una manera más limpia.

eliminar el "xshift" de nodo n2 y luego usar:

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

En realidad, no creo que necesite calc. Puede usar la misma línea presentada por basweber, pero simplemente ponga (n3) en lugar de (n2). La clave en esta respuesta es definir el punto de inflexión de la ruta rectilínea (n3). ¡Buena llamada! – Geoff

+0

He intentado usar el código original (con "punto medio") pero por alguna razón que terminó poniendo el nodo en la parte inferior del corsé (en la misma coordenada y que n2). No estoy seguro de por qué fue ese el caso. – ESultanik

+0

Muchas gracias. Funciona y es una solución limpia. @Geoff: Tiene razón: ($ (n1)! 0.5! (N3) $) (y, por lo tanto, calc) no es necesario. En mi máquina, las dos versiones producen el mismo resultado. Gracias por señalar eso. – basweber

0

Aquí hay una versión usando la biblioteca ajuste que no requiere que se preocupe por lo que la línea es más larga, a expensas de marcar cada línea.

\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

El yshift necesaria en la muestra del OP se evita haciendo que los nodos de los nodos reales (en contraposición a las coordenadas) con un ancho de cero X como texto.

Cuestiones relacionadas