X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=7dbef4f18d01bd2cf7c62a139a0f855ab1e4c200;hb=1e519d1115f41f71c253cb9e2fbb7803e9a583a9;hp=22647351d462a0d940d24dedaabd5bf57356c4d7;hpb=4a481975b6e94fc48a7bdfe776106ba79149e5bc;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 22647351d4..7dbef4f18d 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -1719,13 +1719,6 @@ Buffer::ExportStatus Buffer::makeLaTeXFile(FileName const & fname, { OutputParams runparams = runparams_in; - // XeTeX with TeX fonts is only safe with ASCII encoding (see also #9740), - // Check here, because the "flavor" is not known in BufferParams::encoding() - // (power users can override this safety measure selecting "utf8-plain"). - if (!params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX) - && (runparams.encoding->name() != "utf8-plain")) - runparams.encoding = encodings.fromLyXName("ascii"); - string const encoding = runparams.encoding->iconvName(); LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << ", fname=" << fname.realPath()); @@ -1733,9 +1726,11 @@ Buffer::ExportStatus Buffer::makeLaTeXFile(FileName const & fname, try { ofs.reset(encoding); } catch (iconv_codecvt_facet_exception const & e) { lyxerr << "Caught iconv exception: " << e.what() << endl; - Alert::error(_("Iconv software exception Detected"), bformat(_("Please " - "verify that the support software for your encoding (%1$s) is " - "properly installed"), from_ascii(encoding))); + Alert::error(_("Iconv software exception Detected"), + bformat(_("Please verify that the `iconv' support software is" + " properly installed and supports the selected encoding" + " (%1$s), or change the encoding in" + " Document>Settings>Language."), from_ascii(encoding))); return ExportError; } if (!openFileWrite(ofs, fname)) @@ -1823,16 +1818,6 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os, OutputParams runparams = runparams_in; - // XeTeX with TeX fonts is only safe with ASCII encoding, - // Check here, because the "flavor" is not known in BufferParams::encoding() - // (power users can override this safety measure selecting "utf8-plain"). - if (!params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX) - && (runparams.encoding->name() != "utf8-plain")) - runparams.encoding = encodings.fromLyXName("ascii"); - // FIXME: when only the current paragraph is shown, this is ignored - // (or not reached) and characters encodable in the current - // encoding are not converted to ASCII-representation. - // Some macros rely on font encoding runparams.main_fontenc = params().main_font_encoding(); @@ -1968,10 +1953,14 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os, // Biblatex bibliographies are loaded here if (params().useBiblatex()) { - vector const bibfiles = + vector> const bibfiles = prepareBibFilePaths(runparams, getBibfiles(), true); - for (docstring const & file: bibfiles) - os << "\\addbibresource{" << file << "}\n"; + for (pair const & file: bibfiles) { + os << "\\addbibresource"; + if (!file.second.empty()) + os << "[bibencoding=" << file.second << "]"; + os << "{" << file.first << "}\n"; + } } if (!runparams.dryrun && features.hasPolyglossiaExclusiveLanguages() @@ -3299,7 +3288,7 @@ string const Buffer::prepareFileNameForLaTeX(string const & name, } -vector const Buffer::prepareBibFilePaths(OutputParams const & runparams, +vector> const Buffer::prepareBibFilePaths(OutputParams const & runparams, docstring_list const & bibfilelist, bool const add_extension) const { @@ -3313,7 +3302,7 @@ vector const Buffer::prepareBibFilePaths(OutputParams const & runpara // Otherwise, store the (maybe absolute) path to the original, // unmangled database name. - vector res; + vector> res; // determine the export format string const tex_format = flavor2format(runparams.flavor); @@ -3385,9 +3374,20 @@ vector const Buffer::prepareBibFilePaths(OutputParams const & runpara if (contains(path, ' ')) found_space = true; + string enc; + if (params().useBiblatex() && !params().bibFileEncoding(utf8input).empty()) + enc = params().bibFileEncoding(utf8input); + + bool recorded = false; + for (pair pe : res) { + if (pe.first == path) { + recorded = true; + break; + } - if (find(res.begin(), res.end(), path) == res.end()) - res.push_back(path); + } + if (!recorded) + res.push_back(make_pair(path, enc)); } // Check if there are spaces in the path and warn BibTeX users, if so. @@ -4458,9 +4458,15 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir if (!put_in_tempdir) { // Only show this alert if this is an export to a non-temporary // file (not for previewing). - Alert::error(_("Couldn't export file"), bformat( - _("No information for exporting the format %1$s."), - theFormats().prettyName(format))); + docstring s = bformat(_("No information for exporting the format %1$s."), + theFormats().prettyName(format)); + if (format == "pdf4") + s += "\n" + + bformat(_("Hint: use non-TeX fonts or set input encoding " + " to '%1$s' or '%2$s'"), + from_utf8(encodings.fromLyXName("utf8")->guiName()), + from_utf8(encodings.fromLyXName("ascii")->guiName())); + Alert::error(_("Couldn't export file"), s); } return ExportNoPathToFormat; } @@ -5138,16 +5144,20 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const docstring itemlabel; switch (par.itemdepth) { case 0: + // • U+2022 BULLET itemlabel = char_type(0x2022); break; case 1: + // – U+2013 EN DASH itemlabel = char_type(0x2013); break; case 2: + // ∗ U+2217 ASTERISK OPERATOR itemlabel = char_type(0x2217); break; case 3: - itemlabel = char_type(0x2219); // or 0x00b7 + // · U+00B7 MIDDLE DOT + itemlabel = char_type(0x00b7); break; } par.params().labelString(itemlabel); @@ -5249,6 +5259,11 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const // to resolve macros in it. parit.text()->setMacrocontextPosition(parit); + // Reset bibitem counter in master (#8499) + Buffer const * const master = masterBuffer(); + if (master == this && !d->ignore_parent) + master->params().documentClass().counters().reset(from_ascii("bibitem")); + depth_type maxdepth = 0; pit_type const lastpit = parit.lastpit(); for ( ; parit.pit() <= lastpit ; ++parit.pit()) {