From 02c73cd7213a22d290dd18c127bf2350fd5a8dae Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Wed, 3 Oct 2012 10:41:07 +0200 Subject: [PATCH] Do not let the parent interfere when I child document is exported/view standalone (#8100, #8101) --- src/Buffer.cpp | 46 +++++++++++++++++++++++++------------ src/BufferList.cpp | 5 +++- src/OutputParams.cpp | 6 ++--- src/OutputParams.h | 6 +++++ src/insets/InsetInclude.cpp | 2 ++ 5 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 1a85358d72..2c186553ce 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -211,6 +211,9 @@ public: */ bool file_fully_loaded; + /// Ignore the parent (e.g. when exporting a child standalone)? + bool ignore_parent; + /// mutable TocBackend toc_backend; @@ -281,6 +284,10 @@ public: /// This is here to force the test to be done whenever parent_buffer /// is accessed. Buffer const * parent() const { + // ignore_parent temporarily "orphans" a buffer + // (e.g. if a child is compiled standalone) + if (ignore_parent) + return 0; // if parent_buffer is not loaded, then it has been unloaded, // which means that parent_buffer is an invalid pointer. So we // set it to null in that case. @@ -360,9 +367,9 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, Buffer const * cloned_buffer) : owner_(owner), lyx_clean(true), bak_clean(true), unnamed(false), internal_buffer(false), read_only(readonly_), filename(file), - file_fully_loaded(false), toc_backend(owner), macro_lock(false), - timestamp_(0), checksum_(0), wa_(0), gui_(0), undo_(*owner), - bibinfo_cache_valid_(false), bibfile_cache_valid_(false), + file_fully_loaded(false), ignore_parent(false), toc_backend(owner), + macro_lock(false), timestamp_(0), checksum_(0), wa_(0), gui_(0), + undo_(*owner), bibinfo_cache_valid_(false), bibfile_cache_valid_(false), cite_labels_valid_(false), preview_loader_(0), cloned_buffer_(cloned_buffer), clone_list_(0), doing_export(false), parent_buffer(0) @@ -1461,12 +1468,19 @@ bool Buffer::makeLaTeXFile(FileName const & fname, void Buffer::writeLaTeXSource(otexstream & os, string const & original_path, OutputParams const & runparams_in, - OutputWhat output) const + OutputWhat output) const { // The child documents, if any, shall be already loaded at this point. OutputParams runparams = runparams_in; + // If we are compiling a file standalone, even if this is the + // child of some other buffer, let's cut the link here, so the + // file is really independent and no concurring settings from + // the master (e.g. branch state) interfere (see #8100). + if (!runparams.is_child) + d->ignore_parent = true; + // Classify the unicode characters appearing in math insets Encodings::initUnicodeMath(*this); @@ -1598,21 +1612,12 @@ void Buffer::writeLaTeXSource(otexstream & os, LYXERR(Debug::INFO, "preamble finished, now the body."); - // 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) { - save_parent = d->parent(); - d->setParent(0); - } - // the real stuff latexParagraphs(*this, text(), os, runparams); // Restore the parenthood if needed - if (output_preamble) - d->setParent(save_parent); + if (!runparams.is_child) + d->ignore_parent = false; // add this just in case after all the paragraphs os << endl; @@ -3337,6 +3342,12 @@ void Buffer::getSourceCode(odocstream & os, string const format, } else if (params().isDocBook()) { docbookParagraphs(text(), *this, os, runparams); } else { + // If we are previewing a paragraph, even if this is the + // child of some other buffer, let's cut the link here, + // so that no concurring settings from the master + // (e.g. branch state) interfere (see #8101). + // FIXME: Add an optional "from master" perspective. + d->ignore_parent = true; // We need to validate the Buffer params' features here // in order to know if we should output polyglossia // macros (instead of babel macros) @@ -3349,7 +3360,12 @@ void Buffer::getSourceCode(odocstream & os, string const format, texrow.newline(); // latex or literate otexstream ots(os, texrow); + + // the real stuff latexParagraphs(*this, text(), ots, runparams); + + // Restore the parenthood + d->ignore_parent = false; } } else { os << "% "; diff --git a/src/BufferList.cpp b/src/BufferList.cpp index a5c4b42f03..f756384bf4 100644 --- a/src/BufferList.cpp +++ b/src/BufferList.cpp @@ -221,8 +221,10 @@ Buffer * BufferList::previous(Buffer const * buf) const void BufferList::updateIncludedTeXfiles(string const & masterTmpDir, - OutputParams const & runparams) + OutputParams const & runparams_in) { + OutputParams runparams = runparams_in; + runparams.is_child = true; BufferStorage::iterator it = bstore.begin(); BufferStorage::iterator end = bstore.end(); for (; it != end; ++it) { @@ -233,6 +235,7 @@ void BufferList::updateIncludedTeXfiles(string const & masterTmpDir, (*it)->markDepClean(masterTmpDir); } } + runparams.is_child = false; } diff --git a/src/OutputParams.cpp b/src/OutputParams.cpp index 5e7d9f239d..f8af8ad375 100644 --- a/src/OutputParams.cpp +++ b/src/OutputParams.cpp @@ -19,9 +19,9 @@ namespace lyx { OutputParams::OutputParams(Encoding const * enc) - : flavor(LATEX), math_flavor(NotApplicable), nice(false), moving_arg(false), - inulemcmd(false), local_font(0), master_language(0), encoding(enc), - free_spacing(false), use_babel(false), use_polyglossia(false), + : flavor(LATEX), math_flavor(NotApplicable), nice(false), is_child(false), + moving_arg(false), inulemcmd(false), local_font(0), master_language(0), + encoding(enc), free_spacing(false), use_babel(false), use_polyglossia(false), use_indices(false), use_japanese(false), linelen(0), depth(0), exportdata(new ExportData), inComment(false), inTableCell(NO), inFloat(NONFLOAT), diff --git a/src/OutputParams.h b/src/OutputParams.h index d3c2921b46..40857d5aa8 100644 --- a/src/OutputParams.h +++ b/src/OutputParams.h @@ -81,6 +81,12 @@ public: */ bool nice; + /** Is this a real child (i.e., compiled as a child)? + This depends on wherefrom we export the buffer. Even children + that have a master can be compiled standalone. + */ + mutable bool is_child; + /** moving_arg == true means that the environment in which the inset is typeset is a moving argument. The inset should take care about fragile commands by preceding the latex with \\protect. diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 82520768b9..2a6f92b389 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -624,6 +624,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const runparams.master_language = buffer().params().language; runparams.par_begin = 0; runparams.par_end = tmp->paragraphs().size(); + runparams.is_child = true; if (!tmp->makeLaTeXFile(tmpwritefile, masterFileName(buffer()). onlyPath().absFileName(), runparams, Buffer::OnlyBody)) { docstring msg = bformat(_("Included file `%1$s' " @@ -639,6 +640,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const } runparams.encoding = oldEnc; runparams.master_language = oldLang; + runparams.is_child = false; // If needed, use converters to produce a latex file from the child if (tmpwritefile != writefile) {