X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=0882c3d3c31402b5a0a552ea2c394890322c01f2;hb=c3c2815092da1be063f2f67aeb7b97aafd3c2796;hp=854dd736b8d5a2e80e38623eda76daf978968c21;hpb=5e2b24c2a9f0d0aae7eb6ac7665b70d0601c7c73;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 854dd736b8..0882c3d3c3 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -403,6 +403,12 @@ public: /// has been externally modified? Can be reset by the user. mutable bool externally_modified_; + ///Binding LaTeX lines with buffer positions. + //Common routine for LaTeX and Reference errors listing. + void traverseErrors(TeXErrors::Errors::const_iterator err, + TeXErrors::Errors::const_iterator end, + ErrorList & errorList) const; + private: /// So we can force access via the accessors. mutable Buffer const * parent_buffer; @@ -920,6 +926,9 @@ int Buffer::readHeader(Lexer & lex) params().headsep.erase(); params().footskip.erase(); params().columnsep.erase(); + params().font_roman_opts.erase(); + params().font_sans_opts.erase(); + params().font_typewriter_opts.erase(); params().fonts_cjk.erase(); params().listings_params.clear(); params().clearLayoutModules(); @@ -943,6 +952,7 @@ int Buffer::readHeader(Lexer & lex) params().biblatex_bibstyle.erase(); params().biblatex_citestyle.erase(); params().multibib.erase(); + params().lineno_opts.clear(); for (int i = 0; i < 4; ++i) { params().user_defined_bullet(i) = ITEMIZE_DEFAULTS[i]; @@ -1719,13 +1729,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 +1736,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 +1828,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(); @@ -1939,7 +1934,8 @@ Buffer::ExportStatus Buffer::writeLaTeXSource(otexstream & os, os << "\\catcode`\\%=11" "\\def\\%{%}\\catcode`\\%=14\n"; } - bool const detokenize = !isAscii(from_utf8(docdir)); + bool const detokenize = !isAscii(from_utf8(docdir)) + || contains(docdir, '~'); bool const quote = contains(docdir, ' '); os << "\\makeatletter\n" << "\\def\\input@path{{"; @@ -2482,17 +2478,25 @@ FileName Buffer::getBibfilePath(docstring const & bibid) const map::const_iterator it = bibfileCache.find(bibid); if (it != bibfileCache.end()) { - // i.e., bibfileCache[bibid] + // i.e., return bibfileCache[bibid]; return it->second; } LYXERR(Debug::FILES, "Reading file location for " << bibid); - string texfile = changeExtension(to_utf8(bibid), "bib"); - // note that, if the filename can be found directly from the path, - // findtexfile will just return a FileName object for that path. - FileName file(findtexfile(texfile, "bib")); - if (file.empty()) - file = FileName(makeAbsPath(texfile, filePath())); + string const texfile = changeExtension(to_utf8(bibid), "bib"); + // we need to check first if this file exists where it's said to be. + // there's a weird bug that occurs otherwise: if the file is in the + // Buffer's directory but has the same name as some file that would be + // found by kpsewhich, then we find the latter, not the former. + FileName const local_file = makeAbsPath(texfile, filePath()); + FileName file = local_file; + if (!file.exists()) { + // there's no need now to check whether the file can be found + // locally + file = findtexfile(texfile, "bib", true); + if (file.empty()) + file = local_file; + } LYXERR(Debug::FILES, "Found at: " << file); bibfileCache[bibid] = file; @@ -4473,9 +4477,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; } @@ -4810,6 +4820,10 @@ Buffer::ReadStatus Buffer::loadEmergency() "You should do so manually. Otherwise, you will be " "asked about it again the next time you try to load " "this file, and may over-write your own work.")); + } else { + Alert::warning(_("Emergency File Renames"), + bformat(_("Emergency file renamed as:\n %1$s"), + from_utf8(newname.onlyFileName()))); } } return ReadOriginal; @@ -4893,26 +4907,26 @@ Buffer::ReadStatus Buffer::loadThisLyXFile(FileName const & fn) } -void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const +void Buffer::Impl::traverseErrors(TeXErrors::Errors::const_iterator err, TeXErrors::Errors::const_iterator end, ErrorList & errorList) const { - for (auto const & err : terr) { + for (; err != end; ++err) { TexRow::TextEntry start = TexRow::text_none, end = TexRow::text_none; - int errorRow = err.error_in_line; + int errorRow = err->error_in_line; Buffer const * buf = 0; - Impl const * p = d; - if (err.child_name.empty()) + Impl const * p = this; + if (err->child_name.empty()) tie(start, end) = p->texrow.getEntriesFromRow(errorRow); else { // The error occurred in a child - for (Buffer const * child : getDescendents()) { + for (Buffer const * child : owner_->getDescendents()) { string const child_name = DocFileName(changeExtension(child->absFileName(), "tex")). mangledFileName(); - if (err.child_name != child_name) + if (err->child_name != child_name) continue; tie(start, end) = child->d->texrow.getEntriesFromRow(errorRow); if (!TexRow::isNone(start)) { - buf = d->cloned_buffer_ + buf = this->cloned_buffer_ ? child->d->cloned_buffer_->d->owner_ : child->d->owner_; p = child->d; @@ -4920,12 +4934,30 @@ void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const } } } - errorList.push_back(ErrorItem(err.error_desc, err.error_text, + errorList.push_back(ErrorItem(err->error_desc, err->error_text, start, end, buf)); } } +void Buffer::bufferErrors(TeXErrors const & terr, ErrorList & errorList) const +{ + TeXErrors::Errors::const_iterator err = terr.begin(); + TeXErrors::Errors::const_iterator end = terr.end(); + + d->traverseErrors(err, end, errorList); +} + + +void Buffer::bufferRefs(TeXErrors const & terr, ErrorList & errorList) const +{ + TeXErrors::Errors::const_iterator err = terr.begin_ref(); + TeXErrors::Errors::const_iterator end = terr.end_ref(); + + d->traverseErrors(err, end, errorList); +} + + void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const { LBUFERR(!text().paragraphs().empty()); @@ -4985,6 +5017,10 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const setChangesPresent(false); Buffer & cbuf = const_cast(*this); + // if we are reloading, then we could have a dangling TOC, + // in effect. so we need to go ahead and reset, even though + // we will do so again when we rebuild the TOC later. + cbuf.tocBackend().reset(); // do the real work ParIterator parit = cbuf.par_iterator_begin(); @@ -5268,6 +5304,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()) {