diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index d17540d4ad..df8de4c39f 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -2311,6 +2311,10 @@ void Paragraph::latex(BufferParams const & bparams, if (body_pos > 0) { // the optional argument is kept in curly brackets in // case it contains a ']' + // This is not strictly needed, but if this is changed it + // would be a file format change, and tex2lyx would need + // to be adjusted, since it unconditionally removes the + // braces when it parses \item. os << "[{"; column += 2; basefont = getLabelFont(bparams, outerfont); diff --git a/src/tex2lyx/test/test-structure.tex b/src/tex2lyx/test/test-structure.tex index e19e002669..4182e37aaf 100644 --- a/src/tex2lyx/test/test-structure.tex +++ b/src/tex2lyx/test/test-structure.tex @@ -277,6 +277,10 @@ What else? Well, we have descriptions: \begin{description} \item[ABC] first item \item[BCD] second one +\item[{x y z}] with space +\item % hi there +[{x y % bla +z}] and with comments \end{description} labelings: \begin{lyxlist}{00.00.0000} diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index 7b3baf52ea..1886c08956 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -2179,16 +2179,15 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, } else if (t.cs() == "item") { - p.skip_spaces(); string s; - bool optarg = false; - if (p.next_token().cat() != catEscape && - p.next_token().character() == '[') { - p.get_token(); // eat '[' - s = parse_text_snippet(p, FLAG_BRACK_LAST, - outer, context); - optarg = true; - } + bool const optarg = p.hasOpt(); + if (optarg) { + // FIXME: This swallows comments, but we cannot use + // eat_whitespace() since we must not output + // anything before the item. + s = p.getArg('[', ']'); + } else + p.skip_spaces(false); context.set_item(); context.check_layout(os); if (context.has_item) { @@ -2204,13 +2203,30 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, if (context.layout->labeltype != LABEL_MANUAL) { // LyX does not support \item[\mybullet] // in itemize environments - handle_ert(os, "[", context); - os << s; - handle_ert(os, "]", context); + Parser p2(s + ']'); + os << parse_text_snippet(p2, + FLAG_BRACK_LAST, outer, context); } else if (!s.empty()) { + // LyX adds braces around the argument, + // so we need to remove them here. + if (s.size() > 2 && s[0] == '{' && + s[s.size()-1] == '}') + s = s.substr(1, s.size()-2); + // If the argument contains a space we + // must put it into ERT: Otherwise LyX + // would misinterpret the space as + // item delimiter (bug 7663) + if (contains(s, ' ')) { + handle_ert(os, s, context); + } else { + Parser p2(s + ']'); + os << parse_text_snippet(p2, + FLAG_BRACK_LAST, + outer, context); + } // The space is needed to separate the // item from the rest of the sentence. - os << s << ' '; + os << ' '; eat_whitespace(p, os, context, false); } }