V 8.04. Это только в контексте Manipulate
use.
Вот простой пример использования элемента для размещения элементов управления в разных местах пользовательского интерфейса с помощью манипуляции
Manipulate[Plot[Sin[z], {z, -Pi, Pi}, ImageSize -> 100],
Item[Control[{{x, 0, "x="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1,ImageSize->Tiny}],ControlPlacement->Right]
]
Тем не менее, я использую макро-метод Леонида (ссылка здесь ), чтобы помочь мне создать свои элементы управления пользовательским интерфейсом, поэтому я хотел бы сделать что-то вроде
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}],ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
]
]
Выше не работает, потому что у нас больше нет ОДНОГО выражения, чтобы осчастливить With
, который имеет синтаксис
With[{x=x0}, expression ]
И в вышеприведенном 2 Item
s теперь не ОДНО выражение, а 2.
Эта проблема появляется только тогда, когда я хочу использовать Item
для управления размещением. В противном случае я бы использовал Grid[]
и соединил свои разные вещи внутри Grid
, и тогда проблема была бы решена.
Но я, конечно, не могу использовать Item
внутри сетки, чтобы каждый Item
находился в другом месте. Все Grid
должно быть в одном месте.
Я думал, что обернуть 2 элемента в Sequence[]
может работать, но это не так.
вопрос в следующем: есть ли уловка, чтобы объединить 2 вышеупомянутых предмета в ОДНО выражение, чтобы сделать С счастливым?
В настоящее время я решаю эту проблему в своем пользовательском интерфейсе, просто разбивая вещи на 2 отдельных With
, например:
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}],
ControlPlacement -> Left]
],
Evaluate@With[{im = ImageSize -> Tiny},
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}],
ControlPlacement -> Right]
]
]
И все работает отлично.
Но, конечно, в приведенном выше тексте я теряю некоторые преимуществ использования имен макросов для совместного использования между многими кодами построения элементов управления.
обновление 26.12.11 20:37
Вот пример использования одного макроса внутри другого. Я думаю, что это проблема Hold. Уловка, показанная ниже, не работает для этого. Постараюсь выяснить это: (На практике я использую макросы 2 уровней, так как я определяю некоторые макросы на одном уровне и использую их для создания макросов более высокого уровня на втором уровне. Здесь я показываю только очень простой пример того, что я имею в виду)
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{im = ImageSize -> Tiny},
Evaluate@With[{},
## &[
Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
]
]
]
]
Я почти уверен, что мне нужно HoldAll
вещь, чтобы вставить в нужное место, чтобы разобраться с этим. Постараюсь разобраться и доложить здесь. Кофе почти готов;)
обновление 9 вечера
Хорошо, MrWizard показал мне проблему с выше. Я должен не иметь оценку на внутренних макросах. Я забыл об этом. Вот оно сейчас, отлично работает:
Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
Evaluate@With[{},
With[{},
## &[
Item[Control[{{x, 0, "x="}, 0, 10, 1}], ControlPlacement -> Left],
Item[Control[{{y, 0, "y="}, 0, 10, 1}], ControlPlacement -> Right]
]
](*close second With*)
](*close first With*)
](*close Manipulate*)
Спасибо за ответ, оба очень полезны.