¿Elipse personalizada que ahorra espacio como forma de nodo TikZ?

¿Elipse personalizada que ahorra espacio como forma de nodo TikZ?

en algunas aplicaciones, uno quiere usar elipses como formas de nodos en figuras, por ejemplo, cuando en la literatura sobre un tema normalmente se usan elipses para denotar ciertas cosas en las figuras. El problema con las elipses normales es que a menudo desperdician mucho espacio:

https://i.stack.imgur.com/0wAeX.png

Cuando una figura ya es muy ancha, las grandes "tapas de los extremos" en los extremos izquierdo y derecho de la elipse pueden resultar muy molestas, ya que consumen algo de espacio. Sería bueno si hubiera otro tipo de forma de nodo que fuera todavía redondo, pero que ahorrara más espacio. Con tapas finales más planas, una elipse alrededor de un texto puede tener un ancho menor:

https://i.stack.imgur.com/0wAeX.png

La primera de estas elipses sigue siendo normal, pero las otras están un poco "transformadas". Sin embargo, todavía son reconocibles como elipses (aunque estrictamente hablando no lo son).

El proceso de crear formas de nodos personalizadas para esto está un poco fuera de mi alcance, especialmente porque las matemáticas que implicarían calcular los límites correctos para algún contexto de nodo probablemente sean complicadas de hacer en Tikz.

Aquí está el código Python que utilicé para construir estos ejemplos: se puede ver que usar una función exponencial funciona. Pero para usar la forma del nodo en la práctica, probablemente sea un poco más importante tener la funcionalidad de dibujar dichas formas en el propio LaTeX.

#!/usr/bin/python
import math

def moreimpact(x,base):
    if x<0:
        return -math.pow(-x,base)
    else:
        return math.pow(x,base)

print "\\documentclass{article}"
print "\\usepackage{tikz}"
print "\\usetikzlibrary{shapes}"
print "\\begin{document}"
print "\\begin{tikzpicture}"
print "\\node[draw,shape=ellipse,inner sep=1pt] (f1) at (0,2) {This is a long text that leads to a very large ellipse};"

for j in xrange(0,4):
    print "\\draw",
    for i in xrange(0,360):
        if i!=0:
            print " -- ",
        xpos = math.cos(i/180.0*math.pi)
        ypos = math.sin(i/180.0*math.pi)
        print "(%f,%f)" % (5*moreimpact(xpos,1.0-0.1*j),0.3*moreimpact(ypos,1.0-0.1*j)-j*1.2),
    print " -- cycle;"
print "\\end{tikzpicture}"
print "\\end{document}"

¿Alguien sabe cómo definir una nueva forma de nodo para una "elipse comprimida" o algo similar en TikZ (óptimamente parametrizado por lo que llamé "impacto" en el código anterior)? La respuesta probablemente sea útil para muchas personas, ya que creo que esta forma de nodo es bastante útil en situaciones en las que hay poco espacio para una figura (por ejemplo, presentaciones) y ya se utilizan rectángulos o rectángulos con esquinas redondeadas para denotar algo diferente. .

EDITAR:Qrrbrbirlbel proporcionó un enlace a una publicación sobre una "superelipse", que contiene código para una nueva forma de nodo TikZ llamada "superelipse". Esto es precisamente lo que se ha pedido. Es una pena que el cálculo del tamaño no funcione realmente:

\node[shape=superellipse,superellipse parameter=3] at (2,3) {This is a long text that leads to a very large ellipse};

Un nodo que es demasiado grande

Esto se puede solucionar agregando espacios negativos, pero es solo una solución alternativa.

Respuesta1

De los comentarios; establecer un valor negativo inner sepde la forma de Jake superellipsees un camino a seguir. Pero en lugar de eso, puedes configurar las teclas text heighty text depthdeliberadamente para reducir los valores y salirte con la tuya.

Muchas otras cosas dependen de inner sepvalores, por lo que los valores negativos son causa de problemas.

información relacionada