#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"
]
Отображаемые параметры размера и выравнивания шрифта работают для шрифта на моей машине, но вам, возможно, придется настроить их для получения хороших результатов на вашем экране. И настройте их снова для приличной распечатки. В 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
, чем на with10^x
. Например:Timing[a = 1*^60000000;]
иTiming[b = 10^60000000;]
.3. @yoda Или, возможно, более уместно:
Timing@Do[1*^6, {50000000}]
versusTiming@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. Спасибо! Возможно, я посмотрю на это снова завтра. Теперь пора спать.