X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FPDFOptions.cpp;h=dc638f544dafb3638f6ad020fd7cff93c3414fd2;hb=5cb80b867f4a59c3253487652ba74a29ad5b3f0f;hp=7de277c3212162655a60fcd7b565c43dae64e35f;hpb=8995a8387a03361b6a7ff44b447a90a6187b1a14;p=lyx.git diff --git a/src/PDFOptions.cpp b/src/PDFOptions.cpp index 7de277c321..dc638f544d 100644 --- a/src/PDFOptions.cpp +++ b/src/PDFOptions.cpp @@ -14,10 +14,15 @@ #include "PDFOptions.h" #include "Encoding.h" +#include "LaTeXFeatures.h" #include "Lexer.h" +#include "OutputParams.h" +#include "texstream.h" #include "support/convert.h" #include "support/debug.h" +#include "support/docstream.h" +#include "support/docstring.h" #include "support/lstrings.h" #include @@ -59,33 +64,33 @@ void PDFOptions::writeFile(ostream & os) const os << "\\use_hyperref " << convert(use_hyperref) << '\n'; if (!use_hyperref && empty()) 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'; os << "\\pdf_bookmarksnumbered " << convert(bookmarksnumbered) << '\n'; os << "\\pdf_bookmarksopen " << convert(bookmarksopen) << '\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 " << backref << '\n'; os << "\\pdf_pdfusetitle " << convert(pdfusetitle) << '\n'; - + if (!pagemode.empty()) 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'; } @@ -95,10 +100,17 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, // 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,"; + + // Driver needed by specific converters + if (!runparams.hyperref_driver.empty()) + opt += runparams.hyperref_driver + ","; + + // Since LyX uses unicode, also set the PDF strings to unicode strings + // with the hyperref option "unicode". This is only needed with pdflatex. + // As of 2021/02/04, unicode=true is default. + if (!LaTeXFeatures::isAvailableAtLeastFrom("hyperref", 2021, 2, 4) + && !runparams.isFullUnicode() && !runparams.use_japanese) + opt += "unicode=true,"; // only use the hyperref settings if hyperref is enabled by the user // see bug #7052 @@ -107,7 +119,8 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, // explicitly given if (pdfusetitle && title.empty() && author.empty()) opt += "pdfusetitle,"; - opt += "\n "; + if (!opt.empty()) + opt += "\n "; opt += "bookmarks=" + convert(bookmarks) + ','; if (bookmarks) { opt += "bookmarksnumbered=" + convert(bookmarksnumbered) + ','; @@ -116,11 +129,14 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, opt += "bookmarksopenlevel=" + convert(bookmarksopenlevel) + ','; } - opt += "\n "; + if (!opt.empty()) + opt += "\n "; opt += "breaklinks=" + convert(breaklinks) + ','; opt += "pdfborder={0 0 "; opt += (pdfborder ? '0' : '1'); opt += "},"; + if (pdfborder) + opt += "pdfborderstyle={},"; opt += "backref=" + backref + ','; opt += "colorlinks=" + convert(colorlinks) + ','; if (!pagemode.empty()) @@ -130,7 +146,7 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, // LaTeX-errors when using non-latin characters if (!title.empty()) hyperset += "pdftitle={" + title + "},"; - if (!author.empty()) + if (!author.empty()) hyperset += "\n pdfauthor={" + author + "},"; if (!subject.empty()) hyperset += "\n pdfsubject={" + subject + "},"; @@ -149,8 +165,8 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, docstring const hs = from_utf8(hyperset); bool need_unicode = false; if (enc) { - for (size_t n = 0; n < hs.size(); ++n) { - if (!enc->encodable(hs[n])) + for (char_type h : hs) { + if (!enc->encodable(h)) need_unicode = true; } } @@ -172,11 +188,15 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, opt = "\\hypersetup{" + rtrim(opt + hyperset, ",") + "}\n"; } - // hyperref expects utf8! - if (need_unicode && enc && enc->iconvName() != "UTF-8" - &&!runparams.isFullUnicode()) { - os << "\\inputencoding{utf8}\n" - << setEncoding("UTF-8"); + // 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 != Flavor::XeTeX) + os << "\\inputencoding{utf8}\n"; + os << setEncoding("UTF-8"); } // If hyperref is loaded by the document class, we output // \hypersetup \AtBeginDocument if hypersetup is not (yet) @@ -192,11 +212,10 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os, << "\\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"; + if (need_unicode && enc && enc->iconvName() != "UTF-8") { + os << setEncoding(enc->iconvName()); + if (runparams.flavor != Flavor::XeTeX) + os << "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n"; } } @@ -206,13 +225,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") { @@ -234,7 +265,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; } @@ -243,7 +277,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", ""); }