]> git.lyx.org Git - features.git/commitdiff
Do not let the parent interfere when I child document is exported/view standalone...
authorJuergen Spitzmueller <spitz@lyx.org>
Wed, 3 Oct 2012 08:41:07 +0000 (10:41 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Wed, 3 Oct 2012 15:00:17 +0000 (17:00 +0200)
(cherry picked from commit 02c73cd7213a22d290dd18c127bf2350fd5a8dae)

src/Buffer.cpp
src/BufferList.cpp
src/OutputParams.cpp
src/OutputParams.h
src/insets/InsetInclude.cpp
status.20x

index 0af6091b5781b581b63e2fc24951f9668d22539a..bb5943a0c33b37dcedb6548ef4cf330fb4110538 100644 (file)
@@ -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 << "% ";
index b8a30e8f1c9411825422df77b53411e78461eec4..faa1958757b39b4b1596dba630f81b91bba5fa0d 100644 (file)
@@ -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;
 }
 
 
index a0e7a1c40a2f590d4dbbeb90a9adeb4c7313e530..ef80fb0a9789cd586e1607c75e1c21ffc7e0b938 100644 (file)
@@ -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),
index 97f4661bf33982fa1105c4ef7c6e42e879e7a52e..dbad69a4f771f9665a05a6c83bf16b7b8b98927d 100644 (file)
@@ -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.
index 2940124d9747dfa1597603994aaadef7871b7a2a..d161fadf50187f83c048e77acec2f1ae5c3a334c 100644 (file)
@@ -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) {
index ea2063185d1f07b76555a58d711da5d2ee4e7abc..84677067093aefb7025b227931581c300b346c23 100644 (file)
@@ -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).