How do I create a circled symbol in Mathematica?
Asked Answered
S

5

11

I know that Framed is used to show a frame around a symbol, how can I show a circle around a symbol?

Sequester answered 29/10, 2011 at 22:10 Comment(2)
do you mind if the output is a Graphics object?Ewan
@yoda If that can be put into a DisplayFormula cell with regular TraditionalForm math symbols, e.g. put braces around it.Sequester
M
8

If you don't mind having to micromanage the alignment parameters, you can overlay the empty circle character over a symbol:

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

circled "x"

The exhibited font size and alignment parameters work for the font on my machine, but you may have to tweak them for good results on your screen. And tweak them again for a decent print-out. The following Manipulate can aid in that process:

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

Mosesmosey answered 30/10, 2011 at 0:15 Comment(0)
H
8

Here is an attempt to create a function that circles arbitrary expressions. It's rather clumsy, but I cannot think of a better way at the moment.

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


circled[1/x + y + z]

enter image description here

Harbin answered 30/10, 2011 at 2:29 Comment(11)
What's the benefit of writing 1*^6 instead of 10^6?Ewan
@yoda, nothing, just habit. 1*^6 is my default "large value" and when I see it I often know it is just that: an arbitrary "large" number. There is one related thing: at the extreme end of things, there is one less operation with 1*^x than with 10^x. For example: Timing[a = 1*^60000000;] and Timing[b = 10^60000000;].Harbin
@yoda Or, perhaps more relevantly: Timing@Do[1*^6, {50000000}] versus Timing@Do[10^6, {50000000}].Harbin
@Mr. I am not the only one being noticed of the convoluted code you are writing lately ....Luxembourg
@bel Can you do better? Put up or shut up. ;-)) (I know, this is pretty ugly, but I honestly cannot think of a better way.)Harbin
@Harbin Thanks, I wasn't aware of that performance difference. In this case however, I think it obfuscates more than it educates, but I understand, habits die hard.Ewan
@Mr. If you want to frame whole expressions (and not just simple symbols) the Pane[] size should take the largest diagonal into account. See circled["3((1/x+y+z)/h)\n2\nm\np"]Luxembourg
@bel what should I be seeing in that example?Harbin
@belisarius that's not what I see! I guess it is system (or setting?) dependent. i.sstatic.net/tARbx.gifHarbin
@Mr. Ha! So I posted an answer to solve a semi-existent problem :)Luxembourg
@belisarius @Mr I get what belisarius gets, but in TraditionalForm it's more like what Mr. Wizard gets.Sequester
H
7

Framed can take an option RoundingRadius.

Framed[expr, RoundingRadius -> radius]

At smaller values of radius the corners of the frame are simply slightly rounded, but at larger values, the frame becomes an oval or circle.

Himyarite answered 29/10, 2011 at 22:16 Comment(4)
A combination of nondefault values of RoundingRadius and FrameMargins seems to do it, but it takes a different combination for each expression I want to put in a circleSequester
I was hoping you'd be fine with ovals... I'm not aware of a better solution.Himyarite
Maybe there's a way to programmaticly calculate the right values of the options.Sequester
Anybody able to whip up a palette button to do this? I've got a palette with a single button to overstrike a selection (from this: mathematica.stackexchange.com/a/112407/23076), and I'd love to add a button to automatically circle it. I'm not so hot with palettes yet…Cephalopod
L
3

The same idea of WReach, but trying to autocalculate:

cirBeli[x_] := 
 TraditionalForm@
    Style[Overlay[{#, 
       Style[\[EmptyCircle], 
        N@2 Norm[ImageDimensions[Rasterize[#]][[1 ;; 2]]]]}, 
      Alignment -> Center], "DisplayFormula"] &@x

cirBeli[x]

enter image description here

Luxembourg answered 30/10, 2011 at 14:42 Comment(2)
In cirBeli[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]], the expression is not in the middle of the circle.Sequester
@Sequester The problem is that "[EmptyCircle]" is not vertically centered. Let's see if I can fix it.Luxembourg
L
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

Edit

The following seems to work better with 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

Luxembourg answered 31/10, 2011 at 0:52 Comment(4)
How do you use this with TraditionalForm?Sequester
@Sequester As TraditionalForm renders with different horizontal and vertical size under Rasterize[], there is no a straightforward way, AFAIK.Luxembourg
FWIW, this method behaves strangely when the window is narrower than the object, at least for me. Example: i.sstatic.net/ScOKg.gifHarbin
@Mr. Thanks! Perhaps I'll take a look at it again tomorrow. Time to sleep now.Luxembourg

© 2022 - 2025 — McMap. All rights reserved.