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 は、「superellipse」に関する投稿へのリンクを提供しました。この投稿には、「superellipse」と呼ばれる新しい 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形状に負の値を設定するのも 1 つの方法です。ただし、代わりに、text heightおよびtext depthキーを意図的に低い値に設定して、それを回避することもできます。

他の多くのものはinner sep値に依存するため、値が負になると問題が生じます。

関連情報