On Mon, 2006-01-23 at 11:11 +0100, Helge Hafting wrote: > Martin Vermeer wrote: > > >On Sat, Jan 21, 2006 at 02:09:29AM +0100, Helge Hafting wrote: > > > > > >>Create a memoir document. > >>Insert a figure float, with picture and caption. > >>Mark everything inside the float, insert a minipage. > >>Observe that the lyx GUI now call the caption "meaningless" > >>instead of the usual "Figure #". It is as if a caption somehow > >>was entered outside a float (where they are meanlingless.) > >> > >>This is wrong, for latex have no problem with this. There are two common > >>reasons for doing this: > >>1. want to tweak caption placement a bit > >>2. want to have several captions in a float, e.g. in order to > >> seemingly have two floating figures side by side. This is a > >> common trick which used to work well. > >> > >>Something screwed up in the detection of whether or not the caption > >>ultimately is inside a float? > >> > >> > > > >Weird... this ought to work right. The code is in buffer_funcs.C: > > > > 471 } else if (layout->labeltype == LABEL_SENSITIVE) { > > 472 // Search for the first float or wrap inset in the > > iterator > > 473 string type; > > 474 size_t i = it.depth(); > > 475 while (i > 0) { > > 476 --i; > > 477 InsetBase * const in = &it[i].inset(); > > 478 if (in->lyxCode() == InsetBase::FLOAT_CODE > > 479 || in->lyxCode() == InsetBase::WRAP_CODE) > > 480 type = in->getInsetName(); > > 481 break; > > 482 } > > 483 > > 484 string s; > > 485 if (!type.empty()) { > > 486 Floating const & fl = > > textclass.floats().getType(type); > > 487 > > 488 counters.step(fl.type()); > > 489 > > 490 // Doesn't work... yet. > > 491 s = bformat(_("%1$s #:"), buf.B_(fl.name())); > > 492 } else { > > > >As you see, it searches the cursor stack in the "outward" direction for a > >Float or Wrap inset, happily using the first it finds... could you add > >debug instrumentation (lyxerr) to this code to see what really happens? > > > > > No need for instrumentation, I see something very suspicious here. > > Your "while" loop will always break on the first iteration, because > your if-statement does _not_ use {} and is followed by a break. > I added the missing {}, a tested patch is attached. > > I hope this can go in as a trivial/obvious fix.
Ah, the infamous missing brackets bug! I've been bitten by this before... Will commit shortly. - Martin > Test results: > 1. label inside a float is still ok > 2. label inside minipage inside float is now ok too > 3. label inside 2 & 3 levels of minipages inside a float is now ok too > 4. label inside one or more minipages not in a float is still > meaningless, as it should. > > Helge Hafting > > plain text document attachment (buffer_funcs.diff) > ? buffer_funcs.diff > ? frontends/gnome/.deps > ? frontends/gnome/Makefile > ? frontends/gnome/Makefile.in > ? mathed/math_nestinset.C.testing > Index: ChangeLog > =================================================================== > RCS file: /var/cvs/lyx/lyx-devel/src/ChangeLog,v > retrieving revision 1.2359 > diff -u -p -u -r1.2359 ChangeLog > --- ChangeLog 19 Jan 2006 21:18:23 -0000 1.2359 > +++ ChangeLog 23 Jan 2006 09:59:46 -0000 > @@ -1,3 +1,8 @@ > +2006-01-23 Helge Hafting <[EMAIL PROTECTED]> > + * buffer_funcs.C: Trivial fix - added {} around > + the statements to be affected by a if-test. Now > + label in a minipage in a float looks ok on screen again. > + > 2006-01-11 Georg Baum <[EMAIL PROTECTED]> > > * converter.C (convert): handle unknown formats > Index: buffer_funcs.C > =================================================================== > RCS file: /var/cvs/lyx/lyx-devel/src/buffer_funcs.C,v > retrieving revision 1.35 > diff -u -p -u -r1.35 buffer_funcs.C > --- buffer_funcs.C 29 Nov 2005 13:39:03 -0000 1.35 > +++ buffer_funcs.C 23 Jan 2006 09:59:46 -0000 > @@ -476,9 +476,10 @@ void setCounter(Buffer const & buf, ParI > --i; > InsetBase * const in = &it[i].inset(); > if (in->lyxCode() == InsetBase::FLOAT_CODE > - || in->lyxCode() == InsetBase::WRAP_CODE) > + || in->lyxCode() == InsetBase::WRAP_CODE) { > type = in->getInsetName(); > break; > + } > } > > string s;
signature.asc
Description: This is a digitally signed message part