Пользовательский, экономящий место эллипс в форме узла TikZ?

Пользовательский, экономящий место эллипс в форме узла TikZ?

в некоторых приложениях требуется использовать эллипсы в качестве узловых форм на рисунках, например, когда в литературе по теме обычно используются эллипсы для обозначения определенных вещей на рисунках. Проблема с обычными эллипсами в том, что они часто тратят много места:

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

Если фигура уже очень широкая, то большие "концевые заглушки" на левом и правом концах эллипса могут быть очень раздражающими, так как они занимают некоторое пространство. Было бы неплохо, если бы был другой тип формы узла, который все еще круглый, но экономит больше места. С более плоскими конечными заглушками эллипс вокруг некоторого текста может иметь немного меньшую ширину:

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

Первый из этих эллипсов все еще нормальный, но другие немного "трансформировались". Они все еще узнаваемы как эллипсы (хотя, строго говоря, они таковыми не являются).

Процесс создания пользовательских форм узлов для этого немного выше моего понимания, особенно потому, что математические вычисления, которые потребуются для вычисления правильных границ для некоторого контекста узлов, вероятно, сложны для выполнения в Tikz.

Вот код Python, который я использовал для построения этих примеров: можно увидеть, что использование экспоненциальной функции делает свое дело. Но для использования формы узла на практике, вероятно, немного важнее иметь функциональность рисования таких форм в самом 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}"

Кто-нибудь знает, как определить новую форму узла для такого "сжатого эллипса" или чего-то подобного в TikZ (оптимально параметризованного тем, что я назвал "воздействием" в коде выше)? Ответ, вероятно, будет полезен для многих, так как я считаю, что эта форма узла весьма полезна в ситуациях, в которых мало места для фигуры (например, презентации), а прямоугольники или прямоугольники со скругленными углами уже принимаются для обозначения чего-то другого.

РЕДАКТИРОВАТЬ:Qrrbrbirlbel предоставил ссылку на пост о "суперэллипс", который содержит некоторый код для новой формы узла TikZ под названием "суперэллипс". Это именно то, о чем просили. Жаль только, что вычисление размера не работает:

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

Слишком большой узел

Эту проблему можно обойти, добавив отрицательные пробелы, но это всего лишь обходной путь.

решение1

Из комментариев: установка отрицательного inner sepзначения формы Джейка superellipse— один из способов. Но вместо этого вы можете установить клавиши text heightи text depthнамеренно на более низкие значения и избежать этого.

От ценностей зависят многие другие вещи, inner sepпоэтому отрицательные значения — это повод для неприятностей.

Связанный контент