static int open_encoding_ = none;
static int cjk_inherited_ = 0;
+Language const * prev_env_language_ = 0;
ParagraphList::const_iterator
}
-Language const *
-priorLanguage(ParagraphList::const_iterator const pit,
- ParagraphList::const_iterator const priorpit,
- ParagraphList::const_iterator const pars_begin,
- BufferParams const & bparams)
-{
- ParagraphList::const_iterator outpit = priorpit;
- ParagraphList::const_iterator refpit = priorpit;
-
- // We go back until the depth kept increasing or the current layout
- // matches the reference one. When the depth decreases, we should stop
- // only if we started from inside the enclosing environment, otherwise
- // we should continue to go back.
-
- bool topped = false;
- depth_type const refdepth =
- priorpit->getDepth() ? priorpit->getDepth() - 1 : 0;
- while (outpit != pars_begin
- && (outpit->hasSameLayout(*refpit)
- || outpit->getDepth() > pit->getDepth())) {
- outpit = boost::prior(outpit);
- if (outpit->getDepth() == pit->getDepth()
- && outpit->layout() == pit->layout()
- && (priorpit->getAlign() != priorpit->layout().align
- || priorpit->getDepth() > pit->getDepth())) {
- // After skipping either a nested or non-default
- // aligned environment, we ended at an environment with
- // same layout and nesting depth as the current one.
- break;
- }
- if (outpit->getDepth() == refdepth) {
- if (outpit->getDepth() >= pit->getDepth()
- && (priorpit->getDepth() > pit->getDepth()
- || outpit->layout() == refpit->layout())) {
- // The prior environment was nested in
- // another one, or was enclosing some other
- // one, or we are still in it. In any case,
- // we still have to go back.
- refpit = outpit;
- } else {
- topped = true;
- break;
- }
- }
- }
- ParagraphList::const_iterator const inpit =
- topped ? refpit : boost::next(outpit);
- // Check if we stopped at the first paragraph,
- // but we should still go back.
- topped = !topped && (outpit == pars_begin
- && (outpit->hasSameLayout(*refpit)
- || outpit->getDepth() > pit->getDepth())
- && !(outpit->getDepth() == pit->getDepth()
- && outpit->layout() == pit->layout()
- && (priorpit->getAlign() != priorpit->layout().align
- || priorpit->getDepth() > pit->getDepth())));
- Language const * const outenv_language =
- topped ? bparams.language
- : outpit->getParLanguage(bparams);
- Language const * const inenv_language =
- topped ? outpit->getParLanguage(bparams)
- : inpit->getParLanguage(bparams);
- if (outenv_language->babel() != inenv_language->babel())
- return inenv_language;
- return outenv_language;
-}
-
-
ParagraphList::const_iterator
TeXEnvironment(Buffer const & buf,
Text const & text,
bparams.documentClass().plainLayout() : pit->layout();
ParagraphList const & paragraphs = text.paragraphs();
- ParagraphList::const_iterator const priorpit =
+ 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 prior_language =
- (pit != paragraphs.begin() && priorpit != paragraphs.begin()
- && priorpit->getDepth() >= pit->getDepth()
- && !priorpit->hasSameLayout(*pit)
- && !priorpit->layout().isParagraph())
- ? priorLanguage(pit, priorpit, paragraphs.begin(), bparams)
- : priorpit->getParLanguage(bparams);
Language const * const prev_par_language =
- (pit != paragraphs.begin()) ? prior_language : doc_language;
-
+ (pit != paragraphs.begin())
+ ? (use_prev_env_language ? prev_env_language_
+ : priorpit->getParLanguage(bparams))
+ : doc_language;
if (par_language->babel() != prev_par_language->babel()) {
if (!lyxrc.language_command_end.empty() &&
if (style.isEnvironment()) {
os << "\\end{" << from_ascii(style.latexname()) << "}\n";
texrow.newline();
+ prev_env_language_ = par_language;
+ runparams.encoding = prev_encoding;
}
if (leftindent_open) {
os << "\\end{LyXParagraphLeftIndent}\n";
texrow.newline();
+ prev_env_language_ = par_language;
+ runparams.encoding = prev_encoding;
}
if (par != paragraphs.end())
(runparams.local_font != 0) ?
runparams.local_font->language() : doc_language;
- // The language that was in effect before the current paragraph.
- Language const * const prior_language =
- (pit != paragraphs.begin() && priorpit != paragraphs.begin()
- && priorpit->getDepth() >= pit->getDepth()
- && !priorpit->hasSameLayout(*pit)
- && !priorpit->layout().isParagraph())
- ? priorLanguage(pit, priorpit, paragraphs.begin(), bparams)
- : priorpit->getParLanguage(bparams);
-
// The previous language that was in effect is the language of the
// previous paragraph, unless the previous paragraph is inside an
- // environment and the current one is nested in it but with a lower
- // depth. If there is no previous paragraph, the previous language
- // is the outer language.
+ // 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()) ? prior_language : outer_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()
}
}
+ Encoding const * const prev_encoding = runparams.encoding;
+
bool const useSetSpace = bparams.documentClass().provides("SetSpace");
if (pit->allowParagraphCustomization()) {
if (pit->params().startOfAppendix()) {
os << "\\" << from_ascii(font.latexSize()) << " \\par}";
} else if (need_par) {
os << "\\par}";
- } else if (is_command)
+ } else if (is_command) {
os << '}';
+ runparams.encoding = prev_encoding;
+ }
bool pending_newline = false;
switch (style.latextype) {