#include "Buffer.h"
#include "BufferParams.h"
#include "Encoding.h"
+#include "Font.h"
#include "InsetList.h"
#include "Language.h"
#include "Layout.h"
#include "VSpace.h"
#include "insets/InsetBibitem.h"
-#include "insets/InsetOptArg.h"
+#include "insets/InsetArgument.h"
#include "support/lassert.h"
#include "support/debug.h"
#include "support/lstrings.h"
#include <boost/next_prior.hpp>
+#include <list>
using namespace std;
using namespace lyx::support;
if (style.isEnvironment()) {
os << "\\begin{" << from_ascii(style.latexname()) << '}';
- if (style.optionalargs > 0) {
- int ret = latexOptArgInsets(*pit, os, runparams,
- style.optionalargs);
+ if (style.optargs != 0 || style.reqargs != 0) {
+ int ret = latexArgInsets(*pit, os, runparams, style.reqargs, style.optargs);
while (ret > 0) {
texrow.newline();
--ret;
<< "}\n";
} else if (style.labeltype == LABEL_BIBLIO) {
if (pit->params().labelWidthString().empty())
- os << '{' << bibitemWidest(buf) << "}\n";
+ os << '{' << bibitemWidest(buf, runparams) << "}\n";
else
os << '{'
<< pit->params().labelWidthString()
} // namespace anon
-int latexOptArgInsets(Paragraph const & par, odocstream & os,
- OutputParams const & runparams, int number)
+int latexArgInsets(Paragraph const & par, odocstream & os,
+ OutputParams const & runparams, unsigned int reqargs,
+ unsigned int optargs)
{
- int lines = 0;
+ unsigned int totalargs = reqargs + optargs;
+ list<InsetArgument const *> ilist;
InsetList::const_iterator it = par.insetList().begin();
InsetList::const_iterator end = par.insetList().end();
- for (; it != end && number > 0 ; ++it) {
- if (it->inset->lyxCode() == OPTARG_CODE) {
- InsetOptArg * ins =
- static_cast<InsetOptArg *>(it->inset);
- lines += ins->latexOptional(os, runparams);
- --number;
+ for (; it != end; ++it) {
+ if (it->inset->lyxCode() == ARG_CODE) {
+ if (ilist.size() >= totalargs) {
+ LYXERR0("WARNING: Found extra argument inset.");
+ continue;
+ }
+ InsetArgument const * ins =
+ static_cast<InsetArgument const *>(it->inset);
+ ilist.push_back(ins);
+ }
+ }
+
+ if (!reqargs && ilist.size() == 0)
+ return 0;
+
+ int lines = 0;
+ bool const have_optional_args = ilist.size() > reqargs;
+ if (have_optional_args) {
+ unsigned int todo = ilist.size() - reqargs;
+ for (unsigned int i = 0; i < todo; ++i) {
+ InsetArgument const * ins = ilist.front();
+ ilist.pop_front();
+ lines += ins->latexArgument(os, runparams, true);
+ }
+ }
+
+ // we should now have no more insets than there are required
+ // arguments.
+ LASSERT(ilist.size() <= reqargs, /* */);
+ if (!reqargs)
+ return lines;
+
+ for (unsigned int i = 0; i < reqargs; ++i) {
+ if (ilist.empty())
+ // a required argument wasn't given, so we output {}
+ os << "{}";
+ else {
+ InsetArgument const * ins = ilist.front();
+ ilist.pop_front();
+ lines += ins->latexArgument(os, runparams, false);
}
}
return lines;
}
+
// FIXME: this should be anonymous
ParagraphList::const_iterator TeXOnePar(Buffer const & buf,
Text const & text,
{
LYXERR(Debug::LATEX, "TeXOnePar... " << &*pit << " '"
<< everypar << "'");
+
BufferParams const & bparams = buf.params();
- ParagraphList const & paragraphs = text.paragraphs();
+ // FIXME This check should not really be needed.
+ // Perhaps we should issue an error if it is.
+ Layout const style = text.inset().forcePlainLayout() ?
+ bparams.documentClass().plainLayout() : pit->layout();
+ ParagraphList const & paragraphs = text.paragraphs();
ParagraphList::const_iterator const priorpit =
pit == paragraphs.begin() ? pit : boost::prior(pit);
ParagraphList::const_iterator const nextpit =
pit == paragraphs.end() ? pit : boost::next(pit);
+ if (style.inpreamble)
+ return nextpit;
+
OutputParams runparams = runparams_in;
runparams.isLastPar = nextpit == paragraphs.end();
- if (runparams.verbatim) {
+ bool const maintext = text.isMainText();
+ // we are at the beginning of an inset and CJK is already open;
+ // we count inheritation levels to get the inset nesting right.
+ if (pit == paragraphs.begin() && !maintext
+ && (cjk_inherited_ > 0 || open_encoding_ == CJK)) {
+ cjk_inherited_ += 1;
+ open_encoding_ = none;
+ }
+
+ if (runparams.pass_thru) {
int const dist = distance(paragraphs.begin(), pit);
Font const outerfont = text.outerFont(dist);
texrow.newline();
}
- /*bool need_par = */ pit->latex(bparams, outerfont,
- os, texrow, runparams, start_pos, end_pos);
+ pit->latex(bparams, outerfont, os, texrow,
+ runparams, start_pos, end_pos);
return nextpit;
}
- // FIXME This check should not really be needed.
- // Perhaps we should issue an error if it is.
- Layout const style = text.inset().forcePlainLayout() ?
- bparams.documentClass().plainLayout() : pit->layout();
-
- runparams.moving_arg |= style.needprotect;
-
- bool const maintext = text.isMainText();
- // we are at the beginning of an inset and CJK is already open;
- // we count inheritation levels to get the inset nesting right.
- if (pit == paragraphs.begin() && !maintext
- && (cjk_inherited_ > 0 || open_encoding_ == CJK)) {
- cjk_inherited_ += 1;
- open_encoding_ = none;
- }
-
// This paragraph's language
Language const * const par_language = pit->getParLanguage(bparams);
// The document's language
// Look ahead for future encoding changes.
// We try to output them at the beginning of the paragraph,
// since the \inputencoding command is not allowed e.g. in
- // sections.
+ // sections. For this reason we only set runparams.moving_arg
+ // after checking for the encoding change, otherwise the
+ // change would be always avoided by switchEncoding().
for (pos_type i = 0; i < pit->size(); ++i) {
char_type const c = pit->getChar(i);
Encoding const * const encoding =
}
}
+ runparams.moving_arg |= style.needprotect;
Encoding const * const prev_encoding = runparams.encoding;
bool const useSetSpace = bparams.documentClass().provides("SetSpace");
os << '\\' << from_ascii(style.latexname());
// Separate handling of optional argument inset.
- if (style.optionalargs > 0) {
- int ret = latexOptArgInsets(*pit, os, runparams,
- style.optionalargs);
+ if (style.optargs != 0 || style.reqargs != 0) {
+ int ret = latexArgInsets(*pit, os, runparams, style.reqargs, style.optargs);
while (ret > 0) {
texrow.newline();
--ret;
// FIXME UNICODE
os << from_utf8(everypar);
- bool need_par = pit->latex(bparams, outerfont,
- os, texrow, runparams, start_pos, end_pos);
+ pit->latex(bparams, outerfont, os, texrow,
+ runparams, start_pos, end_pos);
// Make sure that \\par is done with the font of the last
// character if this has another size as the default.
if (style.resfont.size() != font.fontInfo().size()
&& nextpit != paragraphs.end()
&& !is_command) {
- if (!need_par)
- os << '{';
+ os << '{';
os << "\\" << from_ascii(font.latexSize()) << " \\par}";
- } else if (need_par) {
- os << "\\par}";
} else if (is_command) {
os << '}';
if (runparams.encoding != prev_encoding) {
texrow.newline();
open_encoding_ = CJK;
}
- // if "auto begin" is switched off, explicitely switch the
+ // if "auto begin" is switched off, explicitly switch the
// language on at start
if (maintext && !lyxrc.language_auto_begin &&
!bparams.language->babel().empty()) {
texrow.newline();
}
- // if "auto end" is switched off, explicitely close the language at the end
+ // if "auto end" is switched off, explicitly close the language at the end
// but only if the last par is in a babel language
if (maintext && !lyxrc.language_auto_end && !bparams.language->babel().empty() &&
lastpar->getParLanguage(bparams)->encoding()->package() != Encoding::CJK) {