Implemented: Overlay and standard overlay arguments for commands
and environments.
Still missing:
* List item overlay
* itemcommand overlay (\overprint)
* overlay via LatexParam (e.g., Flex:ArticleMode)
Needs fixing:
* General list argument (\begin{itemize}[arg])
* nested content in a frame with no title (empty par)
FLAG_OPTION = 1 << 11, // read [...] style option
FLAG_BRACED = 1 << 12, // read {...} style argument
FLAG_CELL = 1 << 13, // read table cell
FLAG_OPTION = 1 << 11, // read [...] style option
FLAG_BRACED = 1 << 12, // read {...} style argument
FLAG_CELL = 1 << 13, // read table cell
- FLAG_TABBING = 1 << 14 // We are inside a tabbing environment
+ FLAG_TABBING = 1 << 14, // We are inside a tabbing environment
+ FLAG_RDELIM = 1 << 15, // next right delimiter ends the parsing
415 automatic undertilde loading \use_package undertilde
443 unicode-math.sty InsetMath*
448
415 automatic undertilde loading \use_package undertilde
443 unicode-math.sty InsetMath*
448
-451 beamer overlay arguments InsetArgument
- \command<arg>, \begin{env}<arg>
-452 beamer block arguments InsetArgument
- \begin{block}<overlay>{title}
453 automatic stmaryrd loading \use_package stmaryrd
454 beamer overprint environment InsetArgument, layout Overprint
\begin{overprint}[maxlength]
453 automatic stmaryrd loading \use_package stmaryrd
454 beamer overprint environment InsetArgument, layout Overprint
\begin{overprint}[maxlength]
455 beamer frametitle command \begin_layout FrameTitle
\frametitle<overlay>[short]{long}
457 automatic stackrel loading \use_package stackrel
455 beamer frametitle command \begin_layout FrameTitle
\frametitle<overlay>[short]{long}
457 automatic stackrel loading \use_package stackrel
-459 beamer: \begin{frame}, \begin_layout Frame
- \begin{frame}[plain], \begin_layout PlainFrame
- \begin{frame}[fragile] \begin_layout FragileFrame
466 Powerdot updates:
\pause[] layout Pause
\onslide{}{} InsetFlex, InsetArgument
466 Powerdot updates:
\pause[] layout Pause
\onslide{}{} InsetFlex, InsetArgument
std::string translate_len(std::string const &);
void parse_text(Parser & p, std::ostream & os, unsigned flags, bool outer,
std::string translate_len(std::string const &);
void parse_text(Parser & p, std::ostream & os, unsigned flags, bool outer,
+ Context & context, std::string const rdelim = std::string());
void check_comment_bib(std::ostream & os, Context & context);
void fix_child_filename(std::string & name);
void check_comment_bib(std::ostream & os, Context & context);
void fix_child_filename(std::string & name);
*/
void parse_text_in_inset(Parser & p, std::ostream & os, unsigned flags,
bool outer, Context const & context,
*/
void parse_text_in_inset(Parser & p, std::ostream & os, unsigned flags,
bool outer, Context const & context,
- InsetLayout const * layout = 0);
+ InsetLayout const * layout = 0,
+ std::string const rdelim = std::string());
/// Guess document language from \p p if CJK is used.
/// \p lang is used for all non-CJK contents.
/// Guess document language from \p p if CJK is used.
/// \p lang is used for all non-CJK contents.
void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer,
void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer,
- Context const & context, InsetLayout const * layout)
+ Context const & context, InsetLayout const * layout,
+ string const rdelim)
{
bool const forcePlainLayout =
layout ? layout->forcePlainLayout() : false;
{
bool const forcePlainLayout =
layout ? layout->forcePlainLayout() : false;
if (layout)
output_arguments(os, p, outer, false, false, newcontext,
layout->latexargs());
if (layout)
output_arguments(os, p, outer, false, false, newcontext,
layout->latexargs());
- parse_text(p, os, flags, outer, newcontext);
+ parse_text(p, os, flags, outer, newcontext, rdelim);
if (layout)
output_arguments(os, p, outer, false, true, newcontext,
layout->postcommandargs());
if (layout)
output_arguments(os, p, outer, false, true, newcontext,
layout->postcommandargs());
namespace {
void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer,
namespace {
void parse_text_in_inset(Parser & p, ostream & os, unsigned flags, bool outer,
- Context const & context, string const & name)
+ Context const & context, string const & name,
+ string const rdelim = string())
{
InsetLayout const * layout = 0;
DocumentClass::InsetLayouts::const_iterator it =
context.textclass.insetLayouts().find(from_ascii(name));
if (it != context.textclass.insetLayouts().end())
layout = &(it->second);
{
InsetLayout const * layout = 0;
DocumentClass::InsetLayouts::const_iterator it =
context.textclass.insetLayouts().find(from_ascii(name));
if (it != context.textclass.insetLayouts().end())
layout = &(it->second);
- parse_text_in_inset(p, os, flags, outer, context, layout);
+ parse_text_in_inset(p, os, flags, outer, context, layout, rdelim);
}
/// parses a paragraph snippet, useful for example for \\emph{...}
}
/// parses a paragraph snippet, useful for example for \\emph{...}
if (lait->second.mandatory) {
if (p.next_token().cat() != catBegin)
break;
if (lait->second.mandatory) {
if (p.next_token().cat() != catBegin)
break;
- p.get_token(); // eat '{'
+ string ldelim = to_utf8(lait->second.ldelim);
+ string rdelim = to_utf8(lait->second.rdelim);
+ if (ldelim.empty())
+ ldelim = "{";
+ if (rdelim.empty())
+ rdelim = "}";
+ p.get_token(); // eat ldelim
+ if (ldelim.size() > 1)
+ p.get_token(); // eat ldelim
if (need_layout) {
context.check_layout(os);
need_layout = false;
if (need_layout) {
context.check_layout(os);
need_layout = false;
if (post)
os << "post:";
os << i << "\nstatus collapsed\n\n";
if (post)
os << "post:";
os << i << "\nstatus collapsed\n\n";
- parse_text_in_inset(p, os, FLAG_BRACE_LAST, outer, context);
+ parse_text_in_inset(p, os, FLAG_RDELIM, outer, context, 0, rdelim);
- if (p.next_token().cat() == catEscape ||
- p.next_token().character() != '[')
+ string ldelim = to_utf8(lait->second.ldelim);
+ string rdelim = to_utf8(lait->second.rdelim);
+ if (ldelim.empty())
+ ldelim = "[";
+ if (rdelim.empty())
+ rdelim = "]";
+ string tok = p.next_token().asInput();
+ // we only support delimiters with max 2 chars for now.
+ if (ldelim.size() > 1)
+ tok += p.next_next_token().asInput();
+ if (p.next_token().cat() == catEscape || tok != ldelim)
- p.get_token(); // eat '['
+ p.get_token(); // eat ldelim
+ if (ldelim.size() > 1)
+ p.get_token(); // eat ldelim
if (need_layout) {
context.check_layout(os);
need_layout = false;
if (need_layout) {
context.check_layout(os);
need_layout = false;
if (post)
os << "post:";
os << i << "\nstatus collapsed\n\n";
if (post)
os << "post:";
os << i << "\nstatus collapsed\n\n";
- parse_text_in_inset(p, os, FLAG_BRACK_LAST, outer, context);
+ parse_text_in_inset(p, os, FLAG_RDELIM, outer, context, 0, rdelim);
end_inset(os);
}
eat_whitespace(p, os, context, false);
end_inset(os);
}
eat_whitespace(p, os, context, false);
}
context.check_deeper(os);
// handle known optional and required arguments
}
context.check_deeper(os);
// handle known optional and required arguments
- // Unfortunately LyX can't handle arguments of list arguments (bug 7468):
- // It is impossible to place anything after the environment name,
- // but before the first \\item.
- if (context.layout->latextype == LATEX_ENVIRONMENT)
+ // FIXME: for item environments, this is currently
+ // placed wrongly (in an empty paragraph). It has to go to
+ // the first \item par instead.
+ if (context.layout->latextype == LATEX_ENVIRONMENT
+ || context.layout->latextype == LATEX_ITEM_ENVIRONMENT)
output_arguments(os, p, outer, false, false, context,
context.layout->latexargs());
parse_text(p, os, FLAG_END, outer, context);
output_arguments(os, p, outer, false, false, context,
context.layout->latexargs());
parse_text(p, os, FLAG_END, outer, context);
void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
+ Context & context, string const rdelim)
{
Layout const * newlayout = 0;
InsetLayout const * newinsetlayout = 0;
{
Layout const * newlayout = 0;
InsetLayout const * newinsetlayout = 0;
return;
if (t.cat() == catEnd && (flags & FLAG_BRACE_LAST))
return;
return;
if (t.cat() == catEnd && (flags & FLAG_BRACE_LAST))
return;
+ string tok = t.asInput();
+ // we only support delimiters with max 2 chars for now.
+ if (rdelim.size() > 1)
+ tok += p.next_token().asInput();
+ if (t.cat() != catEscape && !rdelim.empty()
+ && tok == rdelim && (flags & FLAG_RDELIM)) {
+ if (rdelim.size() > 1)
+ p.get_token(); // eat rdelim
+ return;
+ }
// If there is anything between \end{env} and \begin{env} we
// don't need to output a separator.
// If there is anything between \end{env} and \begin{env} we
// don't need to output a separator.