【问题标题】:How do I create a circled symbol in Mathematica?如何在 Mathematica 中创建带圆圈的符号?
【发布时间】:2011-12-18 00:37:24
【问题描述】:

我知道Framed是用来在符号周围显示一个框架的,如何在符号周围显示一个圆圈?

【问题讨论】:

  • 您介意输出是Graphics 对象吗?
  • @yoda 如果可以将其放入具有常规传统形式数学符号的 DisplayFormula 单元格中,例如在它周围放大括号。

标签: wolfram-mathematica typesetting mathematical-typesetting


【解决方案1】:

如果您不介意对对齐参数进行微观管理,可以将空圆圈字符覆盖在符号上:

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

显示的字体大小和对齐参数适用于我机器上的字体,但您可能需要调整它们才能在屏幕上获得良好效果。并再次调整它们以获得体面的打印输出。以下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"}
]

【讨论】:

    【解决方案2】:

    这里尝试创建一个循环任意表达式的函数。这有点笨拙,但我目前想不出更好的方法。

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

    【讨论】:

    • 1*^6而不是10^6有什么好处?
    • @yoda,没什么,只是习惯。 1*^6 是我默认的“大值”,当我看到它时,我经常知道它就是:一个任意的“大”数。有一件相关的事情:在事情的极端,1*^x10^x 少了一项操作。例如:Timing[a = 1*^60000000;]Timing[b = 10^60000000;]
    • @yoda 或者,也许更相关:Timing@Do[1*^6, {50000000}]Timing@Do[10^6, {50000000}]
    • @Mr.Wizard 谢谢,我不知道这种性能差异。然而,在这种情况下,我认为它混淆了比它教育更多,但我理解,习惯很难改掉。
    • @Mr.如果您想框住整个表达式(而不仅仅是简单的符号),则 Pane[] 大小应该考虑最大的对角线。见circled["3((1/x+y+z)/h)\n2\nm\np"]
    【解决方案3】:

    Framed 可以选择RoundingRadius

    Framed[expr, RoundingRadius -> radius]
    

    radius 的值较小时,框架的角只是略微圆润,但值较大时,框架变成椭圆形或圆形。

    【讨论】:

    • RoundingRadiusFrameMargins 的非默认值的组合似乎可以做到这一点,但对于我想放在一个圆圈中的每个表达式,它需要不同的组合
    • 我希望你对椭圆没问题...我不知道有更好的解决方案。
    • 也许有办法以编程方式计算选项的正确值。
    • 任何人都能够掀起一个调色板按钮来做到这一点?我有一个带有单个按钮的调色板来覆盖选择(来自:mathematica.stackexchange.com/a/112407/23076),我很想添加一个按钮来自动圈出它。我对调色板还不是很热……
    【解决方案4】:

    与 WReach 的想法相同,但尝试自动计算:

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

    【讨论】:

    • cirBeli[Sin[z^2]/Exp[z] + Integrate[Sin[x] Cos[x] Sqrt[x], x]]中,表达式不在圆圈中间。
    • @Andrew 问题是“[EmptyCircle]”没有垂直居中。让我们看看我能不能解决它。
    【解决方案5】:

    将 Framed[ ] 与 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]]
    

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

    编辑

    以下似乎更适用于传统形式:

    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]
    

    【讨论】:

    • 你如何将它与TraditionalForm一起使用?
    • @Andrew 由于在 Rasterize[] 下,TraditionalForm 以不同的水平和垂直尺寸呈现,没有直接的方法,AFAIK。
    • FWIW,当窗口比对象窄时,这种方法的行为很奇怪,至少对我来说是这样。示例:i.stack.imgur.com/ScOKg.gif
    • @Mr.谢谢!也许明天我会再看一遍。现在该睡觉了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多