namespace {
-int const LYX_FORMAT = 318;
+int const LYX_FORMAT = 325;
typedef map<string, bool> DepClean;
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
}
if (!retval) {
- message(str + _(" could not write file!."));
+ message(str + _(" could not write file!"));
return false;
}
removeAutosaveFile(d->filename.absFilename());
if (params().embedded) {
- message(str + _(" writing embedded files!."));
+ message(str + _(" writing embedded files."));
// if embedding is enabled, write file.lyx and all the embedded files
// to the zip file fname.
if (!d->embedded_files.writeFile(fname, *this)) {
- message(str + _(" could not write embedded files!."));
+ message(str + _(" could not write embedded files!"));
return false;
}
}
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
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);
// 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;
}
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();
if (it->lyxCode() == BIBTEX_CODE) {
InsetBibtex const & inset =
static_cast<InsetBibtex const &>(*it);
- EmbeddedFileList const bibfiles = inset.embeddedFiles();
+ EmbeddedFileList const bibfiles = inset.getBibFiles();
d->bibfilesCache_.insert(d->bibfilesCache_.end(),
bibfiles.begin(),
bibfiles.end());
}
-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");
+ }
}
}