commit 5c2652fa12bf5d9a7f677c431a933650bdd4d689
Author: Juergen Spitzmueller <[email protected]>
Date: Thu Jul 11 09:13:43 2024 +0200
BiblioInfo: Ability to distinguish '&' and 'and' author separation
Finicky styles such as APA use both in different context, and we need
to represent this to make style choice differentiatable
---
lib/layouts/stdciteformats.inc | 2 ++
src/BiblioInfo.cpp | 67 ++++++++++++++++++++++++++++--------------
src/BiblioInfo.h | 4 +--
3 files changed, 49 insertions(+), 24 deletions(-)
diff --git a/lib/layouts/stdciteformats.inc b/lib/layouts/stdciteformats.inc
index d88218d76b..78fe8706cd 100644
--- a/lib/layouts/stdciteformats.inc
+++ b/lib/layouts/stdciteformats.inc
@@ -29,6 +29,8 @@ CiteFormat default
B_namesep , [[separate author names in citation, except for last name]]
B_lastnamesep , and [[separate name of last author in citation]]
B_pairnamesep and [[separate two authors in citation]]
+ B_lastampnamesep , & [[separate name of last author in citation w/
ampersand]]
+ B_amppairnamesep & [[separate two authors in citation w/ ampersand]]
#
# Macros
diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp
index 5d4ded9996..04235e424a 100644
--- a/src/BiblioInfo.cpp
+++ b/src/BiblioInfo.cpp
@@ -524,19 +524,19 @@ BibTeXInfo::BibTeXInfo(docstring const & key, docstring
const & type)
docstring const BibTeXInfo::getAuthorOrEditorList(Buffer const * buf,
size_t const max_key_size,
- bool full, bool forceshort)
const
+ bool amp, bool full, bool
forceshort) const
{
docstring author = operator[]("author");
if (author.empty())
author = operator[]("editor");
- return getAuthorList(buf, author, max_key_size, full, forceshort);
+ return getAuthorList(buf, author, max_key_size, amp, full, forceshort);
}
docstring const BibTeXInfo::getAuthorList(Buffer const * buf,
docstring const & author, size_t const max_key_size,
- bool const full, bool const forceshort,
+ bool const amp, bool const full, bool const forceshort,
bool const allnames, bool const beginning) const
{
// Maxnames treshold depend on engine
@@ -582,12 +582,14 @@ docstring const BibTeXInfo::getAuthorList(Buffer const *
buf,
string const namesep =
buf ? buf->params().documentClass().getCiteMacro(engine_type,
"B_namesep")
: ", ";
- string const lastnamesep =
- buf ? buf->params().documentClass().getCiteMacro(engine_type,
"B_lastnamesep")
- : ", and ";
- string const pairnamesep =
- buf ? buf->params().documentClass().getCiteMacro(engine_type,
"B_pairnamesep")
- : " and ";
+ string lastnamesep = ", and ";
+ if (buf)
+ lastnamesep = amp ?
buf->params().documentClass().getCiteMacro(engine_type, "B_lastampnamesep")
+ :
buf->params().documentClass().getCiteMacro(engine_type, "B_lastnamesep");
+ string pairnamesep = " and ";
+ if (buf)
+ pairnamesep = amp ?
buf->params().documentClass().getCiteMacro(engine_type, "B_amppairnamesep")
+ :
buf->params().documentClass().getCiteMacro(engine_type, "B_pairnamesep");
string firstnameform =
buf ?
buf->params().documentClass().getCiteMacro(engine_type, "!firstnameform")
: "{%prefix%[[%prefix% ]]}%surname%{%suffix%[[,
%suffix%]]}{%prename%[[, %prename%]]}";
@@ -1192,65 +1194,86 @@ docstring BibTeXInfo::getValueForKey(string const &
oldkey, Buffer const & buf,
// Special key to provide abbreviated name list,
// with respect to maxcitenames. Suitable for
Bibliography
// beginnings.
+ bool const amp = prefixIs(subtype, '&');
+ if (amp)
+ subtype = subtype.substr(1);
docstring const kind = operator[](subtype);
- ret = getAuthorList(&buf, kind, ci.max_key_size, false,
false, true);
+ ret = getAuthorList(&buf, kind, ci.max_key_size, amp,
false, false, true);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
} else if (prefixIs(key, "fullnames:")) {
// Return a full name list. Suitable for Bibliography
// beginnings.
+ bool const amp = prefixIs(subtype, '&');
+ if (amp)
+ subtype = subtype.substr(1);
docstring const kind = operator[](subtype);
- ret = getAuthorList(&buf, kind, ci.max_key_size, true,
false, true);
+ ret = getAuthorList(&buf, kind, ci.max_key_size, amp,
true, false, true);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
} else if (prefixIs(key, "forceabbrvnames:")) {
// Special key to provide abbreviated name lists,
// irrespective of maxcitenames. Suitable for
Bibliography
// beginnings.
+ bool const amp = prefixIs(subtype, '&');
+ if (amp)
+ subtype = subtype.substr(1);
docstring const kind = operator[](subtype);
- ret = getAuthorList(&buf, kind, ci.max_key_size, false,
true, true);
+ ret = getAuthorList(&buf, kind, ci.max_key_size, amp,
false, true, true);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
} else if (prefixIs(key, "abbrvbynames:")) {
// Special key to provide abbreviated name list,
// with respect to maxcitenames. Suitable for further
names inside a
// bibliography item // (such as "ed. by ...")
+ bool const amp = prefixIs(subtype, '&');
+ if (amp)
+ subtype = subtype.substr(1);
docstring const kind = operator[](subtype);
- ret = getAuthorList(&buf, kind, ci.max_key_size, false,
false, true, false);
+ ret = getAuthorList(&buf, kind, ci.max_key_size, amp,
false, false, true, false);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
} else if (prefixIs(key, "fullbynames:")) {
// Return a full name list. Suitable for further names
inside a
// bibliography item // (such as "ed. by ...")
+ bool const amp = prefixIs(subtype, '&');
+ if (amp)
+ subtype = subtype.substr(1);
docstring const kind = operator[](subtype);
- ret = getAuthorList(&buf, kind, ci.max_key_size, true,
false, true, false);
+ ret = getAuthorList(&buf, kind, ci.max_key_size, amp,
true, false, true, false);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
} else if (prefixIs(key, "forceabbrvbynames:")) {
// Special key to provide abbreviated name lists,
// irrespective of maxcitenames. Suitable for further
names inside a
// bibliography item // (such as "ed. by ...")
+ bool const amp = prefixIs(subtype, '&');
+ if (amp)
+ subtype = subtype.substr(1);
docstring const kind = operator[](subtype);
- ret = getAuthorList(&buf, kind, ci.max_key_size, false,
true, true, false);
+ ret = getAuthorList(&buf, kind, ci.max_key_size, amp,
false, true, true, false);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
- } else if (key == "abbrvciteauthor") {
+ } else if (prefixIs(key, "abbrvciteauthor")) {
// Special key to provide abbreviated author or
// editor names (suitable for citation labels),
// with respect to maxcitenames.
- ret = getAuthorOrEditorList(&buf, ci.max_key_size,
false, false);
+ bool const amp = suffixIs(key, "&");
+ ret = getAuthorOrEditorList(&buf, ci.max_key_size, amp,
false, false);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
- } else if (key == "fullciteauthor") {
+ } else if (prefixIs(key, "fullciteauthor")) {
// Return a full author or editor list (for citation
labels)
- ret = getAuthorOrEditorList(&buf, ci.max_key_size,
true, false);
+ bool const amp = suffixIs(key, "&");
+ ret = getAuthorOrEditorList(&buf, ci.max_key_size, amp,
true, false);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
- } else if (key == "forceabbrvciteauthor") {
+ } else if (prefixIs(key, "forceabbrvciteauthor")) {
// Special key to provide abbreviated author or
// editor names (suitable for citation labels),
// irrespective of maxcitenames.
- ret = getAuthorOrEditorList(&buf, ci.max_key_size,
false, true);
+ bool const amp = suffixIs(key, "&");
+ ret = getAuthorOrEditorList(&buf, ci.max_key_size, amp,
false, true);
if (ci.forceUpperCase && isLowerCase(ret[0]))
ret[0] = uppercase(ret[0]);
} else if (key == "bibentry") {
@@ -1425,7 +1448,7 @@ docstring const
BiblioInfo::getAuthorOrEditorList(docstring const & key, Buffer
if (it == end())
return docstring();
BibTeXInfo const & data = it->second;
- return data.getAuthorOrEditorList(&buf, max_key_size, false);
+ return data.getAuthorOrEditorList(&buf, max_key_size, false, false);
}
diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h
index d1f1a8ed8d..6092894b40 100644
--- a/src/BiblioInfo.h
+++ b/src/BiblioInfo.h
@@ -68,10 +68,10 @@ public:
/// otherwise, it will be translated to the buffer language.
docstring const getAuthorOrEditorList(Buffer const * buf = nullptr,
size_t const max_key_size = 128,
- bool full = false, bool
forceshort = false) const;
+ bool amp = false, bool full =
false, bool forceshort = false) const;
/// Same for a specific author role (editor, author etc.)
docstring const getAuthorList(Buffer const * buf, docstring const &
author, size_t const max_key_size,
- bool const full = false, bool const
forceshort = false,
+ bool const amp = false, bool const full =
false, bool const forceshort = false,
bool const allnames = false, bool const
beginning = true) const;
///
docstring const getYear() const;
--
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs