X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FPDFOptions.cpp;h=222be517e836779ad9502d8f9815ef3117d3eaaa;hb=68ee68103a77300c3aa01db9e63bd01b8243a0eb;hp=af01b25b92e8554117ef32e22c04ac2374dd5397;hpb=de50c5248e149c183822847a201493c97879321d;p=lyx.git diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp index af01b25b92..222be517e8 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -22,6 +22,7 @@ #include #include +#include using namespace std; using namespace lyx::support; @@ -88,61 +89,59 @@ void PDFOptions::writeFile(ostream & os) const } -int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, +void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, bool hyperref_already_provided) const { - int lines = 0; // FIXME Unicode string opt; + string hyperset; // 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 - // explicitly 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) - opt += "bookmarksopenlevel=" - + convert(bookmarksopenlevel) + ','; - } - opt += "\n "; - opt += "breaklinks=" + convert(breaklinks) + ','; - - opt += "pdfborder={0 0 "; - opt += (pdfborder ? '0' : '1'); - opt += "},"; - - opt += "backref=" + backref + ','; - opt += "colorlinks=" + convert(colorlinks) + ','; - if (!pagemode.empty()) - opt += "pdfpagemode=" + pagemode + ','; - - - - // 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; + opt += "unicode=true,"; + + // only use the hyperref settings if hyperref is enabled by the user + // see bug #7052 + if (use_hyperref) { + // try to extract author and title from document when none is + // explicitly 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) + opt += "bookmarksopenlevel=" + + convert(bookmarksopenlevel) + ','; + } + opt += "\n "; + opt += "breaklinks=" + convert(breaklinks) + ','; + opt += "pdfborder={0 0 "; + opt += (pdfborder ? '0' : '1'); + opt += "},"; + opt += "backref=" + backref + ','; + opt += "colorlinks=" + convert(colorlinks) + ','; + if (!pagemode.empty()) + opt += "pdfpagemode=" + pagemode + ','; + + // load the pdftitle etc. as hypersetup, otherwise you'll get + // LaTeX-errors when using non-latin characters + 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,","); } - hyperset = rtrim(hyperset,","); // check if the hyperref settings use an encoding that exceeds // ours. If so, we have to switch to utf8. @@ -151,7 +150,7 @@ int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, bool need_unicode = false; if (enc) { for (size_t n = 0; n < hs.size(); ++n) { - if (enc->latexChar(hs[n], true) != docstring(1, hs[n])) + if (!enc->encodable(hs[n])) need_unicode = true; } } @@ -163,32 +162,42 @@ int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, if (!hyperset.empty()) opt += "\\hypersetup{" + hyperset + "}\n"; - } else + } 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"; - } - - lines = int(count(opt.begin(), opt.end(), '\n')); + // FIXME: rename in this case the PDF settings dialog checkbox + // label from "Use Hyperref" to "Customize Hyperref Settings" + // as discussd in bug #6293 + opt = "\\hypersetup{" + rtrim(opt + hyperset, ",") + "}\n"; + } // hyperref expects utf8! - if (need_unicode && enc && enc->iconvName() != "UTF-8") { + if (need_unicode && enc && enc->iconvName() != "UTF-8" + &&!runparams.isFullUnicode()) { os << "\\inputencoding{utf8}\n" << setEncoding("UTF-8"); - ++lines; } - os << from_utf8(opt); - if (need_unicode && enc && enc->iconvName() != "UTF-8") { + // If hyperref is loaded by the document class, we output + // \hypersetup \AtBeginDocument if hypersetup is not (yet) + // defined. In this case, the class loads hyperref late + // (see bug #7048). + if (hyperref_already_provided && !opt.empty()) { + os << "\\ifx\\hypersetup\\undefined\n" + << " \\AtBeginDocument{%\n " + << from_utf8(opt) + << " }\n" + << "\\else\n " + << from_utf8(opt) + << "\\fi\n"; + } else + os << from_utf8(opt); + + if (need_unicode && enc && enc->iconvName() != "UTF-8" + &&!runparams.isFullUnicode()) { os << setEncoding(enc->iconvName()) << "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n"; - ++lines; } - return lines; } @@ -234,7 +243,7 @@ string PDFOptions::readToken(Lexer &lex, string const & token) // check the string from UI -string PDFOptions::quoted_options_check(string const str) const +string PDFOptions::quoted_options_check(string const & str) const { return subst(str, "\n", ""); }