From ad0d0f6d69a7acd6e99f7858f08b427a28d8f8cc Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Sun, 31 May 2015 00:52:49 +0200 Subject: [PATCH] Really fix bug #9354 --- src/insets/InsetPreview.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/insets/InsetPreview.cpp b/src/insets/InsetPreview.cpp index 1b3456eac9..36e866c37c 100644 --- a/src/insets/InsetPreview.cpp +++ b/src/insets/InsetPreview.cpp @@ -24,12 +24,18 @@ #include "graphics/PreviewImage.h" +#include "mathed/MacroTable.h" + +#include "support/lstrings.h" + #include using namespace std; namespace lyx { +using support::prefixIs; + InsetPreview::InsetPreview(Buffer * buf) : InsetText(buf), @@ -70,10 +76,33 @@ void InsetPreview::preparePreview(DocIterator const & pos) const TexRow texrow; odocstringstream str; otexstream os(str, texrow); - OutputParams runparams(&pos.buffer()->params().encoding()); + Buffer const * buffer = pos.buffer(); + OutputParams runparams(&buffer->params().encoding()); latex(os, runparams); - docstring const snippet = str.str(); - preview_->addPreview(snippet, *pos.buffer()); + // collect macros at this position in case they are used in a math inset + MacroNameSet macros; + buffer->listMacroNames(macros); + MacroNameSet::iterator it = macros.begin(); + MacroNameSet::iterator end = macros.end(); + docstring macro_preamble; + for (; it != end; ++it) { + MacroData const * data = buffer->getMacro(*it, pos, true); + if (data) { + odocstringstream macro_def; + data->write(macro_def, false); + docstring const md = macro_def.str(); + macro_def << endl; + bool is_newcomm = prefixIs(md, from_ascii("\\newcomm")); + // assure that \newcommand defs are only added once + if (!is_newcomm || !preview_->hasMacroDef(md, *buffer)) { + if (is_newcomm) + preview_->addMacroDef(md, *buffer); + macro_preamble.append(macro_def.str()); + } + } + } + docstring const snippet = macro_preamble + str.str(); + preview_->addPreview(snippet, *buffer); } -- 2.39.2