Better fix for bug #5096: Language switch fails in environments.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@30804 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Enrico Forestieri 2009-07-30 01:13:11 +00:00
parent f5de1ce0df
commit 700dd75d5e

View File

@ -52,6 +52,7 @@ enum OpenEncoding {
static int open_encoding_ = none; static int open_encoding_ = none;
static int cjk_inherited_ = 0; static int cjk_inherited_ = 0;
Language const * prev_env_language_ = 0;
ParagraphList::const_iterator ParagraphList::const_iterator
@ -119,12 +120,20 @@ TeXEnvironment(Buffer const & buf,
bparams.documentClass().plainLayout() : pit->layout(); bparams.documentClass().plainLayout() : pit->layout();
ParagraphList const & paragraphs = text.paragraphs(); ParagraphList const & paragraphs = text.paragraphs();
ParagraphList::const_iterator const priorpit =
pit == paragraphs.begin() ? pit : boost::prior(pit);
bool const use_prev_env_language = priorpit->layout().isEnvironment()
&& (priorpit->getDepth() > pit->getDepth()
|| (priorpit->getDepth() == pit->getDepth()
&& priorpit->layout() != pit->layout()));
Language const * const par_language = pit->getParLanguage(bparams); Language const * const par_language = pit->getParLanguage(bparams);
Language const * const doc_language = bparams.language; Language const * const doc_language = bparams.language;
Language const * const prev_par_language = Language const * const prev_par_language =
(pit != paragraphs.begin()) (pit != paragraphs.begin())
? boost::prior(pit)->getParLanguage(bparams) ? (use_prev_env_language ? prev_env_language_
: priorpit->getParLanguage(bparams))
: doc_language; : doc_language;
if (par_language->babel() != prev_par_language->babel()) { if (par_language->babel() != prev_par_language->babel()) {
@ -244,6 +253,7 @@ TeXEnvironment(Buffer const & buf,
if (style.isEnvironment()) { if (style.isEnvironment()) {
os << "\\end{" << from_ascii(style.latexname()) << "}\n"; os << "\\end{" << from_ascii(style.latexname()) << "}\n";
texrow.newline(); texrow.newline();
prev_env_language_ = par_language;
} }
if (leftindent_open) { if (leftindent_open) {
@ -342,36 +352,23 @@ TeXOnePar(Buffer const & buf,
Language const * const outer_language = Language const * const outer_language =
(runparams.local_font != 0) ? (runparams.local_font != 0) ?
runparams.local_font->language() : doc_language; 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 previous language that was in effect is the language of the
// the language switch in the LaTeX code occurs just before switching to // previous paragraph, unless the previous paragraph is inside an
// the corresponding LaTeX environment. So, when the environment ends, // environment with nesting depth greater than (or equal to, but with
// we have to restore the language that was in effect. // a different layout) the current one. If there is no previous
bool env_lang_switch = false; // paragraph, the previous language is the outer language.
if (!priorpit->hasSameLayout(*pit)) { bool const use_prev_env_language = priorpit->layout().isEnvironment()
ParagraphList::const_iterator outpit = priorpit; && (priorpit->getDepth() > pit->getDepth()
while (outpit != paragraphs.begin() || (priorpit->getDepth() == pit->getDepth()
&& (outpit->hasSameLayout(*priorpit) && priorpit->layout() != pit->layout()));
|| outpit->getDepth() > priorpit->getDepth())) Language const * const prev_language =
outpit = boost::prior(outpit); (pit != paragraphs.begin())
ParagraphList::const_iterator const inpit = boost::next(outpit); ? (use_prev_env_language ? prev_env_language_
Language const * const outenv_language : priorpit->getParLanguage(bparams))
= outpit->getParLanguage(bparams); : outer_language;
Language const * const inenv_language
= inpit->getParLanguage(bparams);
if (outenv_language->babel() != inenv_language->babel())
env_lang_switch = true;
if (outenv_language->babel() != par_language->babel())
prev_language = outenv_language;
}
if ((par_language->babel() != prev_language->babel() || env_lang_switch) if (par_language->babel() != prev_language->babel()
// check if we already put language command in TeXEnvironment() // check if we already put language command in TeXEnvironment()
&& !(style.isEnvironment() && !(style.isEnvironment()
&& (pit == paragraphs.begin() || && (pit == paragraphs.begin() ||