#include "LyXRC.h"
#include "OutputParams.h"
#include "Paragraph.h"
-#include "paragraph_funcs.h"
#include "ParagraphParameters.h"
#include "TextClass.h"
#include "TexRow.h"
static int open_encoding_ = none;
static int cjk_inherited_ = 0;
+Language const * prev_env_language_ = 0;
ParagraphList::const_iterator
ParagraphList const & paragraphs = text.paragraphs();
+ bool const force_plain_layout = text.inset().forcePlainLayout();
while (par != paragraphs.end() &&
par->params().depth() == pit->params().depth()) {
// FIXME This test should not be necessary.
// We should perhaps issue an error if it is.
- Layout const & style = par->forcePlainLayout() ?
- buf.params().documentClass().plainLayout() : par->layout();
+ Layout const & style = force_plain_layout
+ ? buf.params().documentClass().plainLayout() : par->layout();
if (style.isEnvironment()) {
par = TeXEnvironment(buf, text, par,
os, texrow, runparams);
// FIXME This test should not be necessary.
// We should perhaps issue an error if it is.
- Layout const & style = pit->forcePlainLayout() ?
+ Layout const & style = text.inset().forcePlainLayout() ?
bparams.documentClass().plainLayout() : pit->layout();
ParagraphList const & paragraphs = text.paragraphs();
+ ParagraphList::const_iterator const priorpit =
+ pit == paragraphs.begin() ? pit : boost::prior(pit);
+
+ bool const use_prev_env_language = prev_env_language_ != 0
+ && priorpit->layout().isEnvironment()
+ && (priorpit->getDepth() > pit->getDepth()
+ || (priorpit->getDepth() == pit->getDepth()
+ && priorpit->layout() != pit->layout()));
+ Encoding const * const prev_encoding = runparams.encoding;
Language const * const par_language = pit->getParLanguage(bparams);
Language const * const doc_language = bparams.language;
Language const * const prev_par_language =
(pit != paragraphs.begin())
- ? boost::prior(pit)->getParLanguage(bparams)
+ ? (use_prev_env_language ? prev_env_language_
+ : priorpit->getParLanguage(bparams))
: doc_language;
if (par_language->babel() != prev_par_language->babel()) {
<< "}\n";
} else if (style.labeltype == LABEL_BIBLIO) {
if (pit->params().labelWidthString().empty())
- os << '{' << bibitemWidest(buf) << "}\n";
+ os << '{' << bibitemWidest(buf, runparams) << "}\n";
else
os << '{'
<< pit->params().labelWidthString()
if (style.isEnvironment()) {
os << "\\end{" << from_ascii(style.latexname()) << "}\n";
texrow.newline();
+ prev_env_language_ = par_language;
+ if (runparams.encoding != prev_encoding) {
+ runparams.encoding = prev_encoding;
+ if (!bparams.useXetex)
+ os << setEncoding(prev_encoding->iconvName());
+ }
}
if (leftindent_open) {
os << "\\end{LyXParagraphLeftIndent}\n";
texrow.newline();
+ prev_env_language_ = par_language;
+ if (runparams.encoding != prev_encoding) {
+ runparams.encoding = prev_encoding;
+ if (!bparams.useXetex)
+ os << setEncoding(prev_encoding->iconvName());
+ }
}
if (par != paragraphs.end())
OutputParams runparams = runparams_in;
runparams.isLastPar = nextpit == paragraphs.end();
+ bool const maintext = text.isMainText();
+ // we are at the beginning of an inset and CJK is already open;
+ // we count inheritation levels to get the inset nesting right.
+ if (pit == paragraphs.begin() && !maintext
+ && (cjk_inherited_ > 0 || open_encoding_ == CJK)) {
+ cjk_inherited_ += 1;
+ open_encoding_ = none;
+ }
+
if (runparams.verbatim) {
int const dist = distance(paragraphs.begin(), pit);
- Font const outerfont = outerFont(dist, paragraphs);
+ Font const outerfont = text.outerFont(dist);
// No newline if only one paragraph in this lyxtext
if (dist > 0) {
// FIXME This check should not really be needed.
// Perhaps we should issue an error if it is.
- Layout const style = pit->forcePlainLayout() ?
+ Layout const style = text.inset().forcePlainLayout() ?
bparams.documentClass().plainLayout() : pit->layout();
- runparams.moving_arg |= style.needprotect;
-
- bool const maintext = text.isMainText(buf);
- // we are at the beginning of an inset and CJK is already open;
- // we count inheritation levels to get the inset nesting right.
- if (pit == paragraphs.begin() && !maintext
- && (cjk_inherited_ > 0 || open_encoding_ == CJK)) {
- cjk_inherited_ += 1;
- open_encoding_ = none;
- }
-
// This paragraph's language
Language const * const par_language = pit->getParLanguage(bparams);
// The document's language
Language const * const outer_language =
(runparams.local_font != 0) ?
runparams.local_font->language() : doc_language;
- // The previous language that was in effect is either the language of
- // the previous paragraph, if there is one, or else the outer language
- // if there is no previous paragraph
- Language const * prev_language =
- (pit != paragraphs.begin()) ?
- priorpit->getParLanguage(bparams) : outer_language;
-
- // When the language is changed at the very start of a LyX environment,
- // the language switch in the LaTeX code occurs just before switching to
- // the corresponding LaTeX environment. So, when the environment ends,
- // we have to properly restore the language that was in effect.
- bool env_lang_switch = false;
- if (!priorpit->hasSameLayout(*pit)) {
- ParagraphList::const_iterator outpit = priorpit;
- while (outpit != paragraphs.begin()
- && (outpit->hasSameLayout(*priorpit)
- || outpit->getDepth() > pit->getDepth())
- || outpit->getAlign() != outpit->layout().align)
- outpit = boost::prior(outpit);
- ParagraphList::const_iterator inpit = boost::next(outpit);
- bool topped = outpit == paragraphs.begin()
- && (outpit->hasSameLayout(*priorpit)
- || outpit->getDepth() > pit->getDepth()
- || outpit->getAlign() != outpit->layout().align);
- Language const * const outenv_language = topped ?
- outer_language
- : outpit->getParLanguage(bparams);
- Language const * const inenv_language = topped ?
- outpit->getParLanguage(bparams)
- : inpit->getParLanguage(bparams);
- if (outenv_language->babel() != inenv_language->babel()) {
- if (inenv_language->babel() != par_language->babel())
- env_lang_switch = true;
- prev_language = inenv_language;
- } else
- prev_language = outenv_language;
- }
- if ((par_language->babel() != prev_language->babel() || env_lang_switch)
+ // The previous language that was in effect is the language of the
+ // previous paragraph, unless the previous paragraph is inside an
+ // environment with nesting depth greater than (or equal to, but with
+ // a different layout) the current one. If there is no previous
+ // paragraph, the previous language is the outer language.
+ bool const use_prev_env_language = prev_env_language_ != 0
+ && priorpit->layout().isEnvironment()
+ && (priorpit->getDepth() > pit->getDepth()
+ || (priorpit->getDepth() == pit->getDepth()
+ && priorpit->layout() != pit->layout()));
+ Language const * const prev_language =
+ (pit != paragraphs.begin())
+ ? (use_prev_env_language ? prev_env_language_
+ : priorpit->getParLanguage(bparams))
+ : outer_language;
+
+ if (par_language->babel() != prev_language->babel()
// check if we already put language command in TeXEnvironment()
&& !(style.isEnvironment()
&& (pit == paragraphs.begin() ||
// Look ahead for future encoding changes.
// We try to output them at the beginning of the paragraph,
// since the \inputencoding command is not allowed e.g. in
- // sections.
+ // sections. For this reason we only set runparams.moving_arg
+ // after checking for the encoding change, otherwise the
+ // change would be always avoided by switchEncoding().
for (pos_type i = 0; i < pit->size(); ++i) {
char_type const c = pit->getChar(i);
Encoding const * const encoding =
}
}
+ runparams.moving_arg |= style.needprotect;
+ Encoding const * const prev_encoding = runparams.encoding;
+
bool const useSetSpace = bparams.documentClass().provides("SetSpace");
if (pit->allowParagraphCustomization()) {
if (pit->params().startOfAppendix()) {
break;
}
- Font const outerfont = outerFont(distance(paragraphs.begin(), pit),
- paragraphs);
+ Font const outerfont = text.outerFont(distance(paragraphs.begin(), pit));
// FIXME UNICODE
os << from_utf8(everypar);
os << "\\" << from_ascii(font.latexSize()) << " \\par}";
} else if (need_par) {
os << "\\par}";
- } else if (is_command)
+ } else if (is_command) {
os << '}';
+ if (runparams.encoding != prev_encoding) {
+ runparams.encoding = prev_encoding;
+ if (!bparams.useXetex)
+ os << setEncoding(prev_encoding->iconvName());
+ }
+ }
bool pending_newline = false;
switch (style.latextype) {
// when the paragraph uses CJK, the language has to be closed earlier
if (font.language()->encoding()->package() != Encoding::CJK) {
if (lyxrc.language_command_end.empty()) {
- if (!prev_language->babel().empty()) {
+ // If this is a child, we should restore the
+ // master language after the last paragraph.
+ Language const * const current_language =
+ (nextpit == paragraphs.end()
+ && runparams.master_language)
+ ? runparams.master_language
+ : outer_language;
+ if (!current_language->babel().empty()) {
os << from_ascii(subst(
lyxrc.language_command_begin,
"$$lang",
- prev_language->babel()));
+ current_language->babel()));
pending_newline = true;
}
} else if (!par_language->babel().empty()) {
const_cast<OutputParams&>(runparams).par_end = 0;
}
- bool const maintext = text.isMainText(buf);
+ bool const maintext = text.isMainText();
bool const is_child = buf.masterBuffer() != &buf;
// Open a CJK environment at the beginning of the main buffer
texrow.newline();
open_encoding_ = CJK;
}
- // if "auto begin" is switched off, explicitely switch the
+ // if "auto begin" is switched off, explicitly switch the
// language on at start
if (maintext && !lyxrc.language_auto_begin &&
!bparams.language->babel().empty()) {
lastpar = par;
// FIXME This check should not be needed. We should
// perhaps issue an error if it is.
- Layout const & layout = par->forcePlainLayout() ?
+ Layout const & layout = text.inset().forcePlainLayout() ?
tclass.plainLayout() : par->layout();
if (layout.intitle) {
texrow.newline();
}
- // if "auto end" is switched off, explicitely close the language at the end
+ // if "auto end" is switched off, explicitly close the language at the end
// but only if the last par is in a babel language
if (maintext && !lyxrc.language_auto_end && !bparams.language->babel().empty() &&
lastpar->getParLanguage(bparams)->encoding()->package() != Encoding::CJK) {