From: Stefan Schimanski Date: Wed, 26 Mar 2008 12:55:36 +0000 (+0000) Subject: * corrected handling of validation of math macros. The macro instances X-Git-Tag: 1.6.10~5419 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=98787bbec6760afbb4eeafe7c7b3e112b8d15f4d;p=features.git * corrected handling of validation of math macros. The macro instances will require the needed LaTeXFeatures of their definition and their paramenters. * Require the "xargs" package when there is a macro with optional parameters which is prepended to a child document which is rendered alone. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23971 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/Buffer.cpp b/src/Buffer.cpp index d248051ae6..4722016646 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -1103,6 +1103,16 @@ void Buffer::writeLaTeXSource(odocstream & os, d->texrow.newline(); } LYXERR(Debug::INFO, "lyx document header finished"); + + // Don't move this behind the parent_buffer=0 code below, + // because then the macros will not get the right "redefinition" + // flag as they don't see the parent macros which are output before. + updateMacros(); + + // fold macros if possible, still with parent buffer as the + // macros will be put in the prefix anyway. + updateMacroInstances(); + // There are a few differences between nice LaTeX and usual files: // usual is \batchmode and has a // special input@path to allow the including of figures @@ -1133,6 +1143,11 @@ void Buffer::writeLaTeXSource(odocstream & os, d->texrow.newline(); } + // get parent macros (if this buffer has a parent) which will be + // written at the document begin further down. + MacroSet parentMacros; + listParentMacros(parentMacros, features); + // Write the preamble runparams.use_babel = params().writeLaTeX(os, features, d->texrow); @@ -1142,29 +1157,23 @@ void Buffer::writeLaTeXSource(odocstream & os, // make the body. os << "\\begin{document}\n"; d->texrow.newline(); + + // output the parent macros + MacroSet::iterator it = parentMacros.begin(); + MacroSet::iterator end = parentMacros.end(); + for (; it != end; ++it) + (*it)->write(os, true); } // output_preamble d->texrow.start(paragraphs().begin()->id(), 0); LYXERR(Debug::INFO, "preamble finished, now the body."); - // Don't move this behind the parent_buffer=0 code below, - // because then the macros will not get the right "redefinition" - // flag as they don't see the parent macros which are output before. - updateMacros(); - - // fold macros if possible, still with parent buffer as the - // macros will be put in the prefix anyway. - updateMacroInstances(); - // if we are doing a real file with body, even if this is the // child of some other buffer, let's cut the link here. // This happens for example if only a child document is printed. Buffer const * save_parent = 0; if (output_preamble) { - // output the macros visible for this buffer - writeParentMacros(os); - save_parent = d->parent_buffer; d->parent_buffer = 0; } @@ -1173,15 +1182,9 @@ void Buffer::writeLaTeXSource(odocstream & os, latexParagraphs(*this, text(), os, d->texrow, runparams); // Restore the parenthood if needed - if (output_preamble) { + if (output_preamble) d->parent_buffer = save_parent; - // restore macros with correct parent buffer (especially - // important for the redefinition flag which depends on the - // parent) - updateMacros(); - } - // add this just in case after all the paragraphs os << endl; d->texrow.newline(); @@ -1991,24 +1994,30 @@ void Buffer::listMacroNames(MacroNameSet & macros) const } -void Buffer::writeParentMacros(odocstream & os) const +void Buffer::listParentMacros(MacroSet & macros, LaTeXFeatures & features) const { if (!d->parent_buffer) return; - - // collect macro names + MacroNameSet names; d->parent_buffer->listMacroNames(names); - - // resolve and output them + + // resolve macros MacroNameSet::iterator it = names.begin(); MacroNameSet::iterator end = names.end(); for (; it != end; ++it) { // defined? MacroData const * data = d->parent_buffer->getMacro(*it, *this, false); - if (data) - data->write(os, true); + if (data) { + macros.insert(data); + + // we cannot access the original MathMacroTemplate anymore + // here to calls validate method. So we do its work here manually. + // FIXME: somehow make the template accessible here. + if (data->optionals() > 0) + features.require("xargs"); + } } } diff --git a/src/Buffer.h b/src/Buffer.h index eb9b581bf7..68f80cc82e 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -43,6 +43,7 @@ class LaTeXFeatures; class Language; class MacroData; class MacroNameSet; +class MacroSet; class OutputParams; class Paragraph; class ParConstIterator; @@ -368,12 +369,10 @@ public: /// Iterate through the whole buffer and try to resolve macros void updateMacroInstances() const; - /// List macro names of this buffer. the parent and the children + /// List macro names of this buffer, the parent and the children void listMacroNames(MacroNameSet & macros) const; - /// Write out all macros somewhere defined in the parent, - /// its parents and its children, which are visible at the beginning - /// of this buffer - void writeParentMacros(odocstream & os) const; + /// Collect macros of the parent and its children in front of this buffer. + void listParentMacros(MacroSet & macros, LaTeXFeatures & features) const; /// Return macro defined before pos (or in the master buffer) MacroData const * getMacro(docstring const & name, DocIterator const & pos, bool global = true) const; diff --git a/src/mathed/MacroTable.cpp b/src/mathed/MacroTable.cpp index ad9f43f938..b4dfb13b15 100644 --- a/src/mathed/MacroTable.cpp +++ b/src/mathed/MacroTable.cpp @@ -60,7 +60,7 @@ MacroData::MacroData(MathMacroTemplate const & macro) redefinition_(false), type_(MacroTypeNewcommand) { queryData(macro); -} +} void MacroData::expand(vector const & args, MathData & to) const @@ -123,7 +123,8 @@ void MacroData::queryData(MathMacroTemplate const & macro) const redefinition_ = macro.redefinition(); type_ = macro.type(); optionals_ = macro.numOptionals(); - macro.getDefaults(defaults_); + + macro.getDefaults(defaults_); } diff --git a/src/mathed/MacroTable.h b/src/mathed/MacroTable.h index 281a522f9f..d1b455b03a 100644 --- a/src/mathed/MacroTable.h +++ b/src/mathed/MacroTable.h @@ -34,9 +34,6 @@ enum MacroType { MacroTypeNewcommandx, MacroTypeDef }; - -/// -class MacroNameSet : public std::set {}; /// class MacroData { @@ -138,6 +135,12 @@ private: mutable MacroType type_; }; + +/// +class MacroNameSet : public std::set {}; +/// +class MacroSet : public std::set {}; + /// A lookup table of macro definitions. /** diff --git a/src/mathed/MathMacro.cpp b/src/mathed/MathMacro.cpp index 8197444dff..d84a642402 100644 --- a/src/mathed/MathMacro.cpp +++ b/src/mathed/MathMacro.cpp @@ -517,6 +517,12 @@ void MathMacro::validate(LaTeXFeatures & features) const if (name() == "binom" || name() == "mathcircumflex") features.require(to_utf8(name())); + + // validate the cells and the definition + if (displayMode() == DISPLAY_NORMAL) { + definition_.validate(features); + InsetMathNest::validate(features); + } }