[LyX/master] DocBook: implement REVTeX.

Thibaut Cuvelier tcuvelier at lyx.org
Thu Nov 26 05:26:08 UTC 2020


commit dae064043682ea7dcf03899abaca067ee2245655
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Thu Nov 26 06:22:27 2020 +0100

    DocBook: implement REVTeX.
    
    Improvements to abstract detection: it can now contain lists or anything with a higher depth.
    
    Implement video floats.
---
 development/autotests/invertedTests  |    8 +++-
 development/autotests/suspendedTests |    1 +
 lib/layouts/acm-sigs.inc             |   10 +++-
 lib/layouts/amsdefs.inc              |    7 ++-
 lib/layouts/iopart.layout            |   20 ++++++++++
 lib/layouts/revtex4-x.inc            |   48 ++++++++++++++++++++++++
 lib/layouts/revtex4.layout           |   47 +++++++++++++++++++++++
 src/Floating.cpp                     |    4 +-
 src/OutputParams.h                   |    3 +
 src/insets/InsetFloat.cpp            |   10 +++++
 src/output_docbook.cpp               |   68 +++++++++++++++++++++-------------
 11 files changed, 192 insertions(+), 34 deletions(-)

diff --git a/development/autotests/invertedTests b/development/autotests/invertedTests
index fb28692..b66a21f 100644
--- a/development/autotests/invertedTests
+++ b/development/autotests/invertedTests
@@ -453,7 +453,7 @@ export/examples/.*/American_Mathematical_Society_%28AMS%29_docbook5
 export/examples/Articles/American_Chemical_Society_%28ACS%29_docbook5
 #   - A&A: formula with two references (only one xml:id allowed per <equation> tag).
 export/examples/Articles/Astronomy_%26_Astrophysics_docbook5
-#   - Elsevier: footnotes in the metadata (author footnotes are definitely not supported, though).
+#   - Elsevier: footnotes in the metadata (author footnotes are not supported, except maybe through annotations).
 export/templates/Articles/Elsevier_docbook5
 # - Branches may cause problems (especially when mixing with parts that must go in <info>).
 export/export/latex/languages/supported-languages_(|babel|babel_auto-legacy)_?docbook5
@@ -493,6 +493,12 @@ export/examples/(es|fr)/Modules/Linguistics_docbook5
 export/examples/ko/cjk-ko-doc_docbook5
 # - Metadata in abstract paragraph.
 export/templates/Articles/Springers_Global_Journal_Template_%28V._3%29_docbook5
+# - Sweave impossible to implement. Document irremediably wrong (no .bib file, still referenced in the text).
+export/templates/Articles/R_Journal_docbook5
+# - Misplaced acknowledgements (fixable).
+export/templates/Articles/REVTeX_%28V._4%29_docbook5
+# - Forbidden inlines, equation in formatting, broken references, float in paragraphs, videos.
+export/templates/Articles/REVTeX_%28V._4.1%29_docbook5
 
 Sublabel: docbook poster
 # Posters cannot be properly exported, the LyX documents are too far from
diff --git a/development/autotests/suspendedTests b/development/autotests/suspendedTests
index 6d6e619..5fa5d0b 100644
--- a/development/autotests/suspendedTests
+++ b/development/autotests/suspendedTests
@@ -31,3 +31,4 @@ export/export/docbook/Hollywood_docbook5
 export/templates/Letters/French_Letter_%28lettre%29_docbook5
 export/templates/Letters/Letter_%28Standard_Class%29_docbook5
 export/templates/Articles/Springers_Global_Journal_Template_%28V._3%29_docbook5
+export/templates/Articles/REVTeX_%28V._4%29_docbook5
diff --git a/lib/layouts/acm-sigs.inc b/lib/layouts/acm-sigs.inc
index b836aa9..70a357d 100644
--- a/lib/layouts/acm-sigs.inc
+++ b/lib/layouts/acm-sigs.inc
@@ -49,7 +49,11 @@ Style Terms
 End
 
 Style Keywords
-        CopyStyle             Terms
-        LatexName             keywords
-        LabelString           "Keywords:"
+	CopyStyle             Terms
+	LatexName             keywords
+	LabelString           "Keywords:"
+	DocBookTag          keyword
+	DocBookTagType      paragraph
+	DocBookWrapperTag   keywordset
+	DocBookInInfo       always
 End
diff --git a/lib/layouts/amsdefs.inc b/lib/layouts/amsdefs.inc
index a0a9948..7b0298a 100644
--- a/lib/layouts/amsdefs.inc
+++ b/lib/layouts/amsdefs.inc
@@ -215,10 +215,11 @@ Style Thanks
 	CopyStyle             Address
 	LatexName             thanks
 	LabelString           "Thanks:"
-	DocBookTag            para
-	DocBookWrapperTag     acknowledgements
+	DocBookTag            personname
+	DocBookTagType        paragraph
+	DocBookWrapperTag     othercredit
 	DocBookWrapperMergeWithPrevious true
-	DocBookInInfo         never
+	DocBookInInfo         always
 End
 
 
diff --git a/lib/layouts/iopart.layout b/lib/layouts/iopart.layout
index 5e2f2f2..981a2d1 100644
--- a/lib/layouts/iopart.layout
+++ b/lib/layouts/iopart.layout
@@ -226,6 +226,16 @@ Style PACS
 	CopyStyle	Keywords
 	LatexName	pacs
 	LabelString	"Physics and Astronomy Classification System number:"
+	DocBookTag          subjectset
+	DocBookAttr         role='pacs'
+	DocBookTagType      block
+	DocBookItemWrapperTag      subject
+	DocBookItemWrapperTagType  paragraph
+	DocBookItemTag      subjectterm
+	DocBookItemTagType  inline
+	DocBookWrapperTag   NONE
+	DocBookWrapperAttr  ""
+	DocBookInInfo       always
 End
 
 
@@ -233,6 +243,16 @@ Style MSC
 	CopyStyle	Keywords
 	LatexName	ams
 	LabelString	"Mathematics Subject Classification number:"
+	DocBookTag          subjectset
+	DocBookAttr         role='msc'
+	DocBookTagType      block
+	DocBookItemWrapperTag      subject
+	DocBookItemWrapperTagType  paragraph
+	DocBookItemTag      subjectterm
+	DocBookItemTagType  inline
+	DocBookWrapperTag   NONE
+	DocBookWrapperAttr  ""
+	DocBookInInfo       always
 End
 
 
diff --git a/lib/layouts/revtex4-x.inc b/lib/layouts/revtex4-x.inc
index 60fea7e..7449e5f 100644
--- a/lib/layouts/revtex4-x.inc
+++ b/lib/layouts/revtex4-x.inc
@@ -79,6 +79,11 @@ Style Affiliation
 	  Color			Green
 	  Series		Bold	
 	EndFont
+	DocBookTag                        address
+	DocBookTagType                    paragraph
+	DocBookWrapperTag                 author
+	DocBookWrapperMergeWithPrevious   true
+	DocBookInInfo                     always
 End
 
 
@@ -91,6 +96,12 @@ Style Affiliation_(alternate)
 	  Tooltip		"Optional argument to the altaffiliation command"
 	EndArgument
 	PassThru		1
+	DocBookTag                        address
+	DocBookAttr                       role='alternate'
+	DocBookTagType                    paragraph
+	DocBookWrapperTag                 author
+	DocBookWrapperMergeWithPrevious   true
+	DocBookInInfo                     always
 End
 
 
@@ -123,6 +134,12 @@ Style Author_Email
 	TextFont
 	  Family		Roman
 	EndFont
+	DocBookTag            email
+	DocBookTagType        paragraph
+	DocBookWrapperTag     author
+	DocBookWrapperTagType block
+	DocBookWrapperMergeWithPrevious  true
+	DocBookInInfo         always
 End
 
 
@@ -135,6 +152,12 @@ Style Author_URL
 	  Tooltip		"Optional argument to the homepage command"
 	EndArgument
 	PassThru		1
+	DocBookTag            uri
+	DocBookTagType        paragraph
+	DocBookWrapperTag     author
+	DocBookWrapperTagType block
+	DocBookWrapperMergeWithPrevious  true
+	DocBookInInfo         always
 End
 
 
@@ -164,6 +187,10 @@ Style Keywords
 	  Color			Green
 	  Series		Bold
 	EndFont
+	DocBookTag          keyword
+	DocBookTagType      paragraph
+	DocBookWrapperTag   keywordset
+	DocBookInInfo       always
 End
 
 
@@ -171,6 +198,16 @@ Style PACS
 	CopyStyle		Keywords
 	LatexName		pacs
 	LabelString		"PACS numbers:"
+	DocBookTag            subjectset
+	DocBookAttr           role='pacs'
+	DocBookTagType        block
+	DocBookItemWrapperTag      subject
+	DocBookItemWrapperTagType  paragraph
+	DocBookItemTag        subjectterm
+	DocBookItemTagType    inline
+	DocBookWrapperTag     NONE
+	DocBookWrapperAttr    ""
+	DocBookInInfo         always
 End
 
 
@@ -184,13 +221,22 @@ Style Preprint
 	BottomSep		1.5
 	ParSep			1.5
 	Align			Left
+	DocBookWrapperTag   cover
+	DocBookWrapperAttr  role='preprint'
+	DocBookTag          para
+	DocBookInInfo       always
 End
 
 
 Style Thanks
+	# TODO: This style has a misleading name, innit?
 	CopyStyle		Affiliation
 	LatexName		thanks
 	LabelString		"Title footnote:"
+	DocBookTag            subtitle
+	DocBookAttr           role='footnote'
+	DocBookWrapperTag     NONE
+	DocBookInInfo         maybe
 End
 
 
@@ -223,6 +269,8 @@ Style Acknowledgments
 	  Size			Larger
 	EndFont
 	TopSep			0.7
+	DocBookTag            para
+	DocBookWrapperTag     acknowledgements
 End
 
 
diff --git a/lib/layouts/revtex4.layout b/lib/layouts/revtex4.layout
index 6597d55..1c557ae 100644
--- a/lib/layouts/revtex4.layout
+++ b/lib/layouts/revtex4.layout
@@ -55,6 +55,7 @@ Style Standard
 	Align                 Block
 	AlignPossible         Block, Left, Right, Center
 	LabelType             No_Label
+	DocBookTag            para
 End
 
 
@@ -113,6 +114,10 @@ Style Preprint
 	BottomSep             1.5
 	ParSep                1.5
 	Align                 Left
+	DocBookWrapperTag   cover
+	DocBookWrapperAttr  role='preprint'
+	DocBookTag          para
+	DocBookInInfo       always
 End
 
 
@@ -149,6 +154,11 @@ Style Affiliation
 	LabelFont
 	  Shape               Italic
 	EndFont
+	DocBookTag                        address
+	DocBookTagType                    paragraph
+	DocBookWrapperTag                 author
+	DocBookWrapperMergeWithPrevious   true
+	DocBookInInfo                     always
 End
 
 
@@ -162,6 +172,12 @@ Style Affiliation_(alternate)
 		Tooltip       "Optional argument to the altaffiliation command"
 	EndArgument
 	LabelString           "Affiliation (alternate):"
+	DocBookTag                        address
+	DocBookAttr                       role='alternate'
+	DocBookTagType                    paragraph
+	DocBookWrapperTag                 author
+	DocBookWrapperMergeWithPrevious   true
+	DocBookInInfo                     always
 End
 
 
@@ -198,6 +214,13 @@ Style Thanks
 	CopyStyle             Affiliation
 	LatexName             thanks
 	LabelString           "Thanks:"
+	DocBookTag            personblurb
+	DocBookAttr           role='thanks'
+	DocBookTagType        paragraph
+	DocBookItemTag        para
+	DocBookWrapperTag     author
+	DocBookWrapperMergeWithPrevious true
+	DocBookInInfo         always
 End
 
 
@@ -217,6 +240,12 @@ Style Author_Email
 	LabelFont
 	  Family              Roman
 	EndFont
+	DocBookTag            email
+	DocBookTagType        paragraph
+	DocBookWrapperTag     author
+	DocBookWrapperTagType block
+	DocBookWrapperMergeWithPrevious  true
+	DocBookInInfo         always
 End
 
 
@@ -230,6 +259,12 @@ Style Author_URL
 		Tooltip       "Optional argument to the homepage command"
 	EndArgument
 	LabelString           "URL:"
+	DocBookTag            uri
+	DocBookTagType        paragraph
+	DocBookWrapperTag     author
+	DocBookWrapperTagType block
+	DocBookWrapperMergeWithPrevious  true
+	DocBookInInfo         always
 End
 
 
@@ -256,6 +291,8 @@ Style Acknowledgments
 	  Series              Bold
 	  Size                Large
 	EndFont
+	DocBookTag            para
+	DocBookWrapperTag     acknowledgements
 End
 
 
@@ -268,6 +305,16 @@ Style PACS
 	LabelType             Static
 	LabelSep              M
 	LabelString           "PACS number:"
+	DocBookTag            subjectset
+	DocBookAttr           role='pacs'
+	DocBookTagType        block
+	DocBookItemWrapperTag      subject
+	DocBookItemWrapperTagType  paragraph
+	DocBookItemTag        subjectterm
+	DocBookItemTagType    inline
+	DocBookWrapperTag     NONE
+	DocBookWrapperAttr    ""
+	DocBookInInfo         always
 End
 
 
diff --git a/src/Floating.cpp b/src/Floating.cpp
index a226d51..fa93b97 100644
--- a/src/Floating.cpp
+++ b/src/Floating.cpp
@@ -55,6 +55,8 @@ std::string Floating::docbookFloatType() const
 		return "table";
 	} else if (floattype_ == "algorithm") {
 		return "algorithm";
+	} else if (floattype_ == "video") {
+		return "video";
 	} else {
 		// If nothing matches, return something that will not be valid.
 		LYXERR0("Unrecognised float type: " + floattype_);
@@ -118,7 +120,7 @@ string Floating::docbookAttr() const
 string Floating::docbookTag(bool hasTitle) const
 {
 	// TODO: configure this in the layouts?
-	if (docbookFloatType() == "figure" || docbookFloatType() == "algorithm") {
+	if (docbookFloatType() == "figure" || docbookFloatType() == "algorithm" || docbookFloatType() == "video") {
 		return hasTitle ? "figure" : "informalfigure";
 	} else if (docbookFloatType() == "table") {
 		return hasTitle ? "table" : "informaltable";
diff --git a/src/OutputParams.h b/src/OutputParams.h
index ec94613..7e0a4b2 100644
--- a/src/OutputParams.h
+++ b/src/OutputParams.h
@@ -379,6 +379,9 @@ public:
 	/// Should the layouts that should/must go into <info> be generated?
 	bool docbook_generate_info = true;
 
+	/// Should wrappers be ignored? Mostly useful to avoid generation of <abstract>.
+	bool docbook_ignore_wrapper = false;
+
 	/// Are we generating this material for inclusion in a TOC-like entity?
 	bool for_toc = false;
 
diff --git a/src/insets/InsetFloat.cpp b/src/insets/InsetFloat.cpp
index f486fc7..2dfd53c 100644
--- a/src/insets/InsetFloat.cpp
+++ b/src/insets/InsetFloat.cpp
@@ -757,6 +757,11 @@ void docbookNoSubfigures(XMLStream & xs, OutputParams const & runparams, const I
 
 void InsetFloat::docbook(XMLStream & xs, OutputParams const & runparams) const
 {
+//	if (runparams.docbook_in_par) {
+//		xs << xml::EndTag("para");
+//		xs << xml::CR();
+//	}
+
 	const InsetCaption* caption = getCaptionInset();
 	const InsetLabel* label = getLabelInset();
 
@@ -780,6 +785,11 @@ void InsetFloat::docbook(XMLStream & xs, OutputParams const & runparams) const
 		docbookSubfigures(xs, runparams, caption, label, subfigures);
 	else
 		docbookNoSubfigures(xs, runparams, caption, label, ftype, this);
+
+//	if (runparams.docbook_in_par) {
+//		xs << xml::CR();
+//		xs << xml::StartTag("para");
+//	}
 }
 
 
diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp
index 63b4ff9..73e5a46 100644
--- a/src/output_docbook.cpp
+++ b/src/output_docbook.cpp
@@ -170,7 +170,7 @@ string fontToAttribute(xml::FontTypes type) {
 
 // Higher-level convenience functions.
 
-void openParTag(XMLStream & xs, const Paragraph * par, const Paragraph * prevpar)
+void openParTag(XMLStream & xs, const Paragraph * par, const Paragraph * prevpar, const OutputParams & runparams)
 {
 	if (par == prevpar)
 		prevpar = nullptr;
@@ -182,7 +182,7 @@ void openParTag(XMLStream & xs, const Paragraph * par, const Paragraph * prevpar
 	// next paragraph is the affiliation, then it should be output in the same <author> tag (different
 	// layout, same wrapper tag).
 	Layout const & lay = par->layout();
-	bool openWrapper = lay.docbookwrappertag() != "NONE";
+	bool openWrapper = lay.docbookwrappertag() != "NONE" && !runparams.docbook_ignore_wrapper;
 	if (prevpar != nullptr) {
 		Layout const & prevlay = prevpar->layout();
 		if (prevlay.docbookwrappertag() != "NONE") {
@@ -209,19 +209,20 @@ void openParTag(XMLStream & xs, const Paragraph * par, const Paragraph * prevpar
 		}
 	}
 
+	xml::openTag(xs, lay.docbookitemwrappertag(), lay.docbookitemwrapperattr(), lay.docbookitemwrappertagtype());
 	xml::openTag(xs, lay.docbookitemtag(), lay.docbookitemattr(), lay.docbookitemtagtype());
 	xml::openTag(xs, lay.docbookiteminnertag(), lay.docbookiteminnerattr(), lay.docbookiteminnertagtype());
 }
 
 
-void closeParTag(XMLStream & xs, Paragraph const * par, Paragraph const * nextpar)
+void closeParTag(XMLStream & xs, Paragraph const * par, Paragraph const * nextpar, const OutputParams & runparams)
 {
 	if (par == nextpar)
 		nextpar = nullptr;
 
 	// See comment in openParTag.
 	Layout const & lay = par->layout();
-	bool closeWrapper = lay.docbookwrappertag() != "NONE";
+	bool closeWrapper = lay.docbookwrappertag() != "NONE" && !runparams.docbook_ignore_wrapper;
 	if (nextpar != nullptr) {
 		Layout const & nextlay = nextpar->layout();
 		if (nextlay.docbookwrappertag() != "NONE") {
@@ -236,6 +237,7 @@ void closeParTag(XMLStream & xs, Paragraph const * par, Paragraph const * nextpa
 	// Main logic.
 	xml::closeTag(xs, lay.docbookiteminnertag(), lay.docbookiteminnertagtype());
 	xml::closeTag(xs, lay.docbookitemtag(), lay.docbookitemtagtype());
+	xml::closeTag(xs, lay.docbookitemwrappertag(), lay.docbookitemwrappertagtype());
 	xml::closeTag(xs, lay.docbookinnertag(), lay.docbookinnertagtype());
 	xml::closeTag(xs, lay.docbooktag(), lay.docbooktagtype());
 	if (closeWrapper)
@@ -412,12 +414,12 @@ void makeParagraph(
 			continue;
 
 		if (open_par)
-			openParTag(xs, &*par, prevpar);
+			openParTag(xs, &*par, prevpar, runparams);
 
 		xs << XMLStream::ESCAPE_NONE << parXML;
 
 		if (close_par)
-			closeParTag(xs, &*par, (nextpar != end) ? &*nextpar : nullptr);
+			closeParTag(xs, &*par, (nextpar != end) ? &*nextpar : nullptr, runparams);
 	}
 }
 
@@ -446,7 +448,7 @@ void makeEnvironment(Text const &text,
 	// Output the opening tag for this environment, but only if it has not been previously opened (condition
 	// implemented in openParTag).
 	auto prevpar = text.paragraphs().getParagraphBefore(par);
-	openParTag(xs, &*par, prevpar); // TODO: switch in layout for par/block?
+	openParTag(xs, &*par, prevpar, runparams);
 
 	// Generate the contents of this environment. There is a special case if this is like some environment.
 	Layout const & style = par->layout();
@@ -483,7 +485,7 @@ void makeEnvironment(Text const &text,
 	}
 
 	// Close the environment.
-	closeParTag(xs, &*par, (nextpar != end) ? &*nextpar : nullptr); // TODO: switch in layout for par/block?
+	closeParTag(xs, &*par, (nextpar != end) ? &*nextpar : nullptr, runparams);
 }
 
 
@@ -630,14 +632,14 @@ void makeCommand(
 
 	// Generate this command.
 	auto prevpar = text.paragraphs().getParagraphBefore(par);
-	openParTag(xs, &*par, prevpar);
+	openParTag(xs, &*par, prevpar, runparams);
 
 	auto pars = par->simpleDocBookOnePar(buf, runparams,text.outerFont(distance(begin, par)));
 	for (auto & parXML : pars)
 		// TODO: decide what to do with openParTag/closeParTag in new lines.
 		xs << XMLStream::ESCAPE_NONE << parXML;
 
-	closeParTag(xs, &*par, (nextpar != end) ? &*nextpar : nullptr);
+	closeParTag(xs, &*par, (nextpar != end) ? &*nextpar : nullptr, runparams);
 }
 
 
@@ -737,6 +739,7 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs,
 
 	// Traverse everything that might belong to <info>.
 	bool hasAbstractLayout = false;
+	depth_type abstractDepth = -1;
 	pit_type cpit = bpit;
 	for (; cpit < epit; ++cpit) {
 		// Skip paragraphs that don't generate anything in DocBook.
@@ -755,10 +758,26 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs,
 		// If this is marked as an abstract by the layout, put it in the right set.
 		if (style.docbookabstract()) {
 			hasAbstractLayout = true;
+			abstractDepth = par.getDepth();
 			abstractWithLayout.emplace(cpit);
 			continue;
 		}
 
+		// Deeper paragraphs following the abstract must still be considered as part of the abstract.
+		// For instance, this includes lists. There should not be any other kind of paragraph in between.
+		if (abstractDepth != -1 && style.docbookininfo() == "never") {
+			if (par.getDepth() > abstractDepth) {
+				abstractWithLayout.emplace(cpit);
+				continue;
+			}
+			if (par.getDepth() == abstractDepth) {
+				// This is not an abstract paragraph and it should not either be considered as part
+				// of it. It breaks the rule that abstract paragraphs must follow each other.
+				abstractDepth = -1;
+				break;
+			}
+		}
+
 		// Based on layout information, store this paragraph in one set: should be in <info>, must be,
 		// or abstract (either because of layout or of position).
 		if (style.docbookininfo() == "always")
@@ -769,7 +788,7 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs,
 				(style.docbooktag() == "NONE" || style.docbooktag() == "para") &&
 				style.docbookwrappertag() == "NONE")
 			// In this case, it is very likely that style.docbookininfo() == "never"! Be extra careful
-			// about anything that gets caught here.
+			// about anything that gets caught here. For instance, don't ake into account
 			abstractNoLayout.emplace(cpit);
 		else // This should definitely not be in <info>.
 			break;
@@ -901,6 +920,7 @@ void outputDocBookInfo(
 
 		auto rp = runparams;
 		rp.docbook_generate_info = false;
+		rp.docbook_ignore_wrapper = true;
 
 		set<pit_type> doneParas; // Paragraphs that have already been converted (mostly to deal with lists).
 		for (auto const & p : info.abstract) {
@@ -908,6 +928,7 @@ void outputDocBookInfo(
 				auto oldPar = paragraphs.iterator_at(p);
 				auto newPar = makeAny(text, buf, xs2, rp, oldPar);
 
+				// Find insets that should go outside the abstract.
 				auto subinfos = gatherInfo(oldPar);
 				for (auto & subinfo: subinfos)
 					infoInsets.insert(subinfo);
@@ -968,23 +989,18 @@ void outputDocBookInfo(
 	// - Finally, always output the abstract as the last item of the <info>, as it requires special treatment
 	// (especially if it contains several paragraphs that are empty).
 	if (hasAbstract) {
-		if (info.abstractLayout) {
-			xs << XMLStream::ESCAPE_NONE << abstract;
-			xs << xml::CR();
-		} else {
-			string tag = paragraphs[*info.abstract.begin()].layout().docbookforceabstracttag();
-			if (tag == "NONE")
-				tag = "abstract";
-
-			if (!xs.isLastTagCR())
-				xs << xml::CR();
+		string tag = paragraphs[*info.abstract.begin()].layout().docbookforceabstracttag();
+		if (tag == "NONE")
+			tag = "abstract";
 
-			xs << xml::StartTag(tag);
-			xs << xml::CR();
-			xs << XMLStream::ESCAPE_NONE << abstract;
-			xs << xml::EndTag(tag);
+		if (!xs.isLastTagCR())
 			xs << xml::CR();
-		}
+
+		xs << xml::StartTag(tag);
+		xs << xml::CR();
+		xs << XMLStream::ESCAPE_NONE << abstract;
+		xs << xml::EndTag(tag);
+		xs << xml::CR();
 	}
 
 	// End the <info> tag if it was started.


More information about the lyx-cvs mailing list