]> git.lyx.org Git - lyx.git/blobdiff - src/output_latex.cpp
Make sure a pointer is valid before using it
[lyx.git] / src / output_latex.cpp
index 6b66ad8c7d68bdf7b66cc5677d786fa75c186d4f..f5c6a10888bae07547d420bf81af19d971a6059d 100644 (file)
 #include "OutputParams.h"
 #include "Paragraph.h"
 #include "ParagraphParameters.h"
+#include "texstream.h"
 #include "TextClass.h"
 
 #include "insets/InsetBibitem.h"
 #include "insets/InsetArgument.h"
 
+#include "frontends/alert.h"
+
 #include "support/lassert.h"
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/lstrings.h"
 #include "support/lyxalgo.h"
 #include "support/textutils.h"
+#include "support/gettext.h"
 
 #include <QThreadStorage>
 
@@ -249,8 +253,7 @@ static void finishEnvironment(otexstream & os, OutputParams const & runparams,
                state->prev_env_language_ = data.par_language;
                if (runparams.encoding != data.prev_encoding) {
                        runparams.encoding = data.prev_encoding;
-                       //if (!bparams.useNonTeXFonts) // FIXME just for speedup, would require passing of "buf" as argument
-                               os << setEncoding(data.prev_encoding->iconvName());
+                       os << setEncoding(data.prev_encoding->iconvName());
                }
        }
 
@@ -259,8 +262,7 @@ static void finishEnvironment(otexstream & os, OutputParams const & runparams,
                state->prev_env_language_ = data.par_language;
                if (runparams.encoding != data.prev_encoding) {
                        runparams.encoding = data.prev_encoding;
-                       //if (!bparams.useNonTeXFonts) //FIXME just for speedup
-                               os << setEncoding(data.prev_encoding->iconvName());
+                       os << setEncoding(data.prev_encoding->iconvName());
                }
        }
 
@@ -472,9 +474,9 @@ void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pi
        // get the first paragraph in sequence with this layout and depth
        pit_type offset = 0;
        while (true) {
-               if (prev(pit, offset) == pars.begin())
+               if (lyx::prev(pit, offset) == pars.begin())
                        break;
-               ParagraphList::const_iterator priorpit = prev(pit, offset + 1);
+               ParagraphList::const_iterator priorpit = lyx::prev(pit, offset + 1);
                if (priorpit->layout() == current_layout
                    && priorpit->params().depth() == current_depth)
                        ++offset;
@@ -482,7 +484,7 @@ void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pi
                        break;
        }
 
-       ParagraphList::const_iterator spit = prev(pit, offset);
+       ParagraphList::const_iterator spit = lyx::prev(pit, offset);
 
        for (; spit != pars.end(); ++spit) {
                if (spit->layout() != current_layout || spit->params().depth() < current_depth)
@@ -772,6 +774,7 @@ void TeXOnePar(Buffer const & buf,
        // encoding, since this only affects the position of the outputted
        // \inputencoding command; the encoding switch will occur when necessary
        if (bparams.inputenc == "auto"
+               && !runparams.isFullUnicode() // Xe/LuaTeX use one document-wide encoding  (see also switchEncoding())
                && runparams.encoding->package() != Encoding::none) {
                // Look ahead for future encoding changes.
                // We try to output them at the beginning of the paragraph,
@@ -884,8 +887,7 @@ void TeXOnePar(Buffer const & buf,
                        latexArgInsets(par, os, runparams, style.postcommandargs(), "post:");
                if (runparams.encoding != prev_encoding) {
                        runparams.encoding = prev_encoding;
-                       if (!bparams.useNonTeXFonts)
-                               os << setEncoding(prev_encoding->iconvName());
+                       os << setEncoding(prev_encoding->iconvName());
                }
        }
 
@@ -1043,13 +1045,14 @@ void TeXOnePar(Buffer const & buf,
        }
 
        // If this is the last paragraph, and a local_font was set upon entering
-       // the inset, and we're using "auto" or "default" encoding, the encoding
+       // the inset, and we're using "auto" or "default" encoding, and not
+       // compiling with XeTeX or LuaTeX, the encoding
        // should be set back to that local_font's encoding.
-       // However, do not change the encoding when non-TeX fonts are used.
        if (runparams.isLastPar && runparams_in.local_font != 0
            && runparams_in.encoding != runparams_in.local_font->language()->encoding()
            && (bparams.inputenc == "auto" || bparams.inputenc == "default")
-           && !bparams.useNonTeXFonts) {
+               && !runparams.isFullUnicode()
+          ) {
                runparams_in.encoding = runparams_in.local_font->language()->encoding();
                os << setEncoding(runparams_in.encoding->iconvName());
        }
@@ -1178,6 +1181,8 @@ void latexParagraphs(Buffer const & buf,
        bool already_title = false;
        DocumentClass const & tclass = bparams.documentClass();
 
+       // Did we already warn about inTitle layout mixing? (we only warn once)
+       bool gave_layout_warning = false;
        for (; pit < runparams.par_end; ++pit) {
                lastpit = pit;
                ParagraphList::const_iterator par = paragraphs.constIterator(pit);
@@ -1189,9 +1194,15 @@ void latexParagraphs(Buffer const & buf,
 
                if (layout.intitle) {
                        if (already_title) {
-                               LYXERR0("Error in latexParagraphs: You"
-                                       " should not mix title layouts"
-                                       " with normal ones.");
+                               if (!gave_layout_warning) {
+                                       gave_layout_warning = true;
+                                       frontend::Alert::warning(_("Error in latexParagraphs"),
+                                                       bformat(_("You are using at least one "
+                                                         "layout (%1$s) intended for the title, "
+                                                         "after using non-title layouts. This "
+                                                         "could lead to missing or incorrect output."
+                                                         ), layout.name()));
+                               }
                        } else if (!was_title) {
                                was_title = true;
                                if (tclass.titletype() == TITLE_ENVIRONMENT) {
@@ -1287,6 +1298,13 @@ pair<bool, int> switchEncoding(odocstream & os, BufferParams const & bparams,
                   OutputParams const & runparams, Encoding const & newEnc,
                   bool force)
 {
+       // XeTeX/LuaTeX use only one encoding per document:
+       // * with useNonTeXFonts: "utf8plain",
+       // * with XeTeX and TeX fonts: "ascii" (inputenc fails),
+       // * with LuaTeX and TeX fonts: only one encoding accepted by luainputenc.
+       if (runparams.isFullUnicode())
+               return make_pair(false, 0);
+
        Encoding const & oldEnc = *runparams.encoding;
        bool moving_arg = runparams.moving_arg;
        // If we switch from/to CJK, we need to switch anyway, despite custom inputenc