X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FPDFOptions.cpp;h=77763bef3a378494d12d45fd061b0fdd7ece2b11;hb=e40fa86a975a5d3ec7ecc0a1d33d082774ba7cb2;hp=d9f637e95135105f5d2aeb7e02c0d806cf36204f;hpb=baaceb10c2f3a5accf48d9fce6c3065c7f1a1147;p=lyx.git diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp index d9f637e951..77763bef3a 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -15,6 +15,7 @@ #include "Encoding.h" #include "Lexer.h" +#include "texstream.h" #include "support/convert.h" #include "support/debug.h" @@ -61,13 +62,13 @@ void PDFOptions::writeFile(ostream & os) const return; if (!title.empty() ) - os << "\\pdf_title \"" << title << "\"\n"; + os << "\\pdf_title " << Lexer::quoteString(title) << '\n'; if (!author.empty()) - os << "\\pdf_author \"" << author << "\"\n"; + os << "\\pdf_author " << Lexer::quoteString(author) << '\n'; if (!subject.empty()) - os << "\\pdf_subject \"" << subject << "\"\n"; + os << "\\pdf_subject " << Lexer::quoteString(subject) << '\n'; if (!keywords.empty()) - os << "\\pdf_keywords \"" << keywords << "\"\n"; + os << "\\pdf_keywords " << Lexer::quoteString(keywords) << '\n'; os << "\\pdf_bookmarks " << convert(bookmarks) << '\n'; @@ -85,14 +86,13 @@ void PDFOptions::writeFile(ostream & os) const os << "\\pdf_pagemode " << pagemode << '\n'; if (!quoted_options.empty()) - os << "\\pdf_quoted_options \"" << quoted_options << "\"\n"; + os << "\\pdf_quoted_options " << Lexer::quoteString(quoted_options) << '\n'; } -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; @@ -103,7 +103,7 @@ int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, // only use the hyperref settings if hyperref is enabled by the user // see bug #7052 - if(use_hyperref) { + if (use_hyperref) { // try to extract author and title from document when none is // explicitly given if (pdfusetitle && title.empty() && author.empty()) @@ -122,6 +122,8 @@ int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, opt += "pdfborder={0 0 "; opt += (pdfborder ? '0' : '1'); opt += "},"; + if (pdfborder) + opt += "pdfborderstyle={},"; opt += "backref=" + backref + ','; opt += "colorlinks=" + convert(colorlinks) + ','; if (!pagemode.empty()) @@ -142,7 +144,6 @@ int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, hyperset += quoted_options; } hyperset = rtrim(hyperset,","); - } // check if the hyperref settings use an encoding that exceeds @@ -152,7 +153,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; } } @@ -171,30 +172,38 @@ int PDFOptions::writeLaTeX(OutputParams & runparams, odocstream & os, // 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{" + opt + hyperset + "}\n"; + opt = "\\hypersetup{" + rtrim(opt + hyperset, ",") + "}\n"; } - lines = int(count(opt.begin(), opt.end(), '\n')); - - // hyperref expects utf8! - if (need_unicode && enc && enc->iconvName() != "UTF-8" - &&!runparams.isFullUnicode()) { - os << "\\inputencoding{utf8}\n" - << setEncoding("UTF-8"); - ++lines; + // hyperref expects LICR macros for non-ASCII chars. + // Usually, "(lua)inputenc" converts the input to LICR, with XeTeX utf-8 works, too. + // As hyperref provides good coverage for \inputencoding{utf8}, we can try + // this if the current input encoding does not support a character. + // FIXME: don't use \inputencoding if "inputenc" is not loaded (#9839). + if (need_unicode && enc && enc->iconvName() != "UTF-8") { + if (runparams.flavor != OutputParams::XETEX) + os << "\\inputencoding{utf8}\n"; + os << setEncoding("UTF-8"); } - // if hyperref is loaded by the document class and hyperset is empty, - // nothing must be output, see bug #7048 - if (!(hyperref_already_provided && hyperset.empty())) + // 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; + if (need_unicode && enc && enc->iconvName() != "UTF-8") { + os << setEncoding(enc->iconvName()); + if (runparams.flavor != OutputParams::XETEX) + os << "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n"; } - return lines; } @@ -203,13 +212,25 @@ string PDFOptions::readToken(Lexer &lex, string const & token) if (token == "\\use_hyperref") { lex >> use_hyperref; } else if (token == "\\pdf_title") { - lex >> title; + if (lex.isOK()) { + lex.next(true); + title = lex.getString(); + } } else if (token == "\\pdf_author") { - lex >> author; + if (lex.isOK()) { + lex.next(true); + author = lex.getString(); + } } else if (token == "\\pdf_subject") { - lex >> subject; + if (lex.isOK()) { + lex.next(true); + subject = lex.getString(); + } } else if (token == "\\pdf_keywords") { - lex >> keywords; + if (lex.isOK()) { + lex.next(true); + keywords = lex.getString(); + } } else if (token == "\\pdf_bookmarks") { lex >> bookmarks; } else if (token == "\\pdf_bookmarksnumbered") { @@ -231,7 +252,10 @@ string PDFOptions::readToken(Lexer &lex, string const & token) } else if (token == "\\pdf_pagemode") { lex >> pagemode; } else if (token == "\\pdf_quoted_options") { - lex >> quoted_options; + if (lex.isOK()) { + lex.next(true); + quoted_options = lex.getString(); + } } else { return token; } @@ -240,7 +264,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", ""); }