如何在Mathematica中创建一个圆形符号?

11

我知道Framed用于在符号周围显示一个框架,那我如何在符号周围显示一个圆形呢?


输出结果如果是Graphics对象,您介意吗? - user616736
@yoda 如果可以将其放入带有常规传统数学符号的DisplayFormula单元格中,例如在其周围加上大括号。 - Andrew
5个回答

8

如果您不介意需要微调对齐参数,可以将空圆圈字符覆盖在符号上:

TraditionalForm @ Style[
  Overlay[{x, Style[\[EmptyCircle], 24]}, Alignment -> {0.075, 0.16}]
, "DisplayFormula"
]

圆形的“x”

展示的字体大小和对齐参数适用于我的计算机上的字体,但您可能需要调整它们以在您的屏幕上获得良好的结果。并且为了获得良好的打印效果,您可能需要再次进行调整。以下的Manipulate可以帮助您完成这个过程:

Manipulate[
  TraditionalForm @ Style[
    Overlay[
      {Style[x, xSize], Style[\[EmptyCircle], circleSize]}
    , Alignment -> {xAlign, yAlign}
    ]
  , "DisplayFormula"
  ]
, {{xSize, 12}, 8, 40, 1, Appearance -> "Labeled"}
, {{circleSize, 24}, 8, 40, 1, Appearance -> "Labeled"}
, {{xAlign, 0.075}, -1, 1, Appearance -> "Labeled"}
, {{yAlign, 0.016}, -1, 1, Appearance -> "Labeled"}
]

image adjustment manipulator


8

这里是一种尝试创建环绕任意表达式的函数的方法。它相当笨拙,但目前我想不到更好的方法。

circled =
    With[{m = Max@Rasterize[#,"RasterSize"]},
       Framed[
         Pane[#, {m, m}, Alignment -> Center],
         RoundingRadius -> 1*^6]
    ] &;


circled[1/x + y + z]

enter image description here


1
1*^6而不是10^6有什么好处? - user616736
1
@yoda,没什么,只是习惯而已。1*^6 是我默认的“大值”,当我看到它时,通常知道它只是一个任意的“大”数。还有一件相关的事情:在极端情况下,使用 1*^x 比使用 10^x 少一次操作。例如:Timing[a = 1*^60000000;]Timing[b = 10^60000000;] - Mr.Wizard
1
@Mr.Wizard 感谢提醒,我之前并不知道这个性能差异。不过,在这种情况下,我认为它更加混淆而不是帮助理解。但是我明白,习惯很难改变。 - user616736
1
@Mr. 如果您想构建整个表达式(而不仅仅是简单的符号),则Pane[]大小应考虑最大对角线。请参见circled["3((1/x+y+z)/h)\n2\nm\np"] - Dr. belisarius
@bel 在那个例子中我应该看到什么? - Mr.Wizard
显示剩余6条评论

7

Framed 可以使用选项 RoundingRadius 来设置圆角。

Framed[expr, RoundingRadius -> radius]

radius 值较小时,框架的角落只是稍微圆润一点,但当值较大时,框架会变成椭圆形或圆形。


3
似乎采用非默认值的“RoundingRadius”和“FrameMargins”组合可以实现,但每个我想放入圆形中的表达式都需要不同的组合。 - Andrew
我希望你能接受椭圆形... 我不知道有更好的解决方案。 - John Flatness
也许有一种编程方式可以计算选项的正确值。 - Andrew
有人能快速制作一个调色板按钮来实现这个功能吗?我有一个调色板,里面只有一个按钮可以覆盖选定的内容(参考:http://mathematica.stackexchange.com/a/112407/23076),我想再添加一个按钮来自动加圆圈。但是我对调色板不是很熟悉... - ibeatty

3
相同的思路,但尝试自动计算:
cirBeli[x_] := 
 TraditionalForm@
    Style[Overlay[{#, 
       Style[\[EmptyCircle], 
        N@2 Norm[ImageDimensions[Rasterize[#]][[1 ;; 2]]]]}, 
      Alignment -> Center], "DisplayFormula"] &@x

cirBeli[x]

enter image description here


cirBeli[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]] 中,表达式不在圆的中心。 - Andrew
@Andrew 问题在于"[EmptyCircle]"没有垂直居中。让我看看能否修复它。 - Dr. belisarius

2

Using Framed[ ] with RoundingRadius

f = Rasterize[#, "RasterSize"] &;
circledBeli[x_] := Framed[ x,
                    FrameMargins -> (Norm@f@x - Array[1 &, {2, 2}] f@x)/2,
                    RoundingRadius -> Norm@f@x];

circledBeli[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]]

enter image description here

circledBeli["3((1/x+y+z)/h)\n2\nm\np"]

enter image description here

编辑

以下内容在使用TraditionalForm时效果更佳:

f = ImageDimensions[Rasterize[#]][[1 ;; 2]] &;
g = Reverse[ImageDimensions[Rasterize[Rotate[#, Pi/2]]][[1 ;; 2]]] &;
h = Max /@ Transpose@{f@#, g@#} &;
circledBeli[x_] := 
  Framed[x, FrameMargins -> (Norm@h@x - Array[1 &, {2, 2}] h@x)/2, 
   RoundingRadius -> Norm@h@x];
t = TraditionalForm[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]]
circledBeli[t]

enter image description here


你如何在 TraditionalForm 中使用这个? - Andrew
@Andrew 在使用 Rasterize[] 时,由于 TraditionalForm 渲染出的水平和垂直大小不同,因此没有一种简单直接的方法,据我所知。 - Dr. belisarius
就我个人而言,当窗口比对象更窄时,这种方法的行为会变得奇怪。例如:http://i.stack.imgur.com/ScOKg.gif - Mr.Wizard
@Mr. 谢谢!也许我明天会再看一下它。现在是睡觉的时间了。 - Dr. belisarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接