X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FPDFOptions.cpp;h=644f26e738bcfe49523dfd5991c8ece4d0b6c559;hb=5e0121cf5854a2a0039e6cb4970aeddb18bd4b23;hp=69be8502484c2abca4ac0832e52bb014dafe5add;hpb=f675f011be22345e03243ad079d6f8890e0c9c2f;p=lyx.git diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp index 69be850248..644f26e738 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -12,39 +12,50 @@ #include "PDFOptions.h" +#include "Lexer.h" + #include "support/convert.h" +#include "support/debug.h" #include "support/lstrings.h" -#include "debug.h" -#include "Lexer.h" #include #include -namespace lyx { +using namespace std; +using namespace lyx::support; +namespace lyx { -using std::ostream; -using std::ostringstream; -using std::string; const string PDFOptions::pagemode_fullscreen("FullScreen"); bool PDFOptions::empty() const { - return author.empty() - && title.empty() - && subject.empty() - && keywords.empty() - && pagemode.empty() - && bookmarksopenlevel.empty() - && quoted_options.empty(); + PDFOptions x; //implicit hyperref settings + + return author == x.author + && title == x.title + && subject == x.subject + && keywords == x.keywords + && pagemode == x.pagemode + && quoted_options == x.quoted_options + && bookmarks == x.bookmarks + && bookmarksnumbered == x.bookmarksnumbered + && bookmarksopen == x.bookmarksopen + && bookmarksopenlevel == x.bookmarksopenlevel + && breaklinks == x.breaklinks + && pdfborder == x.pdfborder + && colorlinks == x.colorlinks + && backref == x.backref + && pagebackref == x.pagebackref + && pdfusetitle == x.pdfusetitle; } + void PDFOptions::writeFile(ostream & os) const { os << "\\use_hyperref " << convert(use_hyperref) << '\n'; - os << "\\pdf_store_options " << convert(store_options) << '\n'; - if (!use_hyperref && !store_options) + if (!use_hyperref && empty()) return; if (!title.empty() ) @@ -60,14 +71,14 @@ void PDFOptions::writeFile(ostream & os) const os << "\\pdf_bookmarks " << convert(bookmarks) << '\n'; os << "\\pdf_bookmarksnumbered " << convert(bookmarksnumbered) << '\n'; os << "\\pdf_bookmarksopen " << convert(bookmarksopen) << '\n'; - if (!bookmarksopenlevel.empty()) - os << "\\pdf_bookmarksopenlevel \"" << bookmarksopenlevel << "\"\n"; + os << "\\pdf_bookmarksopenlevel " << bookmarksopenlevel << '\n'; os << "\\pdf_breaklinks " << convert(breaklinks) << '\n'; os << "\\pdf_pdfborder " << convert(pdfborder) << '\n'; os << "\\pdf_colorlinks " << convert(colorlinks) << '\n'; os << "\\pdf_backref " << convert(backref) << '\n'; os << "\\pdf_pagebackref " << convert(pagebackref) << '\n'; + os << "\\pdf_pdfusetitle " << convert(pdfusetitle) << '\n'; if (!pagemode.empty()) os << "\\pdf_pagemode " << pagemode << '\n'; @@ -76,48 +87,79 @@ void PDFOptions::writeFile(ostream & os) const os << "\\pdf_quoted_options \"" << quoted_options << "\"\n"; } -void PDFOptions::writeLaTeX(odocstringstream &os) const + +void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) const { - if (!use_hyperref) - return; - string opt; - opt = "\\usepackage["; - if (!title.empty()) - opt += "pdftitle={" + title + "},\n"; - if (!author.empty()) - opt += "pdfauthor={" + author + "},\n"; - if (!subject.empty()) - opt += "pdfsubject={" + subject + "},\n"; - if (!keywords.empty()) - opt += "pdfkeywords={" + keywords + "},\n"; + // since LyX uses unicode, also set the PDF strings to unicode strings with the + // hyperref option "unicode" + opt += "unicode=true, "; + // try to extract author and title from document when none is + // explicitely given + if (pdfusetitle && title.empty() && author.empty()) + opt += "pdfusetitle,"; + opt += "\n "; + opt += "bookmarks=" + convert(bookmarks) + ','; if (bookmarks) { opt += "bookmarksnumbered=" + convert(bookmarksnumbered) + ','; opt += "bookmarksopen=" + convert(bookmarksopen) + ','; - - if (bookmarksopen && !bookmarksopenlevel.empty()) - opt += "bookmarksopenlevel=" + bookmarksopenlevel + ','; + if (bookmarksopen) + opt += "bookmarksopenlevel=" + convert(bookmarksopenlevel) + ','; } - + opt += "\n "; opt += "breaklinks=" + convert(breaklinks) + ','; - + opt += "pdfborder={0 0 " ; opt += (pdfborder ?'0':'1'); - opt += "},\n"; - - opt += "colorlinks=" + convert(colorlinks) + ','; + opt += "},"; + opt += "backref=" + convert(backref) + ','; opt += "pagebackref=" + convert(pagebackref) + ','; - + opt += "\n "; + opt += "colorlinks=" + convert(colorlinks) + ','; if (!pagemode.empty()) opt += "pdfpagemode=" + pagemode + ','; - opt += quoted_options_get(); - opt = support::rtrim(opt,","); - opt += "]{hyperref}\n"; + + + // load the pdftitle etc. as hypersetup, otherwise you'll get + // LaTeX-errors when using non-latin characters + string hyperset; + if (!title.empty()) + hyperset += "pdftitle={" + title + "},"; + if (!author.empty()) + hyperset += "\n pdfauthor={" + author + "},"; + if (!subject.empty()) + hyperset += "\n pdfsubject={" + subject + "},"; + if (!keywords.empty()) + hyperset += "\n pdfkeywords={" + keywords + "},"; + if (!quoted_options.empty()){ + hyperset += "\n "; + hyperset += quoted_options; + } + hyperset = rtrim(hyperset,","); + + + // use in \\usepackage parameter as not all options can be handled inside \\hypersetup + if (!hyperref_already_provided) { + opt = rtrim(opt,","); + opt = "\\usepackage[" + opt + "]\n {hyperref}\n"; + + if (!hyperset.empty()) + opt += "\\hypersetup{" + hyperset + "}\n "; + } else + // only in case hyperref is already loaded by the current text class + // try to put it into hyperset + // + // FIXME: this still does not fix the cases where hyperref is loaded + // and the option is active only when part of usepackage parameter + // (e.g. pdfusetitle). + { + opt = "\\hypersetup{" + opt + hyperset + "}\n "; + } // FIXME UNICODE os << from_utf8(opt); @@ -154,12 +196,12 @@ string PDFOptions::readToken(Lexer &lex, string const & token) lex >> backref; } else if (token == "\\pdf_pagebackref") { lex >> pagebackref; + } else if (token == "\\pdf_pdfusetitle") { + lex >> pdfusetitle; } else if (token == "\\pdf_pagemode") { lex >> pagemode; } else if (token == "\\pdf_quoted_options") { lex >> quoted_options; - } else if (token == "\\pdf_store_options") { - lex >> store_options; } else { return token; } @@ -167,14 +209,14 @@ string PDFOptions::readToken(Lexer &lex, string const & token) } -//prepared for check -string PDFOptions::quoted_options_get() const +// check the string from UI +string PDFOptions::quoted_options_check(string const str) const { - return quoted_options; + return subst(str, "\n", ""); } -// Keep implicit hyperref settings +// set implicit settings for hyperref void PDFOptions::clear() { use_hyperref = false; @@ -185,7 +227,7 @@ void PDFOptions::clear() bookmarks = true; bookmarksnumbered = false; bookmarksopen = false; - bookmarksopenlevel.clear(); + bookmarksopenlevel = 1; breaklinks = false; pdfborder = false; colorlinks = false; @@ -193,7 +235,7 @@ void PDFOptions::clear() pagebackref = false; pagemode.clear(); quoted_options.clear(); - store_options = false; + pdfusetitle = true; //in contrast with hyperref } } // namespace lyx