]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Implement support for font options
[lyx.git] / src / Buffer.cpp
index 854dd736b8d5a2e80e38623eda76daf978968c21..0882c3d3c31402b5a0a552ea2c394890322c01f2 100644 (file)
@@ -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<docstring, FileName>::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<Buffer &>(*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()) {