commit dae064043682ea7dcf03899abaca067ee2245655
Author: Thibaut Cuvelier <[email protected]>
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
¶graphs,
// 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
¶graphs,
// 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
¶graphs,
(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.
--
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs