Do not let the parent interfere when I child document is exported/view standalone (#8100, #8101)

(cherry picked from commit 02c73cd721)
This commit is contained in:
Juergen Spitzmueller 2012-10-03 10:41:07 +02:00
parent 9d43101254
commit 2f3acae922
6 changed files with 52 additions and 20 deletions

View 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;
@ -277,6 +280,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.
@ -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 << "% ";

View 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;
}

View 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),

View 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.

View 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) {

View 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).