Am Freitag, 27. Januar 2006 03:20 schrieb Beck, Andrew Thomas - BECAT001:
> OK, here is a better formatted patch, preserving encoding etc. Thanks
> for the feedback. The update is still being done in metrics() in the
> same way that the macro expansion was being done previously. I have
> changed it to cast away the const-ness rather than make cells_ mutable.
> Assuming that the interface & function of the patch is acceptable I
> will now implement a doDispatch(). In addition to changing the name
> & number of arguments, I will also remove the expansion from metrics().
> This will also negate the need for the mutable on MathMacro::tmpl_ and 
> MathMacro::expanded_.

Good.

> If I rename a macro template, does it seem reasonable to automatically 
> update the name in all instantiations of that template?

I am not sure. What if a user wants to copy an existing macro template and 
give it a new name?


Here follow some comments:

> --- text3.C     31 Dec 2005 11:40:32 -0000      1.323
> +++ text3.C     27 Jan 2006 02:06:30 -0000
> @@ -1254,10 +1254,10 @@
>                 else {
>                         string s = cmd.argument;
>                         string const s1 = token(s, ' ', 1);
> -                       int const nargs = s1.empty() ? 0 : 
convert<int>(s1);
> +//                     int const nargs = s1.empty() ? 0 : 
convert<int>(s1);
>                         string const s2 = token(s, ' ', 2);
>                         string const type = s2.empty() ? "newcommand" : 
s2;
> -                       cur.insert(new MathMacroTemplate(token(s, ' ', 
0), nargs, type));
> +                       cur.insert(new MathMacroTemplate(token(s, ' ', 
0), s1, type));

I think it is better not to make the internal storage of the number of 
arguments visible here. Simply provide an additional constructor with an 
int argument that does the conversion.

> -               MacroTable::globalMacros().get(name()).expand(cells_, 
expanded_);
> -               expanded_.metrics(mi, dim);
> +               const idx_type defArgs = 
static_cast<idx_type>(MacroTable::globalMacros().get(name()).numargs());

That should work without the cast.

> +               if (nargs() < defArgs)
> +                       ((MathMacro*)this)->cells_.resize(defArgs);
> +  
> +               if (editing(mi.base.bv)) {
> 
+                       asArray(MacroTable::globalMacros().get(name()).def(), 
tmpl_);
> +                       LyXFont font = mi.base.font;
> +                       augmentFont(font, "lyxtex");
> +                       tmpl_.metrics(mi, dim);
> +                       dim.wid += mathed_string_width(font, name()) + 
10;
> +               int ww = mathed_string_width(font, "#1: ");

Indentation is wrong. Please use tabs for logical indenting, and spaces 
for alignment (e.g. for an if-clause over several lines)

> --- mathed/math_macro.h 5 Oct 2005 21:19:32 -0000       1.103
> +++ mathed/math_macro.h 27 Jan 2006 02:06:39 -0000
> @@ -55,10 +55,14 @@
>         ///
>         void infoize2(std::ostream &) const;
>  
> -private:
> -       virtual std::auto_ptr<InsetBase> doClone() const;
> +       virtual MathMacro *asMacro() { return this; }
> +       virtual MathMacro const *asMacro() const { return this; }

Here you have one of the broken points that I mentioned in my earlier 
mail: asMacro() is already defined in math_inset.h and used elsewere, but 
always returns 0!

The overall approach looks sensible. Provided you get rid of the 
const_casts and find a way to update existing macros not in the metrics 
function this would be a nice feature for 1.5.


Georg

Reply via email to