Saltar al contenido

Saltos de línea manuales / automáticos y alineación de texto en nodos TikZ

Solución:

El problema, según el manual de TikZ-PGF es que

Normalmente, cuando se compone un nodo, todo el texto entre llaves se coloca en una línea larga (en una hbox, para ser precisos) y el nodo se volverá tan ancho como sea necesario (p. 224).

Ahora, el manual de TikZ-PGF explica tres formas en las que uno puede lograr el salto de línea dentro de un nodo TikZ si lo desea (págs. 224-227).

1. Utilice un entorno de varias líneas dentro del nodo.

Se puede utilizar un entorno dentro del nodo que fuerce el salto de línea o cree un entorno de salto de línea para lograr el salto de línea dentro del nodo. El ejemplo del manual utiliza la tabular medio ambiente:

documentclass{article}

usepackage{tikz}

begin{document}

begin{tikzpicture}
node [draw] (example-tabular) {
begin{tabular}{cc}
eaxmple1 & example2 \
example 3 & example4 \
end{tabular}
};
end{tikzpicture}

end{document}

ingrese la descripción de la imagen aquí

2. Utilice \ y align.

Si desea insertar saltos de línea manualmente, puede usar \ y el argumento opcional align. (Si no especifica una opción para align, el salto de línea no ocurrirá y ocurrirá el problema observado por el OP.)

begin{tikzpicture}
node (example-align) [draw, align=left]{example \ example example};
end{tikzpicture}

ingrese la descripción de la imagen aquí

La ventaja de esta opción es que el tamaño del nodo se establece automáticamente en el ancho de la línea más larga dentro del nodo, como se puede ver en la imagen adjunta, donde el ancho del nodo se establece en el ancho de la segunda línea. . La desventaja de esta solución es que debe controlar manualmente la ruptura de línea (más sobre esto a continuación).

También vale la pena señalar que puede controlar el espaciado de las líneas a través de un argumento opcional de la \ mando:

begin{tikzpicture}
node (example-align) [draw, align=left]{example \[5em] example example};
end{tikzpicture}

ingrese la descripción de la imagen aquí

3. Utilice text width y \ (y tal vez align, también).

Finalmente, la tercera opción indicada en el manual de TikZ-PGF es usar el text width argumento, que, creo, crea internamente un minipage medio ambiente. Esta solución establece manualmente el ancho del nodo y luego se puede usar junto con el salto de línea manual:

begin{tikzpicture}
node (example-textwidth-1) [draw, text width=3cm]{example \ example};
end{tikzpicture}

ingrese la descripción de la imagen aquí

Además, se puede utilizar con un bloque de texto más largo cuyo ancho predeterminado sea mayor que el ancho especificado mediante text width. En tales casos, el texto se ajustará automáticamente dentro de un cuadro del ancho especificado:

begin{tikzpicture}
node (example-textwidth-2) [draw, text width=3cm]{This is a demonstration text for showing how line breaking works.};
end{tikzpicture}

ingrese la descripción de la imagen aquí

los text width El argumento también se puede utilizar junto con el align argumento para producir diferentes efectos. Las opciones para align están left, flush left, right, flush right, center, flush center, justify, y none. Véanse las páginas 225-227 para conocer los detalles de los diferentes efectos de estos align opciones en conjunto con el text width argumento.

En resumen, sin embargo, el flush las variantes no intentan equilibrar los bordes izquierdo y derecho mediante la separación de sílabas. En mi opinión, el resultado a menudo no se ve bien (ver imagen), pero se puede utilizar si, por cualquier motivo, desea evitar la separación de sílabas.

ingrese la descripción de la imagen aquí

(El nodo superior en la imagen inmediatamente arriba usa align=left y el nodo inferior usa align=flush left.)

Una cuarta opción

Una cuarta opción, y creo, preferida que no se analiza en el manual de TikZ-PGF es hacer uso de la varwidth paquete. Este paquete esencialmente crea un minipage entorno, pero establece automáticamente el tamaño horizontal del entorno en la parte más ancha dentro de él. Arriba, notará que el text width La opción a menudo hacía que el nodo fuera más grande de lo necesario. En la imagen, reproducida inmediatamente a continuación, puede ver que hay espacio extra en el margen derecho:

ingrese la descripción de la imagen aquí

Sin embargo, si usamos el varwidth paquete, este espacio extra se elimina, a pesar de que ambos están configurados para 3cm:

documentclass{article}

usepackage{tikz}
usepackage{varwidth}

begin{document}

begin{tikzpicture}
node (example-textwidth-3) [draw, text width=3cm, align=left]{This is a demonstration text for showing how line breaking works.};
end{tikzpicture}

begin{tikzpicture}
node (example-varwidth) [draw, align=left] {begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.end{varwidth}};
end{tikzpicture}

end{document}

ingrese la descripción de la imagen aquí

Discusión

En general, creo que la cuarta opción es la opción más preferida, ya que hace que el nodo sea lo más compacto posible (a menos que, por supuesto, lo haga no quiere que el nodo sea compacto).

No obstante, hay al menos dos contras de la cuarta opción que puedo pensar que es posible que desee considerar antes de determinar cómo desea implementar el texto de varias líneas dentro de un nodo TikZ, aunque creo que la primera desventaja de esta opción tiene una solución.

La primera estafa es la siguiente: como @percusse señaló en los comentarios, el varwidth paquete efectivamente hace lo mismo que lo que align hace al nodo, lo que presumiblemente causa varwidth para discutir de manera efectiva cualquier diferencia visible entre las posibles opciones para align. Entonces, si desea tener un margen alineado a la derecha en su nodo y lo especifica a través de align=right, no habrá diferencia visible entre eso y, digamos, align=left. Sin embargo, esto se puede superar haciendo uso de la ragged2e paquete, si desea que su nodo tenga un margen alineado a la derecha, pero también desea que sea lo más compacto posible (y no desea tomarse el tiempo para manipular manualmente la configuración de text width a través de un método de ‘adivinar y comprobar’):

documentclass{article}

usepackage{tikz}
usepackage{varwidth}
usepackage{ragged2e}

begin{document}

begin{tikzpicture}
node (example-varwidth-left) [draw, align=left]{begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.end{varwidth}};
end{tikzpicture}

begin{tikzpicture}
node (example-varwidth-right) [draw, align=right]{begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.end{varwidth}};
end{tikzpicture}

begin{tikzpicture}
node (example-varwidth-ragged) [draw, align=flush right] {begin{varwidth}{3cm}RaggedLeft This is a demonstration text for showing how line breaking works.end{varwidth}};
end{tikzpicture}

end{document} 

ingrese la descripción de la imagen aquí

En la imagen, puede ver que no hay diferencia entre los dos primeros nodos, pero, haciendo uso de los comandos disponibles por ragged2e produce un efecto visible en el tercer nodo.

La segunda desventaja de la cuarta opción surge si realmente desea controlar el salto de línea manualmente. los varwidth El entorno todavía intenta equilibrar las líneas a través de la separación de sílabas, lo que puede conducir, en mi opinión, a resultados desagradables:

begin{tikzpicture}
node (example-varwidth-linebreak) [draw, align=left]{begin{varwidth}{3cm}This is a demonstration \ text for showing how line breaking works.end{varwidth}};
end{tikzpicture}

ingrese la descripción de la imagen aquí

Si desea controlar manualmente el salto de línea, sugeriría la segunda opción, especificando el align argumento e inserción \es lo que quieras.

Actualización (según el comentario de @ percusse):

La razón por la que, en el caso de querer controlar manualmente los saltos de línea, la segunda opción es preferible a la cuarta opción es porque la segunda opción simplemente establece el ancho del nodo a la longitud de la línea más larga dentro del nodo. No se aplica ningún ajuste de texto ni separación de sílabas. Como resultado, no habrá, en mi opinión, una salida ‘fea’ de la segunda opción precisamente porque no se aplica el ajuste de texto ni la separación de sílabas.

Además, esta es la razón por la que he incluido la cuarta opción además de las tres indicadas en el manual de TikZ-PGF. Si desea aplicar el ajuste de texto dentro del nodo con un cierto ancho así como tener el tamaño del nodo lo más compacto posible, entonces querrás usar el varwidth medio ambiente. Compare los siguientes dos nodos, uno con align y uno con varwidth ajustado a 3cm:

begin{tikzpicture}
node (example) [draw, align=left]{This is a demonstration text for showing how line breaking works.};
end{tikzpicture}

begin{tikzpicture}
node (example) [draw]{begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.end{varwidth}};
end{tikzpicture}

ingrese la descripción de la imagen aquí


Apéndice

Estrictamente hablando, este apéndice está fuera del alcance de la pregunta; sin embargo, dada la naturaleza prevista de esta pregunta como se indica en los comentarios sobre la pregunta, pensé que agregaría que puede poner cualquiera de los entornos de lista (itemize, enumerate, y description) dentro de un nodo incrustándolo dentro de un minipage o varwidth medio ambiente. De nuevo, creo que el varwidth El entorno es preferible por las razones enumeradas (¡sin juego de palabras!) arriba.

documentclass{article}

usepackage{tikz}
usepackage{varwidth}
usepackage{enumitem}

begin{document}

begin{tikzpicture}
node [draw] (example-list) {
begin{varwidth}{3cm}
begin{enumerate}[leftmargin=*]
item{First item}
item{Second item}
end{enumerate}
end{varwidth}
};
end{tikzpicture}

end{document}

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *