#include "Font.h"
#include "InsetList.h"
#include "Language.h"
-#include "LaTeXFeatures.h"
-#include "Layout.h"
#include "LyXRC.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "support/convert.h"
#include "support/debug.h"
#include "support/lstrings.h"
-#include "support/lyxalgo.h"
#include "support/textutils.h"
#include "support/gettext.h"
struct OutputState
{
- OutputState() : open_encoding_(none), cjk_inherited_(0),
- prev_env_language_(nullptr), nest_level_(0)
+ OutputState() : prev_env_language_(nullptr), open_encoding_(none),
+ cjk_inherited_(0), nest_level_(0)
{
}
- OpenEncoding open_encoding_;
- int cjk_inherited_;
Language const * prev_env_language_;
- int nest_level_;
stack<int> lang_switch_depth_; // Both are always empty when
stack<string> open_polyglossia_lang_; // not using polyglossia
+ OpenEncoding open_encoding_;
+ int cjk_inherited_;
+ int nest_level_;
};
// commands. Instead, return always true when using babel with
// only a begin command.
- return state->lang_switch_depth_.size() == 0
+ return state->lang_switch_depth_.empty()
? true
: abs(state->lang_switch_depth_.top()) == state->nest_level_;
}
{
// Return true if the language was opened by a local command switch.
- return state->lang_switch_depth_.size()
+ return !state->lang_switch_depth_.empty()
&& state->lang_switch_depth_.top() < 0;
}
{
// Return true if the language was opened at the current nesting level.
- return state->lang_switch_depth_.size()
+ return !state->lang_switch_depth_.empty()
&& abs(state->lang_switch_depth_.top()) == state->nest_level_;
}
struct TeXEnvironmentData
{
- bool cjk_nested;
Layout const * style;
Language const * par_language;
Encoding const * prev_encoding;
+ bool cjk_nested;
bool leftindent_open;
};
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",
// polyglossia or begin/end commands, then the current
// language is the document language.
string const & cur_lang = using_begin_end
- && state->lang_switch_depth_.size()
+ && !state->lang_switch_depth_.empty()
? openLanguageName(state)
: doc_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
popLanguageName();
}
}
+ if (data.style->latextype == LATEX_BIB_ENVIRONMENT)
+ // bibliography needs a blank line after
+ // each item for backref to function properly
+ // (see #12041)
+ os << '\n';
state->nest_level_ -= 1;
string const & name = data.style->latexname();
if (!name.empty())
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) {
pit_type & pit, otexstream & os)
{
ParagraphList const & paragraphs = text.paragraphs();
- ParagraphList::const_iterator ipar = paragraphs.constIterator(pit);
+ ParagraphList::const_iterator ipar = paragraphs.iterator_at(pit);
LYXERR(Debug::LATEX, "TeXEnvironment for paragraph " << pit);
Layout const & current_layout = ipar->layout();
// This is for debugging purpose at the end.
pit_type const par_begin = pit;
for (; pit < runparams.par_end; ++pit) {
- ParagraphList::const_iterator par = paragraphs.constIterator(pit);
+ ParagraphList::const_iterator par = paragraphs.iterator_at(pit);
// check first if this is an higher depth paragraph.
bool go_out = (par->params().depth() < current_depth);
continue;
}
+ // Do not output empty environments if the whole paragraph has
+ // been deleted with ct and changes are not output.
+ bool output_changes;
+ if (runparams.for_searchAdv == OutputParams::NoSearch)
+ output_changes = buf.params().output_changes;
+ else
+ output_changes = (runparams.for_searchAdv == OutputParams::SearchWithDeleted);
+ if (size_t(pit + 1) < paragraphs.size()) {
+ ParagraphList::const_iterator nextpar = paragraphs.iterator_at(pit + 1);
+ Paragraph const & cpar = paragraphs.at(pit);
+ if ((par->layout() != nextpar->layout()
+ || par->params().depth() == nextpar->params().depth()
+ || par->params().leftIndent() == nextpar->params().leftIndent())
+ && !cpar.empty()
+ && cpar.isDeleted(0, cpar.size()) && !output_changes) {
+ if (!output_changes && !cpar.parEndChange().deleted())
+ os << '\n' << '\n';
+ continue;
+ }
+ }
+
// This is a new environment.
TeXEnvironmentData const data =
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)
void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs,
- map<int, lyx::InsetArgument const *> ilist, vector<string> required, string const & prefix)
+ map<size_t, lyx::InsetArgument const *> ilist, vector<string> required, string const & prefix)
{
- unsigned int const argnr = latexargs.size();
+ size_t const argnr = latexargs.size();
if (argnr == 0)
return;
// other arguments, consider this.
for (auto const & larg : latexargs) {
Layout::latexarg const & arg = larg.second;
- if ((!arg.presetarg.empty() || !arg.defaultarg.empty()) && !arg.requires.empty()) {
- vector<string> req = getVectorFromString(arg.requires);
+ if ((!arg.presetarg.empty() || !arg.defaultarg.empty()) && !arg.required.empty()) {
+ vector<string> req = getVectorFromString(arg.required);
required.insert(required.end(), req.begin(), req.end());
}
}
- for (unsigned int i = 1; i <= argnr; ++i) {
- map<int, InsetArgument const *>::const_iterator lit = ilist.find(i);
+ for (size_t i = 1; i <= argnr; ++i) {
+ map<size_t, InsetArgument const *>::const_iterator lit = ilist.find(i);
bool inserted = false;
if (lit != ilist.end()) {
- InsetArgument const * ins = (*lit).second;
+ InsetArgument const * ins = lit->second;
if (ins) {
Layout::LaTeXArgMap::const_iterator const lait =
latexargs.find(ins->name());
if (lait != latexargs.end()) {
- Layout::latexarg arg = (*lait).second;
+ Layout::latexarg arg = lait->second;
docstring ldelim;
docstring rdelim;
if (!arg.nodelims) {
}
}
}
- if (runparams.for_search) {
+ if ((runparams.for_searchAdv != OutputParams::NoSearch) && argnr > 1) {
// Mark end of arguments for findadv() only
os << "\\endarguments{}";
}
void addArgInsets(Paragraph const & par, string const & prefix,
Layout::LaTeXArgMap const & latexargs,
- map<int, InsetArgument const *> & ilist,
+ map<size_t, InsetArgument const *> & ilist,
vector<string> & required)
{
for (auto const & table : par.insetList()) {
}
string const name = prefix.empty() ?
arg->name() : split(arg->name(), ':');
- // why converting into an integer?
- unsigned int const nr = convert<unsigned int>(name);
- if (ilist.find(nr) == ilist.end())
- ilist[nr] = arg;
+ size_t const nr = convert<size_t>(name);
+ ilist.insert({nr, arg});
Layout::LaTeXArgMap::const_iterator const lit =
latexargs.find(arg->name());
if (lit != latexargs.end()) {
Layout::latexarg const & larg = lit->second;
- vector<string> req = getVectorFromString(larg.requires);
+ vector<string> req = getVectorFromString(larg.required);
move(req.begin(), req.end(), back_inserter(required));
}
}
Layout::LaTeXArgMap const & latexargs,
string const & prefix)
{
- map<int, InsetArgument const *> ilist;
+ map<size_t, InsetArgument const *> ilist;
vector<string> required;
addArgInsets(par, prefix, latexargs, ilist, required);
getArgInsets(os, runparams, latexargs, ilist, required, prefix);
Layout::LaTeXArgMap const & latexargs,
string const & prefix)
{
- map<int, InsetArgument const *> ilist;
+ map<size_t, InsetArgument const *> ilist;
vector<string> required;
depth_type const current_depth = pit->params().depth();
Layout const current_layout = pit->layout();
// get the first paragraph in sequence with this layout and depth
- pit_type offset = 0;
+ ptrdiff_t offset = 0;
while (true) {
- if (lyx::prev(pit, offset) == pars.begin())
+ if (prev(pit, offset) == pars.begin())
break;
- ParagraphList::const_iterator priorpit = lyx::prev(pit, offset + 1);
+ ParagraphList::const_iterator priorpit = prev(pit, offset + 1);
if (priorpit->layout() == current_layout
&& priorpit->params().depth() == current_depth)
++offset;
break;
}
- ParagraphList::const_iterator spit = lyx::prev(pit, offset);
-
+ ParagraphList::const_iterator spit = prev(pit, offset);
for (; spit != pars.end(); ++spit) {
if (spit->layout() != current_layout ||
spit->params().depth() < current_depth)
Layout::LaTeXArgMap const & latexargs,
string const & prefix)
{
- map<int, InsetArgument const *> ilist;
+ map<size_t, InsetArgument const *> ilist;
vector<string> required;
for (Paragraph const & par : pars) {
break;
case LATEX_ITEM_ENVIRONMENT:
case LATEX_LIST_ENVIRONMENT:
- if (runparams.for_search) {
+ if (runparams.for_searchAdv != OutputParams::NoSearch) {
os << "\\" + style.itemcommand() << "{" << style.latexname() << "}";
}
else {
}
break;
case LATEX_ENVIRONMENT:
- if (runparams.for_search) {
+ if (runparams.for_searchAdv != OutputParams::NoSearch) {
os << "\\latexenvironment{" << style.latexname() << "}{";
}
break;
if (style.inpreamble && !force)
return;
+ // 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
+ && !par.empty() && par.isDeleted(0, par.size()) && !bparams.output_changes)
+ return;
+
LYXERR(Debug::LATEX, "TeXOnePar for paragraph " << pit << " ptr " << &par << " '"
<< everypar << "'");
state->open_encoding_ = none;
}
+ // This paragraph is merged and we do not show changes in the output
+ bool const merged_par = !bparams.output_changes && par.parEndChange().deleted();
+
if (text.inset().isPassThru()) {
Font const outerfont = text.outerFont(pit);
// No newline before first paragraph in this lyxtext
- if (pit > 0 && !text.inset().getLayout().parbreakIgnored()) {
+ if (pit > 0 && !text.inset().getLayout().parbreakIgnored() && !merged_par) {
os << '\n';
if (!text.inset().getLayout().parbreakIsNewline())
os << '\n';
? nullptr : ¶graphs.at(pit + 1);
bool const intitle_command = style.intitle && style.isCommand();
+ // Intitle commands switch languages locally, thus increase
+ // language nesting level
+ if (intitle_command)
+ state->nest_level_ += 1;
if (style.pass_thru) {
Font const outerfont = text.outerFont(pit);
// Due to the moving argument, some fragile
// commands (labels, index entries)
// are output after this command (#2154)
- runparams.postpone_fragile_stuff = true;
+ runparams.postpone_fragile_stuff =
+ bparams.postpone_fragile_content;
if (intitle_command)
os << '{';
if (par.needsCProtection(runparams.moving_arg)
&& contains(runparams.active_chars, '^'))
os << "\\endgroup";
- os << "\n";
+ if (merged_par)
+ os << "{}";
+ else
+ os << "\n";
}
- else
+ else if (!merged_par)
os << '\n';
- if (!style.parbreak_is_newline) {
+ if (!style.parbreak_is_newline && !merged_par) {
os << '\n';
} else if (nextpar && !style.isEnvironment()) {
Layout const nextstyle = text.inset().forcePlainLayout()
? bparams.documentClass().plainLayout()
: nextpar->layout();
- if (nextstyle.name() != style.name())
+ if (nextstyle.name() != style.name() && !merged_par)
os << '\n';
}
}
}
Language const * const prev_language =
- runparams_in.for_search
+ runparams_in.for_searchAdv != OutputParams::NoSearch
? languages.getLanguage("ignore")
: (prior_nontitle_par && !prior_nontitle_par->isPassThru())
? (use_prev_env_language
// Due to the moving argument, some fragile
// commands (labels, index entries)
// are output after this command (#2154)
- runparams.postpone_fragile_stuff = true;
+ runparams.postpone_fragile_stuff =
+ bparams.postpone_fragile_content;
os << '{';
}
&& outer_language->rightToLeft()
&& !par_language->rightToLeft();
bool const localswitch =
- (runparams_in.for_search
+ (runparams_in.for_searchAdv != OutputParams::NoSearch
|| text.inset().forceLocalFontSwitch()
|| (using_begin_end && text.inset().forcePlainLayout())
|| in_polyglossia_rtl_env)
bool const localswitch_needed = localswitch && par_lang != outer_lang;
// localswitches need to be closed and reopened at each par
- if (runparams_in.for_search || ((par_lang != prev_lang || localswitch_needed)
+ if ((runparams_in.for_searchAdv != OutputParams::NoSearch) || ((par_lang != prev_lang || localswitch_needed)
// check if we already put language command in TeXEnvironment()
&& !(style.isEnvironment()
&& (pit == 0 || (priorpar->layout() != par.layout()
// With CJK, the CJK tag has to be closed first (see below)
if ((runparams.encoding->package() != Encoding::CJK
|| bparams.useNonTeXFonts
- || runparams.for_search)
+ || (runparams.for_searchAdv != OutputParams::NoSearch))
&& (par_lang != openLanguageName(state) || localswitch || intitle_command)
&& !par_lang.empty()) {
string bc = use_polyglossia ?
// Due to the moving argument, some fragile
// commands (labels, index entries)
// are output after this command (#2154)
- runparams.postpone_fragile_stuff = true;
+ runparams.postpone_fragile_stuff =
+ bparams.postpone_fragile_content;
}
Font const outerfont = text.outerFont(pit);
&& nextpar->getDepth() < par.getDepth()))
close_lang_switch = using_begin_end;
if (nextpar && par.params().depth() < nextpar->params().depth())
- pending_newline = !text.inset().getLayout().parbreakIgnored();
+ pending_newline = !text.inset().getLayout().parbreakIgnored() && !merged_par;
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 = !text.inset().getLayout().parbreakIgnored();
+ pending_newline = !text.inset().getLayout().parbreakIgnored() && !merged_par;
}
// InTitle commands use switches (not environments) for space settings
// when the paragraph uses CJK, the language has to be closed earlier
if ((font.language()->encoding()->package() != Encoding::CJK)
|| bparams.useNonTeXFonts
- || runparams_in.for_search) {
+ || (runparams_in.for_searchAdv != OutputParams::NoSearch)) {
if (lang_end_command.empty()) {
// If this is a child, we should restore the
// master language after the last paragraph.
&& nextpar
&& style != nextpar->layout())))
|| (atSameLastLangSwitchDepth(state)
- && state->lang_switch_depth_.size()
+ && !state->lang_switch_depth_.empty()
&& cur_lang != par_lang)
|| in_polyglossia_rtl_env)
{
}
bool const last_was_separator =
- par.size() > 0 && par.isEnvSeparator(par.size() - 1);
+ !par.empty() && par.isEnvSeparator(par.size() - 1);
+
+ // Signify added/deleted par break in output if show changes in output
+ if (nextpar && !os.afterParbreak() && !last_was_separator
+ && bparams.output_changes && par.parEndChange().changed()) {
+ Changes::latexMarkChange(os, bparams, Change(Change::UNCHANGED),
+ par.parEndChange(), runparams);
+ os << bparams.encoding().latexString(docstring(1, 0x00b6)).first << "}";
+ }
if (pending_newline) {
if (unskip_newline)
if (nextpar && state->open_encoding_ == CJK
&& bparams.encoding().iconvName() != "UTF-8"
&& bparams.encoding().package() != Encoding::CJK
- && (nextpar_language->encoding()->package() != Encoding::CJK
+ && ((nextpar_language &&
+ nextpar_language->encoding()->package() != Encoding::CJK)
|| (nextpar->layout().isEnvironment() && nextpar->isMultiLingual(bparams)))
// inbetween environments, CJK has to be closed later (nesting!)
&& (!style.isEnvironment() || !nextpar->layout().isEnvironment())) {
// Also pass the post_macros upstream
runparams_in.post_macro = runparams.post_macro;
+ // These need to be passed upstream as well
+ runparams_in.need_maketitle = runparams.need_maketitle;
+ runparams_in.have_maketitle = runparams.have_maketitle;
// we don't need a newline for the last paragraph!!!
// 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) {
- Layout const & next_layout = nextpar->layout();
- if (!text.inset().getLayout().parbreakIgnored())
+ if (!text.inset().getLayout().parbreakIgnored() && !merged_par)
// Make sure to start a new line
os << breakln;
// A newline '\n' is always output before a command,
// so avoid doubling it.
+ Layout const & next_layout = nextpar->layout();
if (!next_layout.isCommand()) {
// Here we now try to avoid spurious empty lines by
// outputting a paragraph break only if: (case 1) the
&& next_layout.align == nextpar->getAlign(bparams))
|| (style.align != par.getAlign(bparams)
&& tclass.isDefaultLayout(next_layout))) {
- os << '\n';
+ // and omit paragraph break if it has been deleted with ct
+ // and changes are not shown in output
+ if (!merged_par) {
+ if (runparams.isNonLong)
+ // This is to allow parbreak in multirow
+ // It could also be used for other non-long
+ // contexts
+ os << "\\endgraf\n";
+ else
+ os << '\n';
+ }
}
}
}
+ // Reset language nesting level after intitle command
+ if (intitle_command)
+ state->nest_level_ -= 1;
+
LYXERR(Debug::LATEX, "TeXOnePar for paragraph " << pit << " done; ptr "
<< &par << " next " << nextpar);
// The full doc will be exported but it is easier to just rely on
// runparams range parameters that will be passed TeXEnvironment.
runparams.par_begin = 0;
- runparams.par_end = paragraphs.size();
+ runparams.par_end = static_cast<int>(paragraphs.size());
}
pit_type pit = runparams.par_begin;
// lastpit is for the language check after the loop.
pit_type lastpit = pit;
- // variables used in the loop:
- bool was_title = false;
- bool already_title = false;
DocumentClass const & tclass = bparams.documentClass();
// Did we already warn about inTitle layout mixing? (we only warn once)
bool gave_layout_warning = false;
for (; pit < runparams.par_end; ++pit) {
lastpit = pit;
- ParagraphList::const_iterator par = paragraphs.constIterator(pit);
+ ParagraphList::const_iterator par = paragraphs.iterator_at(pit);
// FIXME This check should not be needed. We should
// perhaps issue an error if it is.
tclass.plainLayout() : par->layout();
if (layout.intitle) {
- if (already_title) {
+ if (runparams.have_maketitle) {
if (!gave_layout_warning && !runparams.dryrun) {
gave_layout_warning = true;
frontend::Alert::warning(_("Error in latexParagraphs"),
"could lead to missing or incorrect output."
), layout.name()));
}
- } else if (!was_title) {
- was_title = true;
+ } else if (!runparams.need_maketitle) {
+ runparams.need_maketitle = true;
if (tclass.titletype() == TITLE_ENVIRONMENT) {
os << "\\begin{"
<< from_ascii(tclass.titlename())
<< "}\n";
}
}
- } else if (was_title && !already_title && !layout.inpreamble) {
+ } else if (runparams.need_maketitle && !runparams.have_maketitle
+ && !layout.inpreamble && !text.inset().isInTitle()) {
if (tclass.titletype() == TITLE_ENVIRONMENT) {
os << "\\end{" << from_ascii(tclass.titlename())
<< "}\n";
os << "\\" << from_ascii(tclass.titlename())
<< "\n";
}
- already_title = true;
- was_title = false;
+ runparams.have_maketitle = true;
+ runparams.need_maketitle = false;
}
if (layout.isCommand() && !layout.latexname().empty()
continue;
}
+ // Do not output empty environments if the whole paragraph has
+ // been deleted with ct and changes are not output.
+ bool output_changes;
+ if (runparams.for_searchAdv == OutputParams::NoSearch)
+ output_changes = bparams.output_changes;
+ else
+ output_changes = (runparams.for_searchAdv == OutputParams::SearchWithDeleted);
+ 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()
+ || par->params().depth() == nextpar->params().depth()
+ || par->params().leftIndent() == nextpar->params().leftIndent())
+ && !cpar.empty()
+ && cpar.isDeleted(0, cpar.size()) && !output_changes) {
+ if (!cpar.parEndChange().deleted())
+ os << '\n' << '\n';
+ continue;
+ }
+ } else {
+ // This is the last par
+ Paragraph const & cpar = paragraphs.at(pit);
+ if ( !cpar.empty()
+ && cpar.isDeleted(0, cpar.size()) && !output_changes) {
+ if (!cpar.parEndChange().deleted())
+ os << '\n' << '\n';
+ continue;
+ }
+ }
+
TeXEnvironmentData const data =
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
//os << '\n';
}
- // It might be that we only have a title in this document
- if (was_title && !already_title) {
+ // It might be that we only have a title in this document.
+ // But if we're in an inset, this is not the end of
+ // the document. (There may be some other checks of this
+ // kind that are needed.)
+ if (runparams.need_maketitle && !runparams.have_maketitle && maintext) {
if (tclass.titletype() == TITLE_ENVIRONMENT) {
os << "\\end{" << from_ascii(tclass.titlename())
<< "}\n";
"$$lang",
mainlang))
<< '\n';
- if (using_begin_end)
+ // If we have language_auto_begin, the stack will
+ // already be empty, nothing to pop()
+ if (using_begin_end && !lyxrc.language_auto_begin)
popLanguageName();
}
|| oldEnc.package() == Encoding::japanese
|| oldEnc.package() == Encoding::none
|| newEnc.package() == Encoding::none
- || runparams.for_search)
+ || (runparams.for_searchAdv != OutputParams::NoSearch))
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.
// shouldn't ever reach here (see above) but avoids warning.
return make_pair(true, 0);
case Encoding::inputenc: {
- int count = inputenc_arg.length();
+ size_t count = inputenc_arg.length();
if (oldEnc.package() == Encoding::CJK &&
state->open_encoding_ == CJK) {
os << "\\end{CJK}";
return make_pair(true, count + 16);
}
case Encoding::CJK: {
- int count = inputenc_arg.length();
+ size_t count = inputenc_arg.length();
if (oldEnc.package() == Encoding::CJK &&
state->open_encoding_ == CJK) {
os << "\\end{CJK}";