在某些应用中,人们希望使用椭圆作为图形中的节点形状,例如,在有关某个主题的文献中通常使用椭圆来表示图形中的某些事物。普通椭圆的问题在于它们通常会浪费大量空间:
当图形已经非常宽时,椭圆左端和右端的大“端盖”可能会非常烦人,因为它们会占用一些空间。如果有另一种仍然是圆形但更节省空间的节点形状类型就好了。使用更平坦的端盖,某些文本周围的椭圆可以具有较低的宽度:
第一个椭圆仍然是正常的,但其他的椭圆有些“变形”。不过,它们仍然可以识别为椭圆(尽管严格来说它们不是)。
为此构建自定义节点形状的过程有点超出我的理解范围,特别是因为在 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
Jake 形状的负值superellipse
是一种方法。但是,您可以故意将text height
和text depth
键设置为较低的值,这样就可以了。
许多其他事物都取决于inner sep
价值观,因此,它的负值会带来麻烦。