自定义、节省空间的椭圆作为 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 sepJake 形状的负值superellipse是一种方法。但是,您可以故意将text heighttext depth键设置为较低的值,这样就可以了。

许多其他事物都取决于inner sep价值观,因此,它的负值会带来麻烦。

相关内容