bparams.documentClass().plainLayout() : pit->layout();
ParagraphList const & paragraphs = text.paragraphs();
+ bool const firstpar = pit == paragraphs.begin();
ParagraphList::const_iterator const priorpit =
- pit == paragraphs.begin() ? pit : prev(pit, 1);
+ firstpar ? pit : prev(pit, 1);
OutputState * state = getOutputState();
bool const use_prev_env_language = state->prev_env_language_ != nullptr
data.par_language = pit->getParLanguage(bparams);
Language const * const doc_language = bparams.language;
Language const * const prev_par_language =
- (pit != paragraphs.begin())
- ? (use_prev_env_language ? state->prev_env_language_
- : priorpit->getParLanguage(bparams))
- : doc_language;
+ // use font at inset or document language in first paragraph
+ firstpar ? (runparams.local_font ?
+ runparams.local_font->language()
+ : doc_language)
+ : (use_prev_env_language ?
+ state->prev_env_language_
+ : priorpit->getParLanguage(bparams));
bool const use_polyglossia = runparams.use_polyglossia;
string const par_lang = use_polyglossia ?
!lang_end_command.empty();
// For polyglossia, switch language outside of environment, if possible.
+ // However, if we are at the start of an inset, do not close languages
+ // opened outside.
if (par_lang != prev_par_lang) {
- if ((!using_begin_end || langOpenedAtThisLevel(state)) &&
- !lang_end_command.empty() &&
- prev_par_lang != doc_lang &&
- !prev_par_lang.empty()) {
+ if (!firstpar
+ && (!using_begin_end || langOpenedAtThisLevel(state))
+ && !lang_end_command.empty()
+ && prev_par_lang != doc_lang
+ && !prev_par_lang.empty()) {
os << from_ascii(subst(
lang_end_command,
"$$lang",
static void finishEnvironment(otexstream & os, OutputParams const & runparams,
- TeXEnvironmentData const & data)
+ TeXEnvironmentData const & data, bool const maintext,
+ bool const lastpar)
{
OutputState * state = getOutputState();
- // BufferParams const & bparams = buf.params(); // FIXME: for speedup shortcut below, would require passing of "buf" as argument
+ // BufferParams const & bparams = buf.params();
+ // FIXME: for speedup shortcut below, would require passing of "buf" as argument
if (state->open_encoding_ == CJK && data.cjk_nested) {
// We need to close the encoding even if it does not change
// to do correct environment nesting
runparams.encoding = data.prev_encoding;
os << setEncoding(data.prev_encoding->iconvName());
}
+ // If this is the last par of an inset, the language needs
+ // to be closed after the environment
+ if (lastpar && !maintext) {
+ if (using_begin_end && langOpenedAtThisLevel(state)) {
+ if (isLocalSwitch(state)) {
+ os << "}";
+ } else {
+ os << "\\end{"
+ << openLanguageName(state)
+ << "}%\n";
+ }
+ popLanguageName();
+ }
+ }
}
if (data.leftindent_open) {
{
ParagraphList const & paragraphs = text.paragraphs();
ParagraphList::const_iterator ipar = paragraphs.iterator_at(pit);
- LYXERR(Debug::LATEX, "TeXEnvironment for paragraph " << pit);
+ LYXERR(Debug::OUTFILE, "TeXEnvironment for paragraph " << pit);
Layout const & current_layout = ipar->layout();
depth_type const current_depth = ipar->params().depth();
if (runparams.for_searchAdv == OutputParams::NoSearch)
output_changes = buf.params().output_changes;
else
- output_changes = (runparams.for_searchAdv == OutputParams::SearchWithDeleted);
+ output_changes = ((runparams.for_searchAdv & OutputParams::SearchWithDeleted) != 0);
if (size_t(pit + 1) < paragraphs.size()) {
ParagraphList::const_iterator nextpar = paragraphs.iterator_at(pit + 1);
Paragraph const & cpar = paragraphs.at(pit);
prepareEnvironment(buf, text, par, os, runparams);
// Recursive call to TeXEnvironment!
TeXEnvironment(buf, text, runparams, pit, os);
- finishEnvironment(os, runparams, data);
+ bool const lastpar = size_t(pit + 1) >= paragraphs.size();
+ finishEnvironment(os, runparams, data, text.isMainText(), lastpar);
}
if (pit != runparams.par_end)
- LYXERR(Debug::LATEX, "TeXEnvironment for paragraph " << par_begin << " done.");
+ LYXERR(Debug::OUTFILE, "TeXEnvironment for paragraph " << par_begin << " done.");
}
}
+bool languageStackEmpty()
+{
+ OutputState * state = getOutputState();
+
+ return state->lang_switch_depth_.empty();
+}
+
+
string const & openLanguageName()
{
OutputState * state = getOutputState();
// Do not output empty commands if the whole paragraph has
// been deleted with ct and changes are not output.
- if ((runparams_in.for_searchAdv != OutputParams::SearchWithDeleted) && style.latextype != LATEX_ENVIRONMENT
+ if (((runparams_in.for_searchAdv & OutputParams::SearchWithDeleted) == 0) && style.latextype != LATEX_ENVIRONMENT
&& !par.empty() && par.isDeleted(0, par.size()) && !bparams.output_changes)
return;
- LYXERR(Debug::LATEX, "TeXOnePar for paragraph " << pit << " ptr " << &par << " '"
- << everypar << "'");
+ LYXERR(Debug::OUTFILE, "TeXOnePar for paragraph " << pit << " ptr " << &par << " '"
+ << everypar << "'");
OutputParams runparams = runparams_in;
runparams.isLastPar = (pit == pit_type(paragraphs.size() - 1));
break;
}
}
+ bool const have_prior_nptpar =
+ prior_nontitle_par && !prior_nontitle_par->isPassThru();
Language const * const prev_language =
runparams_in.for_searchAdv != OutputParams::NoSearch
? languages.getLanguage("ignore")
- : (prior_nontitle_par && !prior_nontitle_par->isPassThru())
+ : (have_prior_nptpar)
? (use_prev_env_language
? state->prev_env_language_
: prior_nontitle_par->getParLanguage(bparams))
use_polyglossia
&& runparams.local_font != nullptr
&& outer_language->rightToLeft()
- && !par_language->rightToLeft();
+ && !par_language->rightToLeft()
+ && !(have_prior_nptpar
+ && (prev_language->rightToLeft() != par_language->rightToLeft()));
bool const localswitch =
(runparams_in.for_searchAdv != OutputParams::NoSearch
|| text.inset().forceLocalFontSwitch()
if (intitle_command)
state->nest_level_ -= 1;
- LYXERR(Debug::LATEX, "TeXOnePar for paragraph " << pit << " done; ptr "
- << &par << " next " << nextpar);
+ LYXERR(Debug::OUTFILE, "TeXOnePar for paragraph " << pit << " done; ptr "
+ << &par << " next " << nextpar);
return;
}
if (runparams.for_searchAdv == OutputParams::NoSearch)
output_changes = bparams.output_changes;
else
- output_changes = (runparams.for_searchAdv == OutputParams::SearchWithDeleted);
- if (size_t(pit + 1) < paragraphs.size()) {
+ output_changes = ((runparams.for_searchAdv & OutputParams::SearchWithDeleted) != 0);
+ bool const lastpar = size_t(pit + 1) >= paragraphs.size();
+ if (!lastpar) {
ParagraphList::const_iterator nextpar = paragraphs.iterator_at(pit + 1);
Paragraph const & cpar = paragraphs.at(pit);
if ((par->layout() != nextpar->layout()
prepareEnvironment(buf, text, par, os, runparams);
// pit can be changed in TeXEnvironment.
TeXEnvironment(buf, text, runparams, pit, os);
- finishEnvironment(os, runparams, data);
+ finishEnvironment(os, runparams, data, maintext, lastpar);
}
// FIXME: uncomment the content or remove this block
<< '\n';
// If we have language_auto_begin, the stack will
// already be empty, nothing to pop()
- if (using_begin_end && !lyxrc.language_auto_begin)
+ if (using_begin_end && langOpenedAtThisLevel(state))
popLanguageName();
}
// but it is the best we can do.
// change encoding
- LYXERR(Debug::LATEX, "Changing LaTeX encoding from "
+ LYXERR(Debug::OUTFILE, "Changing LaTeX encoding from "
<< oldEnc.name() << " to " << newEnc.name());
os << setEncoding(newEnc.iconvName());
if (bparams.inputenc == "auto-legacy-plain")