X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FPDFOptions.cpp;h=f2890ecc1d297ce55813364f93c64ef96866be9a;hb=c3b1ff6229a468d2da9e8c0ceabb27148b2005ab;hp=43fd6f78fdbe14abfd32b2fdf787f64c0d12a462;hpb=110090e43596eb974d987d5370fba1b4b74f3774;p=lyx.git diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp index 43fd6f78fd..f2890ecc1d 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -4,6 +4,7 @@ * Licence details can be found in the file COPYING. * * \author Pavel Sanda + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -12,6 +13,7 @@ #include "PDFOptions.h" +#include "Encoding.h" #include "Lexer.h" #include "support/convert.h" @@ -20,6 +22,7 @@ #include #include +#include using namespace std; using namespace lyx::support; @@ -47,7 +50,6 @@ bool PDFOptions::empty() const && pdfborder == x.pdfborder && colorlinks == x.colorlinks && backref == x.backref - && pagebackref == x.pagebackref && pdfusetitle == x.pdfusetitle; } @@ -76,8 +78,7 @@ void PDFOptions::writeFile(ostream & os) const 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_backref " << backref << '\n'; os << "\\pdf_pdfusetitle " << convert(pdfusetitle) << '\n'; if (!pagemode.empty()) @@ -88,8 +89,11 @@ void PDFOptions::writeFile(ostream & os) const } -void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) const +int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, + bool hyperref_already_provided) const { + int lines = 0; + // FIXME Unicode string opt; // since LyX uses unicode, also set the PDF strings to unicode strings with the @@ -97,7 +101,7 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con opt += "unicode=true, "; // try to extract author and title from document when none is - // explicitely given + // explicitly given if (pdfusetitle && title.empty() && author.empty()) opt += "pdfusetitle,"; opt += "\n "; @@ -107,19 +111,18 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con opt += "bookmarksnumbered=" + convert(bookmarksnumbered) + ','; opt += "bookmarksopen=" + convert(bookmarksopen) + ','; if (bookmarksopen) - opt += "bookmarksopenlevel=" + convert(bookmarksopenlevel) + ','; + opt += "bookmarksopenlevel=" + + convert(bookmarksopenlevel) + ','; } opt += "\n "; - opt += "breaklinks=" + convert(breaklinks) + ','; + opt += "breaklinks=" + convert(breaklinks) + ','; - opt += "pdfborder={0 0 " ; - opt += (pdfborder ?'0':'1'); + opt += "pdfborder={0 0 "; + opt += (pdfborder ? '0' : '1'); opt += "},"; - opt += "backref=" + convert(backref) + ','; - opt += "pagebackref=" + convert(pagebackref) + ','; - opt += "\n "; - opt += "colorlinks=" + convert(colorlinks) + ','; + opt += "backref=" + backref + ','; + opt += "colorlinks=" + convert(colorlinks) + ','; if (!pagemode.empty()) opt += "pdfpagemode=" + pagemode + ','; @@ -129,9 +132,9 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con // LaTeX-errors when using non-latin characters string hyperset; if (!title.empty()) - hyperset += "pdftitle={" + title + "},"; + hyperset += "pdftitle={" + title + "},"; if (!author.empty()) - hyperset += "\n pdfauthor={" + author + "},"; + hyperset += "\n pdfauthor={" + author + "},"; if (!subject.empty()) hyperset += "\n pdfsubject={" + subject + "},"; if (!keywords.empty()) @@ -142,14 +145,25 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con } hyperset = rtrim(hyperset,","); + // check if the hyperref settings use an encoding that exceeds + // ours. If so, we have to switch to utf8. + Encoding const * const enc = runparams.encoding; + docstring const hs = from_utf8(hyperset); + 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])) + need_unicode = true; + } + } // use in \\usepackage parameter as not all options can be handled inside \\hypersetup if (!hyperref_already_provided) { - opt = rtrim(opt,","); + opt = rtrim(opt, ","); opt = "\\usepackage[" + opt + "]\n {hyperref}\n"; if (!hyperset.empty()) - opt += "\\hypersetup{" + hyperset + "}\n "; + opt += "\\hypersetup{" + hyperset + "}\n"; } else // only in case hyperref is already loaded by the current text class // try to put it into hyperset @@ -158,11 +172,24 @@ void PDFOptions::writeLaTeX(odocstream & os, bool hyperref_already_provided) con // and the option is active only when part of usepackage parameter // (e.g. pdfusetitle). { - opt = "\\hypersetup{" + opt + hyperset + "}\n "; + opt = "\\hypersetup{" + opt + hyperset + "}\n"; } - - // FIXME UNICODE + + lines = int(count(opt.begin(), opt.end(), '\n')); + + // hyperref expects utf8! + if (need_unicode && enc && enc->iconvName() != "UTF-8") { + os << "\\inputencoding{utf8}\n" + << setEncoding("UTF-8"); + ++lines; + } os << from_utf8(opt); + if (need_unicode && enc && enc->iconvName() != "UTF-8") { + os << setEncoding(enc->iconvName()) + << "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n"; + ++lines; + } + return lines; } @@ -194,8 +221,6 @@ string PDFOptions::readToken(Lexer &lex, string const & token) lex >> colorlinks; } else if (token == "\\pdf_backref") { lex >> backref; - } else if (token == "\\pdf_pagebackref") { - lex >> pagebackref; } else if (token == "\\pdf_pdfusetitle") { lex >> pdfusetitle; } else if (token == "\\pdf_pagemode") { @@ -212,7 +237,7 @@ string PDFOptions::readToken(Lexer &lex, string const & token) // check the string from UI string PDFOptions::quoted_options_check(string const str) const { - return subst(str,"\n",""); + return subst(str, "\n", ""); } @@ -231,8 +256,7 @@ void PDFOptions::clear() breaklinks = false; pdfborder = false; colorlinks = false; - backref = false; - pagebackref = false; + backref = "false"; pagemode.clear(); quoted_options.clear(); pdfusetitle = true; //in contrast with hyperref