#include "output_latex.h"
+#include "BiblioInfo.h"
#include "Buffer.h"
#include "BufferParams.h"
#include "Encoding.h"
struct OutputState
{
OutputState() : open_encoding_(none), cjk_inherited_(0),
- prev_env_language_(0), nest_level_(0)
+ prev_env_language_(nullptr), nest_level_(0)
{
}
OpenEncoding open_encoding_;
pit == paragraphs.begin() ? pit : prev(pit, 1);
OutputState * state = getOutputState();
- bool const use_prev_env_language = state->prev_env_language_ != 0
+ bool const use_prev_env_language = state->prev_env_language_ != nullptr
&& priorpit->layout().isEnvironment()
&& (priorpit->getDepth() > pit->getDepth()
|| (priorpit->getDepth() == pit->getDepth()
// in multilingual environments, the CJK tags have to be nested properly
data.cjk_nested = false;
- if (data.par_language->encoding()->package() == Encoding::CJK &&
- state->open_encoding_ != CJK && pit->isMultiLingual(bparams)) {
+ if (!bparams.useNonTeXFonts
+ && (bparams.inputenc == "auto-legacy"
+ || bparams.inputenc == "auto-legacy-plain")
+ && data.par_language->encoding()->package() == Encoding::CJK
+ && state->open_encoding_ != CJK && pit->isMultiLingual(bparams)) {
if (prev_par_language->encoding()->package() == Encoding::CJK) {
os << "\\begin{CJK}{"
<< from_ascii(data.par_language->encoding()->latexName())
OutputParams runparams = runparams_in;
runparams.isLastPar = (pit == pit_type(paragraphs.size() - 1));
- // We reinitialze par begin and end to be on the safe side
+ // We reinitialize par begin and end to be on the safe side
// with embedded inset as we don't know if they set those
// value correctly.
runparams.par_begin = 0;
Font const outerfont = text.outerFont(pit);
// No newline before first paragraph in this lyxtext
- if (pit > 0) {
+ if (pit > 0 && !text.inset().getLayout().parbreakIgnored()) {
os << '\n';
if (!text.inset().getLayout().parbreakIsNewline())
os << '\n';
}
Paragraph const * nextpar = runparams.isLastPar
- ? 0 : ¶graphs.at(pit + 1);
+ ? nullptr : ¶graphs.at(pit + 1);
bool const intitle_command = style.intitle && style.latextype == LATEX_COMMAND;
// This paragraph's language
Language const * const par_language = par.getParLanguage(bparams);
Language const * const nextpar_language = nextpar ?
- nextpar->getParLanguage(bparams) : 0;
+ nextpar->getParLanguage(bparams) : nullptr;
// The document's language
Language const * const doc_language = bparams.language;
// The language that was in effect when the environment this paragraph is
// inside of was opened
Language const * const outer_language =
- (runparams.local_font != 0) ?
+ (runparams.local_font != nullptr) ?
runparams.local_font->language() : doc_language;
- Paragraph const * priorpar = (pit == 0) ? 0 : ¶graphs.at(pit - 1);
+ Paragraph const * priorpar = (pit == 0) ? nullptr : ¶graphs.at(pit - 1);
// The previous language that was in effect is the language of the
// previous paragraph, unless the previous paragraph is inside an
// Note further that we take the outer language also if the prior par
// is PassThru, since in that case it has latex_language, and all secondary
// languages have been closed (#10793).
- bool const use_prev_env_language = state->prev_env_language_ != 0
+ bool const use_prev_env_language = state->prev_env_language_ != nullptr
&& priorpar
&& priorpar->layout().isEnvironment()
&& (priorpar->getDepth() > par.getDepth()
// languages (see # 10111).
bool const in_polyglossia_rtl_env =
use_polyglossia
- && runparams.local_font != 0
+ && runparams.local_font != nullptr
&& outer_language->rightToLeft()
&& !par_language->rightToLeft();
bool const localswitch = runparams_in.for_search
&& par_language->lang() != "arabic_arabtex"
&& outer_language->lang() != "arabic_arabtex"
// are we in an inset?
- && runparams.local_font != 0
+ && runparams.local_font != nullptr
// is the inset within an \L or \R?
//
// FIXME: currently, we don't check this; this means that
os << "\\L{";
}
// With CJK, the CJK tag has to be closed first (see below)
- if ((runparams.encoding->package() != Encoding::CJK || runparams.for_search)
+ if ((runparams.encoding->package() != Encoding::CJK
+ || bparams.useNonTeXFonts
+ || runparams.for_search)
&& (par_lang != openLanguageName(state) || localswitch)
&& !par_lang.empty()) {
string bc = use_polyglossia ?
if (runparams.encoding->package() == Encoding::CJK
&& par_lang != openLanguageName(state)
&& !par_lang.empty()) {
- string bc = use_polyglossia ?
- getPolyglossiaBegin(lang_begin_command, par_lang,
- par_language->polyglossiaOpts(),
- localswitch)
- : subst(lang_begin_command, "$$lang", par_lang);
- os << bc
+ os << subst(lang_begin_command, "$$lang", par_lang)
<< lang_command_termination;
if (using_begin_end)
pushLanguageName(par_lang, localswitch);
&& nextpar->getDepth() < par.getDepth()))
close_lang_switch = using_begin_end;
if (nextpar && par.params().depth() < nextpar->params().depth())
- pending_newline = true;
+ pending_newline = !text.inset().getLayout().parbreakIgnored();
break;
case LATEX_ENVIRONMENT: {
// if it's the last paragraph of the current environment
default:
// we don't need it for the last paragraph and in InTitle commands!!!
if (nextpar && !intitle_command)
- pending_newline = true;
+ pending_newline = !text.inset().getLayout().parbreakIgnored();
}
// InTitle commands use switches (not environments) for space settings
&& (par_language->lang() != "arabic_arabtex"
&& outer_language->lang() != "arabic_arabtex")
// have we opened an \L or \R environment?
- && runparams.local_font != 0
+ && runparams.local_font != nullptr
&& runparams.local_font->isRightToLeft() != par_language->rightToLeft()
// are we about to close the language?
&&((nextpar && par_lang != nextpar_lang)
if (localswitch_needed
|| (intitle_command && using_begin_end)
|| closing_rtl_ltr_environment
- || ((runparams.isLastPar || close_lang_switch)
+ || (((runparams.isLastPar && !runparams.inbranch) || close_lang_switch)
&& (par_lang != outer_lang || (using_begin_end
&& style.isEnvironment()
&& par_lang != nextpar_lang)))) {
os << '\n';
// when the paragraph uses CJK, the language has to be closed earlier
- if ((font.language()->encoding()->package() != Encoding::CJK) || runparams_in.for_search) {
+ if ((font.language()->encoding()->package() != Encoding::CJK)
+ || bparams.useNonTeXFonts
+ || runparams_in.for_search) {
if (lang_end_command.empty()) {
// If this is a child, we should restore the
// master language after the last paragraph.
localswitch)
: subst(lang_begin_command, "$$lang", current_lang);
os << bc;
- pending_newline = !localswitch;
+ pending_newline = !localswitch
+ && !text.inset().getLayout().parbreakIgnored();
unskip_newline = !localswitch;
if (using_begin_end)
pushLanguageName(current_lang, localswitch);
lang_end_command,
"$$lang",
par_lang));
- pending_newline = !localswitch;
+ pending_newline = !localswitch
+ && !text.inset().getLayout().parbreakIgnored();
unskip_newline = !localswitch;
if (using_begin_end)
popLanguageName();
// if this is a CJK-paragraph and the next isn't, close CJK
// also if the next paragraph is a multilingual environment (because of nesting)
- if (nextpar
- && (state->open_encoding_ == CJK && bparams.encoding().iconvName() != "UTF-8"
- && bparams.encoding().package() != Encoding::CJK )
+ if (nextpar && state->open_encoding_ == CJK
+ && bparams.encoding().iconvName() != "UTF-8"
+ && bparams.encoding().package() != Encoding::CJK
&& (nextpar_language->encoding()->package() != Encoding::CJK
- || (nextpar->layout().isEnvironment() && nextpar->isMultiLingual(bparams)))
+ || (nextpar->layout().isEnvironment() && nextpar->isMultiLingual(bparams)))
// inbetween environments, CJK has to be closed later (nesting!)
&& (!style.isEnvironment() || !nextpar->layout().isEnvironment())) {
os << "\\end{CJK}\n";
break;
}
case inputenc: {
+ // FIXME: If we are in an inset and the switch happened outside this inset,
+ // do not switch back at the end of the inset (bug #8479)
+ // The following attempt does not help with listings-caption in a CJK document:
+ // if (runparams_in.local_font != 0
+ // && runparams_in.encoding == runparams_in.local_font->language()->encoding())
+ // break;
os << "\\egroup";
state->open_encoding_ = none;
break;
// If this is the last paragraph of the inset and a local_font was set upon entering
// and we are mixing encodings ("auto-legacy" or "auto-legacy-plain" and no XeTeX or LuaTeX),
// ensure the encoding is set back to the default encoding of the local language.
- if (runparams.isLastPar && runparams_in.local_font != 0
+ if (runparams.isLastPar && runparams_in.local_font != nullptr
&& runparams_in.encoding != runparams_in.local_font->language()->encoding()
&& (bparams.inputenc == "auto-legacy" || bparams.inputenc == "auto-legacy-plain")
&& !runparams.isFullUnicode()
// Note from JMarc: we will re-add a \n explicitly in
// TeXEnvironment, because it is needed in this case
if (nextpar && !os.afterParbreak() && !last_was_separator) {
- // Make sure to start a new line
- os << breakln;
Layout const & next_layout = nextpar->layout();
+ if (!text.inset().getLayout().parbreakIgnored())
+ // Make sure to start a new line
+ os << breakln;
// A newline '\n' is always output before a command,
// so avoid doubling it.
if (!next_layout.isCommand()) {
if ((style == next_layout
&& !style.parbreak_is_newline
&& !text.inset().getLayout().parbreakIsNewline()
+ && !text.inset().getLayout().parbreakIgnored()
&& style.latextype != LATEX_ITEM_ENVIRONMENT
&& style.latextype != LATEX_LIST_ENVIRONMENT
- && style.align == par.getAlign()
+ && style.align == par.getAlign(bparams)
&& nextpar->getDepth() == par.getDepth()
- && nextpar->getAlign() == par.getAlign())
+ && nextpar->getAlign(bparams) == par.getAlign(bparams))
|| (!next_layout.isEnvironment()
&& nextpar->getDepth() > par.getDepth()
- && nextpar->getAlign() == next_layout.align)
+ && nextpar->getAlign(bparams) == next_layout.align)
|| (!style.isEnvironment()
&& next_layout.latextype == LATEX_ENVIRONMENT
&& nextpar->getDepth() < par.getDepth())
|| (style.isCommand()
&& !next_layout.isEnvironment()
- && style.align == par.getAlign()
- && next_layout.align == nextpar->getAlign())
- || (style.align != par.getAlign()
+ && style.align == par.getAlign(bparams)
+ && next_layout.align == nextpar->getAlign(bparams))
+ || (style.align != par.getAlign(bparams)
&& tclass.isDefaultLayout(next_layout))) {
os << '\n';
}
if (multibib_child && mparams.useBiblatex())
os << "\\newrefsection";
- else if (multibib_child && mparams.useBibtopic()) {
+ else if (multibib_child && mparams.useBibtopic()
+ && !buf.masterBibInfo().empty()) {
os << "\\begin{btUnit}\n";
runparams.openbtUnit = true;
}
&& runparams.use_CJK))
) {
docstring const cjkenc = bparams.encoding().iconvName() == "UTF-8"
- ? from_ascii("UTF8") : from_ascii(bparams.encoding().latexName());
+ ? from_ascii("UTF8")
+ : from_ascii(bparams.encoding().latexName());
os << "\\begin{CJK}{" << cjkenc
<< "}{" << from_ascii(bparams.fonts_cjk) << "}%\n";
state->open_encoding_ = CJK;
&& layout.latexname() == bparams.multibib) {
if (runparams.openbtUnit)
os << "\\end{btUnit}\n";
- if (!bparams.useBiblatex()) {
+ if (!bparams.useBiblatex()
+ && !buf.masterBibInfo().empty()) {
os << '\n' << "\\begin{btUnit}\n";
runparams.openbtUnit = true;
}
finishEnvironment(os, runparams, data);
}
+ // FIXME: uncomment the content or remove this block
if (pit == runparams.par_end) {
// Make sure that the last paragraph is
// correctly terminated (because TeXOnePar does
// if "auto end" is switched off, explicitly close the language at the end
// but only if the last par is in a babel or polyglossia language
+ Language const * const lastpar_language =
+ paragraphs.at(lastpit).getParLanguage(bparams);
if (maintext && !lyxrc.language_auto_end && !mainlang.empty() &&
- paragraphs.at(lastpit).getParLanguage(bparams)->encoding()->package() != Encoding::CJK) {
+ lastpar_language->encoding()->package() != Encoding::CJK) {
os << from_utf8(subst(lang_end_command,
"$$lang",
mainlang))
state->open_encoding_ = none;
}
// Likewise for polyglossia or when using begin/end commands
+ // or at the very end of an active branch inset with a language switch
+ Language const * const outer_language = (runparams.local_font != nullptr)
+ ? runparams.local_font->language() : bparams.language;
+ string const & prev_lang = runparams.use_polyglossia
+ ? getPolyglossiaEnvName(outer_language)
+ : outer_language->babel();
+ string const lastpar_lang = runparams.use_polyglossia ?
+ getPolyglossiaEnvName(lastpar_language): lastpar_language->babel();
string const & cur_lang = openLanguageName(state);
- if (maintext && !is_child && !cur_lang.empty()) {
+ if (((runparams.inbranch && langOpenedAtThisLevel(state) && prev_lang != cur_lang)
+ || (maintext && !is_child)) && !cur_lang.empty()) {
os << from_utf8(subst(lang_end_command,
"$$lang",
cur_lang))
<< '\n';
if (using_begin_end)
popLanguageName();
+ } else if (runparams.inbranch && !using_begin_end
+ && prev_lang != lastpar_lang && !lastpar_lang.empty()) {
+ // with !using_begin_end, cur_lang is empty, so we need to
+ // compare against the paragraph language (and we are in the
+ // last paragraph at this point)
+ os << subst(lang_begin_command, "$$lang", prev_lang) << '\n';
}
// reset inherited encoding
OutputParams const & runparams, Encoding const & newEnc,
bool force, bool noswitchmacro)
{
- // Never switch encoding with non-TeX fonts (always "utf8plain"),
- // with LuaTeX and TeX fonts (only one encoding accepted by luainputenc),
+ // Never switch encoding with XeTeX/LuaTeX
// or if we're in a moving argument or inherit the outer encoding.
- if (bparams.useNonTeXFonts
- || runparams.flavor == OutputParams::LUATEX
- || runparams.flavor == OutputParams::DVILUATEX
- || newEnc.name() == "inherit")
- return make_pair(false, 0);
+ if (runparams.isFullUnicode() || newEnc.name() == "inherit")
+ return make_pair(false, 0);
// Only switch for auto-selected legacy encodings (inputenc setting
// "auto-legacy" or "auto-legacy-plain").
if (oldEnc.name() == newEnc.name()
|| oldEnc.package() == Encoding::japanese
|| oldEnc.package() == Encoding::none
- || newEnc.package() == Encoding::none)
+ || newEnc.package() == Encoding::none
+ || runparams.for_search)
return make_pair(false, 0);
// FIXME We ignore encoding switches from/to encodings that do
// neither support the inputenc package nor the CJK package here.
state->open_encoding_ = none;
count += 7;
}
- if (runparams.local_font != 0
+ if (runparams.local_font != nullptr
&& oldEnc.package() == Encoding::CJK) {
// within insets, \inputenc switches need
// to be embraced within \bgroup...\egroup;