]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/text.cpp
do not hardcode packages loaded by external insets
[lyx.git] / src / tex2lyx / text.cpp
index 977621d6fceb5f080711cf16b1c26ae571cf1987..e8180485e87418f54dcd03385625519b651c6933 100644 (file)
@@ -24,6 +24,8 @@
 #include "Length.h"
 #include "Preamble.h"
 
+#include "insets/ExternalTemplate.h"
+
 #include "support/lassert.h"
 #include "support/convert.h"
 #include "support/FileName.h"
@@ -455,8 +457,11 @@ docstring convert_unicodesymbols(docstring s)
                }
                s = s.substr(i);
                docstring rem;
-               docstring parsed = encodings.fromLaTeXCommand(s, rem,
-                               Encodings::TEXT_CMD);
+               set<string> req;
+               docstring parsed = encodings.fromLaTeXCommand(s,
+                               Encodings::TEXT_CMD, rem, &req);
+               for (set<string>::const_iterator it = req.begin(); it != req.end(); it++)
+                       preamble.registerAutomaticallyLoadedPackage(*it);
                os << parsed;
                s = rem;
                if (s.empty() || s[0] != '\\')
@@ -1262,6 +1267,7 @@ void parse_environment(Parser & p, ostream & os, bool outer,
                // we must make sure that the next item gets a \begin_layout.
                parent_context.new_paragraph(os);
                p.skip_spaces();
+                preamble.registerAutomaticallyLoadedPackage("rotfloat");
        }
 
        else if (name == "wrapfigure" || name == "wraptable") {
@@ -1294,6 +1300,7 @@ void parse_environment(Parser & p, ostream & os, bool outer,
                // we must make sure that the next item gets a \begin_layout.
                parent_context.new_paragraph(os);
                p.skip_spaces();
+                preamble.registerAutomaticallyLoadedPackage("wrapfig");
        }
 
        else if (name == "minipage") {
@@ -1333,6 +1340,7 @@ void parse_environment(Parser & p, ostream & os, bool outer,
                end_inset(os);
                p.skip_spaces();
                skip_braces(p); // eat {} that might by set by LyX behind comments
+               preamble.registerAutomaticallyLoadedPackage("verbatim");
        }
 
        else if (name == "lyxgreyedout") {
@@ -1893,6 +1901,28 @@ void parse_macro(Parser & p, ostream & os, Context & context)
                handle_ert(os, command + ert, context);
 }
 
+
+void registerExternalTemplatePackages(string const & name)
+{
+       external::TemplateManager const & etm = external::TemplateManager::get();
+       external::Template const * const et = etm.getTemplateByName(name);
+       if (!et)
+               return;
+       external::Template::Formats::const_iterator cit = et->formats.end();
+       if (pdflatex)
+               cit = et->formats.find("PDFLaTeX");
+       if (cit == et->formats.end())
+               // If the template has not specified a PDFLaTeX output,
+               // we try the LaTeX format.
+               cit = et->formats.find("LaTeX");
+       if (cit == et->formats.end())
+               return;
+       vector<string>::const_iterator qit = cit->second.requirements.begin();
+       vector<string>::const_iterator qend = cit->second.requirements.end();
+       for (; qit != qend; ++qit)
+               preamble.registerAutomaticallyLoadedPackage(*qit);
+}
+
 } // anonymous namespace
 
 
@@ -2343,10 +2373,12 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                                string const path = getMasterFilePath();
                                                // We want to preserve relative / absolute filenames,
                                                // therefore path is only used for testing
+                                               // The file extension is in every case ".tex".
+                                               // So we need to remove this extension and check for
+                                               // the original one.
+                                               name = removeExtension(name);
                                                if (!makeAbsPath(name, path).exists()) {
-                                                       // The file extension is probably missing.
-                                                       // Now try to find it out.
-                                                       char const * const Gnumeric_formats[] = {"gnumeric"
+                                                       char const * const Gnumeric_formats[] = {"gnumeric",
                                                                "ods", "xls", 0};
                                                        string const Gnumeric_name =
                                                                find_file(name, path, Gnumeric_formats);
@@ -2365,6 +2397,9 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                                end_inset(os);
                                                context.check_layout(os);
                                                macro = false;
+                                               // register the packages that are automatically reloaded
+                                               // by the Gnumeric template
+                                               registerExternalTemplatePackages("GnumericSpreadsheet");
                                        }
                                }
                        }
@@ -2701,6 +2736,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        // Warn about invalid options.
                        // Check whether some option was given twice.
                        end_inset(os);
+                       preamble.registerAutomaticallyLoadedPackage("graphicx");
                }
 
                else if (t.cs() == "footnote" ||
@@ -3007,6 +3043,9 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                   << convert_command_inset_arg(p.verbatim_item())
                                   << "\"\n";
                                end_inset(os);
+                               if (t.cs() == "vref" || t.cs() == "vpageref")
+                                       preamble.registerAutomaticallyLoadedPackage("varioref");
+
                        } else {
                                // LyX does not support optional arguments of ref commands
                                handle_ert(os, t.asInput() + '[' + opt + "]{" +
@@ -3423,13 +3462,17 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        string command = t.asInput() + "{" 
                                + trimSpaceAndEol(p.verbatim_item())
                                + "}";
-                       docstring s = encodings.fromLaTeXCommand(from_utf8(command), rem);
+                       set<string> req;
+                       docstring s = encodings.fromLaTeXCommand(from_utf8(command),
+                               Encodings::TEXT_CMD | Encodings::MATH_CMD, rem, &req);
                        if (!s.empty()) {
                                if (!rem.empty())
                                        cerr << "When parsing " << command 
                                             << ", result is " << to_utf8(s)
                                             << "+" << to_utf8(rem) << endl;
                                os << to_utf8(s);
+                               for (set<string>::const_iterator it = req.begin(); it != req.end(); it++)
+                                       preamble.registerAutomaticallyLoadedPackage(*it);
                        } else
                                // we did not find a non-ert version
                                handle_ert(os, command, context);
@@ -3559,10 +3602,13 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                begin_inset(os, "External\n");
                                os << "\ttemplate XFig\n"
                                   << "\tfilename " << outname << '\n';
+                               registerExternalTemplatePackages("XFig");
                        } else {
                                begin_command_inset(os, "include", name);
                                os << "preview false\n"
                                      "filename \"" << outname << "\"\n";
+                               if (t.cs() == "verbatiminput")
+                                       preamble.registerAutomaticallyLoadedPackage("verbatim");
                        }
                        end_inset(os);
                }
@@ -3979,6 +4025,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                os << "\tkeepAspectRatio\n";
                        end_inset(os);
                        context.check_layout(os);
+                       registerExternalTemplatePackages("PDFPages");
                }
 
                else if (t.cs() == "loadgame") {
@@ -4010,6 +4057,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        // after a \loadgame follows a \showboard
                        if (p.get_token().asInput() == "showboard")
                                p.get_token();
+                       registerExternalTemplatePackages("ChessDiagram");
                }
 
                else {
@@ -4017,8 +4065,9 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                        // Only use text mode commands, since we are in text mode here,
                        // and math commands may be invalid (bug 6797)
                        docstring rem;
+                       set<string> req;
                        docstring s = encodings.fromLaTeXCommand(from_utf8(t.asInput()),
-                                                                rem, Encodings::TEXT_CMD);
+                                                                Encodings::TEXT_CMD, rem, &req);
                        if (!s.empty()) {
                                if (!rem.empty())
                                        cerr << "When parsing " << t.cs() 
@@ -4027,6 +4076,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
                                context.check_layout(os);
                                os << to_utf8(s);
                                skip_spaces_braces(p);
+                               for (set<string>::const_iterator it = req.begin(); it != req.end(); it++)
+                                       preamble.registerAutomaticallyLoadedPackage(*it);
                        }
                        //cerr << "#: " << t << " mode: " << mode << endl;
                        // heuristic: read up to next non-nested space