From 416d19ff84f021bf087cc1a591fe61176f39b40d Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 6 Jan 2011 20:57:16 +0000 Subject: [PATCH] hyperref support for tex2lyx git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@37138 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/tex2lyx/preamble.cpp | 133 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/src/tex2lyx/preamble.cpp b/src/tex2lyx/preamble.cpp index 2d96a81a03..1c10c6a4e5 100644 --- a/src/tex2lyx/preamble.cpp +++ b/src/tex2lyx/preamble.cpp @@ -280,6 +280,28 @@ vector split_options(string const & input) } +/*! + * Retrieve a keyval option "name={value with=sign}" named \p name from + * \p options and return the value. + * The found option is also removed from \p options. + */ +string process_keyval_opt(vector & options, string name) +{ + for (size_t i = 0; i < options.size(); ++i) { + vector option; + split(options[i], option, '='); + if (option.size() < 2) + continue; + if (option[0] == name) { + options.erase(options.begin() + i); + option.erase(option.begin()); + return join(option, "="); + } + } + return ""; +} + + /*! * Add package \p name with options \p options to used_packages. * Remove options from \p options that we don't want to output. @@ -318,6 +340,100 @@ string const scale_as_percentage(string const & scale) } +string remove_braces(string const & value) +{ + if (value.empty()) + return value; + if (value[0] == '{' && value[value.length()-1] == '}') + return value.substr(1, value.length()-2); + return value; +} + + +void handle_hyperref(vector & options) +{ + // FIXME swallow inputencoding changes that might surround the + // hyperref setup if it was written by LyX + h_use_hyperref = "1"; + // swallow "unicode=true", since LyX does always write that + vector::iterator it = + find(options.begin(), options.end(), "unicode=true"); + if (it != options.end()) + options.erase(it); + it = find(options.begin(), options.end(), "pdfusetitle"); + if (it != options.end()) { + h_pdf_pdfusetitle = "1"; + options.erase(it); + } + string bookmarks = process_keyval_opt(options, "bookmarks"); + if (bookmarks == "true") + h_pdf_bookmarks = "1"; + else if (bookmarks == "false") + h_pdf_bookmarks = "0"; + if (h_pdf_bookmarks == "1") { + string bookmarksnumbered = + process_keyval_opt(options, "bookmarksnumbered"); + if (bookmarksnumbered == "true") + h_pdf_bookmarksnumbered = "1"; + else if (bookmarksnumbered == "false") + h_pdf_bookmarksnumbered = "0"; + string bookmarksopen = + process_keyval_opt(options, "bookmarksopen"); + if (bookmarksopen == "true") + h_pdf_bookmarksopen = "1"; + else if (bookmarksopen == "false") + h_pdf_bookmarksopen = "0"; + if (h_pdf_bookmarksopen == "1") { + string bookmarksopenlevel = + process_keyval_opt(options, "bookmarksopenlevel"); + if (!bookmarksopenlevel.empty()) + h_pdf_bookmarksopenlevel = bookmarksopenlevel; + } + } + string breaklinks = process_keyval_opt(options, "breaklinks"); + if (breaklinks == "true") + h_pdf_breaklinks = "1"; + else if (breaklinks == "false") + h_pdf_breaklinks = "0"; + string pdfborder = process_keyval_opt(options, "pdfborder"); + if (pdfborder == "{0 0 0}") + h_pdf_pdfborder = "1"; + else if (pdfborder == "{0 0 1}") + h_pdf_pdfborder = "0"; + string backref = process_keyval_opt(options, "backref"); + if (!backref.empty()) + h_pdf_backref = backref; + string colorlinks = process_keyval_opt(options, "colorlinks"); + if (colorlinks == "true") + h_pdf_colorlinks = "1"; + else if (colorlinks == "false") + h_pdf_colorlinks = "0"; + string pdfpagemode = process_keyval_opt(options, "pdfpagemode"); + if (!pdfpagemode.empty()) + h_pdf_pagemode = pdfpagemode; + string pdftitle = process_keyval_opt(options, "pdftitle"); + if (!pdftitle.empty()) { + h_pdf_title = remove_braces(pdftitle); + } + string pdfauthor = process_keyval_opt(options, "pdfauthor"); + if (!pdfauthor.empty()) { + h_pdf_author = remove_braces(pdfauthor); + } + string pdfsubject = process_keyval_opt(options, "pdfsubject"); + if (!pdfsubject.empty()) + h_pdf_subject = remove_braces(pdfsubject); + string pdfkeywords = process_keyval_opt(options, "pdfkeywords"); + if (!pdfkeywords.empty()) + h_pdf_keywords = remove_braces(pdfkeywords); + if (!options.empty()) { + if (!h_pdf_quoted_options.empty()) + h_pdf_quoted_options += ','; + h_pdf_quoted_options += join(options, ","); + options.clear(); + } +} + + void handle_package(Parser &p, string const & name, string const & opts, bool in_lyx_preamble) { @@ -464,6 +580,9 @@ void handle_package(Parser &p, string const & name, string const & opts, else if (name == "jurabib") h_cite_engine = "jurabib"; + else if (name == "hyperref") + handle_hyperref(options); + else if (!in_lyx_preamble) { if (options.empty()) h_preamble << "\\usepackage{" << name << "}"; @@ -951,6 +1070,9 @@ void parse_preamble(Parser & p, ostream & os, } else if (t.cs() == "jurabibsetup") { + // FIXME p.getArg('{', '}') is most probably wrong (it + // does not handle nested braces). + // Use p.verbatim_item() instead. vector jurabibsetup = split_options(p.getArg('{', '}')); // add jurabibsetup to the jurabib package options @@ -961,6 +1083,17 @@ void parse_preamble(Parser & p, ostream & os, } } + else if (t.cs() == "hypersetup") { + vector hypersetup = + split_options(p.verbatim_item()); + // add hypersetup to the hyperref package options + handle_hyperref(hypersetup); + if (!hypersetup.empty()) { + h_preamble << "\\hypersetup{" + << join(hypersetup, ",") << '}'; + } + } + else if (!t.cs().empty() && !in_lyx_preamble) h_preamble << '\\' << t.cs(); } -- 2.39.2