DocBook: support bookauthor in bibliographies.

This commit is contained in:
Thibaut Cuvelier 2024-03-01 12:55:40 +01:00
parent 88a2414839
commit e3020a6b2d
4 changed files with 63 additions and 6 deletions

View File

@ -107,3 +107,14 @@ volume = {MCMXCVII},
month = 7, month = 7,
note = {An optional note} note = {An optional note}
} }
@incollection{Foucault:Kritik-EN92,
author = {Foucault, Michel},
title = {What is Critique?},
bookauthor = {Foucault, Michel},
booktitle = {The Politics of Truth},
pages = {41-82},
publisher = {Semiotext(e)},
address = {Los Angeles},
year = {1997}
}

View File

@ -876,7 +876,7 @@ Many things,
\begin_inset CommandInset citation \begin_inset CommandInset citation
LatexCommand cite LatexCommand cite
key "article,book,booklet,conference,inbook,incollection" key "article,book,booklet,conference,inbook,incollection,Foucault:Kritik-EN92"
literal "false" literal "false"
\end_inset \end_inset

View File

@ -264,7 +264,7 @@ I am no more code. </para>
<section> <section>
<title>I am the sixth section and I really like bibliographies</title> <title>I am the sixth section and I really like bibliographies</title>
<para>This text has references. First reference: <biblioref linkend="big" />. Second reference: <biblioref linkend="small" />. Both at the same time: <biblioref linkend="big" />, <biblioref linkend="small" />. A book: <biblioref linkend="Gro60" />. </para> <para>This text has references. First reference: <biblioref linkend="big" />. Second reference: <biblioref linkend="small" />. Both at the same time: <biblioref linkend="big" />, <biblioref linkend="small" />. A book: <biblioref linkend="Gro60" />. </para>
<para>Many things, just testing for completeness: <biblioref linkend="article" />, <biblioref linkend="book" />, <biblioref linkend="booklet" />, <biblioref linkend="conference" />, <biblioref linkend="inbook" />, <biblioref linkend="incollection" />. </para> <para>Many things, just testing for completeness: <biblioref linkend="article" />, <biblioref linkend="book" />, <biblioref linkend="booklet" />, <biblioref linkend="conference" />, <biblioref linkend="inbook" />, <biblioref linkend="incollection" />, <biblioref linkend="Foucault.Kritik-EN92" />. </para>
</section> </section>
<section> <section>
<title>I am the seventh section and I deal with indices</title> <title>I am the seventh section and I deal with indices</title>
@ -358,12 +358,17 @@ I am no more code. </para>
</biblioentry> </biblioentry>
<biblioentry xml:id="inbook"> <biblioentry xml:id="inbook">
<title>The title of the work</title> <title>The title of the work</title>
<volumenum>4</volumenum>
<edition>3</edition>
<artpagenums>201-213</artpagenums> <artpagenums>201-213</artpagenums>
<bibliomisc role="type">inbook</bibliomisc> <bibliomisc role="type">inbook</bibliomisc>
<publisher> <publisher>
<publishername>The name of the publisher</publishername> <publishername>The name of the publisher</publishername>
</publisher> <address>The address of the publisher</address></publisher>
<pubdate>1993</pubdate> <pubdate>1993</pubdate>
<biblioset relation="book">
<title></title>
</biblioset>
<authorgroup> <authorgroup>
<author> <author>
<personname> <personname>
@ -372,6 +377,7 @@ I am no more code. </para>
</personname> </personname>
</author> </author>
</authorgroup> </authorgroup>
<bibliomisc role="note">An optional note</bibliomisc>
</biblioentry> </biblioentry>
<biblioentry xml:id="incollection"> <biblioentry xml:id="incollection">
<title>The title of the work</title> <title>The title of the work</title>
@ -399,6 +405,27 @@ I am no more code. </para>
</editor> </editor>
<bibliomisc role="note">An optional note</bibliomisc> <bibliomisc role="note">An optional note</bibliomisc>
</biblioentry> </biblioentry>
<biblioentry xml:id="Foucault.Kritik-EN92">
<title>What is Critique?</title>
<artpagenums>41-82</artpagenums>
<bibliomisc role="type">incollection</bibliomisc>
<publisher>
<publishername>Semiotext(e)</publishername>
<address>Los Angeles</address></publisher>
<pubdate>1997</pubdate>
<biblioset relation="book">
<title>The Politics of Truth</title>
</biblioset>
<authorgroup>
<author>
<personname>
<firstname>Michel</firstname>
<surname>Foucault</surname>
</personname>
</author>
</authorgroup>
<!-- Several author tags in the reference. Other editor tag: fullbynames:bookauthor. Corresponding value: Michel Foucault -->
</biblioentry>
<biblioentry xml:id="small"> <biblioentry xml:id="small">
<title>A small paper</title> <title>A small paper</title>
<volumenum>-1</volumenum> <volumenum>-1</volumenum>

View File

@ -1142,6 +1142,7 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const
// Store the mapping between BibTeX and DocBook. // Store the mapping between BibTeX and DocBook.
map<string, string> toDocBookTag; map<string, string> toDocBookTag;
toDocBookTag["fullnames:author"] = "SPECIFIC"; // No direct translation to DocBook: <authorgroup>. toDocBookTag["fullnames:author"] = "SPECIFIC"; // No direct translation to DocBook: <authorgroup>.
toDocBookTag["fullbynames:bookauthor"] = "SPECIFIC"; // No direct translation to DocBook: <authorgroup>.
toDocBookTag["publisher"] = "SPECIFIC"; // No direct translation to DocBook: <publisher>. toDocBookTag["publisher"] = "SPECIFIC"; // No direct translation to DocBook: <publisher>.
toDocBookTag["address"] = "SPECIFIC"; // No direct translation to DocBook: <publisher>. toDocBookTag["address"] = "SPECIFIC"; // No direct translation to DocBook: <publisher>.
toDocBookTag["editor"] = "SPECIFIC"; // No direct translation to DocBook: <editor><personname/orgname>. toDocBookTag["editor"] = "SPECIFIC"; // No direct translation to DocBook: <editor><personname/orgname>.
@ -1401,11 +1402,29 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const
// <authorgroup> // <authorgroup>
// Example: http://tdg.docbook.org/tdg/5.1/authorgroup.html // Example: http://tdg.docbook.org/tdg/5.1/authorgroup.html
if (hasTag("fullnames:author")) { if (hasTag("fullnames:author") || hasTag("fullbynames:bookauthor")) {
// If several author tags are present, only output one.
const docstring authorName = getTag(
hasTag("fullnames:author") ? "fullnames:author" : "fullbynames:bookauthor");
// Perform full parsing of the BibTeX string, dealing with the many corner cases that might // Perform full parsing of the BibTeX string, dealing with the many corner cases that might
// be encountered. // be encountered.
authorsToDocBookAuthorGroup(getTag("fullnames:author"), xs, buffer()); authorsToDocBookAuthorGroup(authorName, xs, buffer());
eraseTag("fullnames:author");
if (hasTag("fullnames:author") && hasTag("fullbynames:bookauthor")) {
xs << XMLStream::ESCAPE_NONE <<
from_utf8("<!-- Several author tags in the reference. Other editor tag: ") +
from_utf8("fullbynames:bookauthor. Corresponding value: ") +
getTag("fullbynames:bookauthor") + from_utf8(" -->\n");
}
// Erase all author tags that might be present, even if only one is output.
if (hasTag("fullnames:author")) {
eraseTag("fullnames:author");
}
if (hasTag("fullbynames:bookauthor")) {
eraseTag("fullbynames:bookauthor");
}
} }
// <editor> // <editor>