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}
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}
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}
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}
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}
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.
(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:
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}
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}
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}
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}
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}