将2个Item []表达式组合到一个表达式以便在宏中使用的任何技巧?

Nas*_*ser 4 wolfram-mathematica

V 8.04.这Manipulate仅限于使用.

下面是一个使用Item将控件放在UI中使用Manipulate在不同位置的简单示例

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]
 ]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,我使用Leonid的宏方法(链接在这里)来帮助我构建我的UI控件,所以我想做类似的事情

 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]

   ]    
 ]
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用,因为我们不再有一个表达式来使With快乐,它具有语法

 With[{x=x0}, expression ]
Run Code Online (Sandbox Code Playgroud)

而在上面,2 Items现在不是一个表达式,而是2.

仅当我想Item用于控制放置时,才会出现此问题.否则,我会Grid[]在里面使用和组合我不同的东西Grid,然后问题就解决了.

但我当然不能Item在网格中使用,以使每个Item位于不同的位置.整体Grid必须在一个地方.

我认为将2个项目包装在一个Sequence[]可能有效但但事实并非如此.

问题是:将上述两个项目组合成一个表达式以使得快乐的任何技巧?

目前我在我的UI中通过简单地将事物分成两个单独的Withs来解决这个问题,如下所示:

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]
   ]

 ]
Run Code Online (Sandbox Code Playgroud)

它工作正常.

但是,当然,在上面,我失去使用宏名称在许多控制构造代码之间共享的一些好处.

更新12/26/11 8:37 PM

这是一个例子,在另一个内部使用一个宏.我认为这是一个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]
      ]

     ]
   ]
 ]
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定我需要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*)
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答,非常有用.

Bre*_*ion 7

使用Sequence,也许像:

Manipulate[
   Plot[Sin[z], {z, -Pi, Pi}], 
   Evaluate@With[{im = ImageSize -> Tiny}, 
      Sequence @@ {
         Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left], 
         Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
         }
      ]
   ]
Run Code Online (Sandbox Code Playgroud)

编辑

相同的方法,但有一个不同的宏(警告,这种方式导致疯狂......)

Manipulate[
   Plot[Sin[z], {z, -Pi, Pi}], 
   Evaluate @ With[{
      control = Function[{var, name, place}, 
         Item[Control[{{var, 0, name <> "="}, 0, 10, 1, ImageSize -> Tiny}],  ControlPlacement -> place], 
         HoldAll
         ]}, 
   Sequence @@ {control[x, "x", Left], control[y, "y", Right]}
   ]]
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ard 6

别忘了SequenceApply.

Manipulate[Plot[Sin[z], {z, -Pi, Pi}],
 Evaluate[
  Sequence @@ With[{im = ImageSize -> Tiny},
    Hold[
     Item[Control[{{x, 0, "x="}, 0, 10, 1, im}], ControlPlacement -> Left],
     Item[Control[{{y, 0, "y="}, 0, 10, 1, im}], ControlPlacement -> Right]
    ]
   ]
]]
Run Code Online (Sandbox Code Playgroud)

Mathematica图形

布雷特的回答让我意识到同样的事情可以更加简洁地完成:

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]
   ]
  ]
] 
Run Code Online (Sandbox Code Playgroud)

由于With没有SequenceHold属性我们不能简单地做[Sequence,Item],但我们可以使用## &[Item, Item]因为&延迟评估.