From: Juergen Spitzmueller Date: Wed, 3 Oct 2012 08:41:07 +0000 (+0200) Subject: Do not let the parent interfere when I child document is exported/view standalone... X-Git-Tag: 2.0.5~52 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=2f3acae92285869d3700ce144420bebb54a1d7b5;p=features.git Do not let the parent interfere when I child document is exported/view standalone (#8100, #8101) (cherry picked from commit 02c73cd7213a22d290dd18c127bf2350fd5a8dae) --- diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 0af6091b57..bb5943a0c3 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -210,6 +210,9 @@ public: */ bool file_fully_loaded; + /// Ignore the parent (e.g. when exporting a child standalone)? + bool ignore_parent; + /// mutable TocBackend toc_backend; @@ -276,7 +279,11 @@ public: /// This is here to force the test to be done whenever parent_buffer /// is accessed. - Buffer const * parent() const { + 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. @@ -356,9 +363,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), cloned_buffer_(cloned_buffer), clone_list_(0), doing_export(false), parent_buffer(0) { @@ -1419,12 +1426,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); @@ -1566,21 +1580,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; @@ -3235,6 +3240,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) @@ -3247,7 +3258,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 b8a30e8f1c..faa1958757 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 a0e7a1c40a..ef80fb0a97 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 97f4661bf3..dbad69a4f7 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 2940124d97..d161fadf50 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -618,6 +618,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' " @@ -633,6 +634,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) { diff --git a/status.20x b/status.20x index ea2063185d..8467706709 100644 --- a/status.20x +++ b/status.20x @@ -88,11 +88,16 @@ What's new - Do not output empty language switch commands (bug 8216). +- Do not let the master document interfere when a child is compiled standalone + (bug 8000). + - When using Turkish language, use the xkeyval package to avoid incompatibilities (bug 2005). - Do not ignore polyglossia commands in partial source preview (bug 8209). +- Show enabled child-only branches content in source preview (bug 8001). + - Export correct language change commands if document contains different CJK languages (bug 8215).