Как мне создать символ, обведенный кружком, в Mathematica?

#wolfram-mathematica #typesetting #mathematical-typesetting

#wolfram-mathematica #набор текста #математический-набор текста

Вопрос:

Я знаю, что Framed это используется для отображения рамки вокруг символа, как я могу показать круг вокруг символа?

Комментарии:

1. вы не возражаете, если результатом будет Graphics объект?

2. @yoda, если это можно поместить в ячейку DisplayFormula с обычными математическими символами TraditionalForm, например, обведите ее фигурными скобками.

Ответ №1:

Если вы не возражаете против микроуправления параметрами выравнивания, вы можете наложить пустой символ круга на символ:

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

обведенный quot;xquot;

Отображаемые параметры размера и выравнивания шрифта работают для шрифта на моей машине, но вам, возможно, придется настроить их для получения хороших результатов на вашем экране. И настройте их снова для приличной распечатки. В 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]
    ] amp;;


circled[1/x   y   z]
 

введите описание изображения здесь

Комментарии:

1. В чем преимущество написания 1*^6 вместо 10^6 ?

2. @yoda, ничего, просто привычка. 1*^6 является ли мое значение по умолчанию «большим значением», и когда я вижу его, я часто знаю, что это именно так: произвольное «большое» число. Есть одна связанная вещь: в конце концов, на одну операцию меньше 1*^x , чем на with 10^x . Например: Timing[a = 1*^60000000;] и Timing[b = 10^60000000;] .

3. @yoda Или, возможно, более уместно: Timing@Do[1*^6, {50000000}] versus Timing@Do[10^6, {50000000}] .

4. @Mr.Wizard Спасибо, я не знал об этой разнице в производительности. Однако в этом случае я думаю, что это запутывает больше, чем обучает, но я понимаю, привычки умирают с трудом.

5. @Mr. Если вы хотите создавать целые выражения (а не только простые символы), размер панели [] должен учитывать наибольшую диагональ. См. circled["3((1/x y z)/h)n2nmnp"]

Ответ №3:

Framed можно выбрать вариант RoundingRadius .

 Framed[expr, RoundingRadius -> radius]
 

При меньших значениях radius углы рамки просто слегка закругляются, но при больших значениях рамка становится овальной или круглой.

Комментарии:

1. RoundingRadius Кажется, что это делает комбинация значений по умолчанию FrameMargins и, но для каждого выражения, которое я хочу поместить в круг, требуется другая комбинация

2. Я надеялся, что вы справитесь с овалами… Я не знаю лучшего решения.

3. Может быть, есть способ программно вычислить правильные значения параметров.

4. Кто-нибудь может нажать кнопку палитры, чтобы сделать это? У меня есть палитра с одной кнопкой, чтобы переопределить выделение (из этого: 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"] amp;@x

cirBeli[x]
 

введите описание изображения здесь

Комментарии:

1. В cirBeli[Sin[z^2]/Exp[z] Integrate[Sin[x] Cos[x] Sqrt[x], x]] , выражение не находится в середине круга.

2. @Andrew Проблема в том, что «[EmptyCircle]» не центрирован по вертикали. Давайте посмотрим, смогу ли я это исправить.

Ответ №5:

Использование Framed[ ] с RoundingRadius

 f = Rasterize[#, "RasterSize"] amp;;
circledBeli[x_] := Framed[ x,
                    FrameMargins -> (Norm@f@x - Array[1 amp;, {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)n2nmnp"]
 

введите описание изображения здесь

Редактировать

Кажется, что следующее работает лучше с TraditionalForm:

 f = ImageDimensions[Rasterize[#]][[1 ;; 2]] amp;;
g = Reverse[ImageDimensions[Rasterize[Rotate[#, Pi/2]]][[1 ;; 2]]] amp;;
h = Max /@ Transpose@{f@#, g@#} amp;;
circledBeli[x_] := 
  Framed[x, FrameMargins -> (Norm@h@x - Array[1 amp;, {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]
 

введите описание изображения здесь

Комментарии:

1. Как вы используете это с TraditionalForm ?

2. @Andrew Поскольку TraditionalForm отображает с разным размером по горизонтали и вертикали при растеризации [], простого способа нет, AFAIK.

3. Черт возьми, этот метод ведет себя странно, когда окно уже объекта, по крайней мере, для меня. Пример: i.stack.imgur.com/ScOKg.gif

4. @Mr. Спасибо! Возможно, я посмотрю на это снова завтра. Теперь пора спать.