The branch, biblatex2, has been updated. - Log -----------------------------------------------------------------
commit a751c5b846a836d9f1096052e281adae533c647c Author: Juergen Spitzmueller <[email protected]> Date: Mon Jan 9 17:54:56 2017 +0100 Extend and improve name list handling This allows to generate different name lists depending on the need and context. Also addresses #8489. diff --git a/lib/citeengines/biblatex-natbib.citeengine b/lib/citeengines/biblatex-natbib.citeengine index aedfb87..0f8545e 100644 --- a/lib/citeengines/biblatex-natbib.citeengine +++ b/lib/citeengines/biblatex-natbib.citeengine @@ -162,7 +162,11 @@ CiteFormat default !smartsep {%second%[[{%next%[[%_namesep%]][[%_pairnamesep%]]}]][[{%next%[[%_namesep%]][[%_lastnamesep%]]}]]} # "Author et al." or "??" - !abbrvauthor {%abbrvauthor%[[%abbrvauthor%]][[??]]} + !abbrvciteauthor {%abbrvciteauthor%[[%abbrvciteauthor%]][[??]]} + # "Author, ..." or "??" + !fullciteauthor {%fullciteauthor%[[%fullciteauthor%]][[??]]} + # Handle starred command: abbr. or full author list + !makeauthor {%ifstar%[[%!fullciteauthor%]][[%!abbrvciteauthor%]]} # "prenote " !textbefore {%textbefore%[[%textbefore% ]]} # ", postnote" @@ -181,7 +185,7 @@ CiteFormat default !fullcite %bibentry%%!nextfullcite% # "...; Author..." - !nextauthor {%next%[[%!sep% %!startlink%%!abbrvauthor%%!endlink%%!nextauthor%]]} + !nextauthor {%next%[[%!sep% %!startlink%%!makeauthor%%!endlink%%!nextauthor%]]} # "..., CiteKey..." !nextkey {%next%[[%!sep% %key%%!nextkey%]]} # ".., Year..." (including extra label, as in 2017a) @@ -202,7 +206,7 @@ CiteFormat default # # "cf. Author; NextAuthor, p. xx" - citeauthor %!textbefore%%!startlink%%!abbrvauthor%%!endlink%%!nextauthor%%!textafter% + citeauthor %!textbefore%%!startlink%%!makeauthor%%!endlink%%!nextauthor%%!textafter% # "cf. Year; NextYear, S. xx" [Authoryear] / "cf. Year, NextYear, S. xx" [Numerical] citeyear %!textbefore%%!startlink%%!myear%%!endlink%%!nextmyear%%!textafter% # "cf. Year; Nextyear, p. xx" (without any extra label) @@ -228,16 +232,16 @@ CiteFormat authoryear !close ) # "Author et al. (cf. Year..." - !makecitet %!startlink%%!abbrvauthor%%!endlink% %!open%%!textbefore%%!makeyear%%!nextcitet% + !makecitet %!startlink%%!makeauthor%%!endlink% %!open%%!textbefore%%!makeyear%%!nextcitet% # "cf. Author et al. Year..." - !makecitealt %!textbefore%%!startlink%%!abbrvauthor% %!makeyear%%!endlink%%!nextcitealt% + !makecitealt %!textbefore%%!startlink%%!makeauthor% %!makeyear%%!endlink%%!nextcitealt% # "Author et al., Year..." - !makecitealp %!startlink%%!abbrvauthor%, %!makeyear%%!endlink%%!nextcitealp% + !makecitealp %!startlink%%!makeauthor%, %!makeyear%%!endlink%%!nextcitealp% # "...), [and] Nextauthor (Year..." - !nextcitet {%next%[[%!close%%!smartsep%%!startlink%%!abbrvauthor%%!endlink% %!open%%!makeyear%%!nextcitet%]]} + !nextcitet {%next%[[%!close%%!smartsep%%!startlink%%!makeauthor%%!endlink% %!open%%!makeyear%%!nextcitet%]]} # "...; NextAuthor et al. Year..." - !nextcitealt {%next%[[%!sep% %!startlink%%!abbrvauthor% %!makeyear%%!endlink%%!nextcitealt%]]} + !nextcitealt {%next%[[%!sep% %!startlink%%!makeauthor% %!makeyear%%!endlink%%!nextcitealt%]]} # "...; NextAuthor et al., Year..." !nextcitealp {%next%[[%!sep% %!makecitealp%]]} @@ -281,14 +285,14 @@ CiteFormat numerical !close ] # "Author [cf. ID..." - !makecitet %!abbrvauthor% %!open%%!textbefore%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nextcitet% + !makecitet %!makeauthor% %!open%%!textbefore%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nextcitet% # "ID..." !makecitealt {%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nextcitealt% # "ID..." !hashkey {%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%%!nexthashkey%]]} # "...], [and] NextAuthor [ID..." - !nextcitet {%next%[[%!close%%!smartsep%%!abbrvauthor% %!open%%!textbefore%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nextcitet%]]} + !nextcitet {%next%[[%!close%%!smartsep%%!makeauthor% %!open%%!textbefore%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nextcitet%]]} # "..., ID..." !nextcitealt {%next%[[%!sep% %!makecitealt%]]} # FIXME: What is this? @@ -296,7 +300,7 @@ CiteFormat numerical # "..., NextID..." !nexthashkey {%next%[[%!sep% %!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%%!nexthashkey%]]} # "...); Nextauthor [ID..." - !nextcitet {%next%[[%!close%%!smartsep%%!abbrvauthor% %!open%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nextcitet%]]} + !nextcitet {%next%[[%!close%%!smartsep%%!makeauthor% %!open%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nextcitet%]]} # # ACTUAL STYLE DEFINITIONS diff --git a/lib/citeengines/biblatex.citeengine b/lib/citeengines/biblatex.citeengine index 66cbfe3..2a473df 100644 --- a/lib/citeengines/biblatex.citeengine +++ b/lib/citeengines/biblatex.citeengine @@ -150,7 +150,7 @@ CiteFormat default !dummymod [a] # "...; Nextauthor ..." - !nextauthor {%next%[[%!sep% %!startlink%%!abbrvauthor%%!endlink%%!nextauthor%]]} + !nextauthor {%next%[[%!sep% %!startlink%%!abbrvciteauthor%%!endlink%%!nextauthor%]]} # Handle starred command: abbr. or full author list !makenextauthor {%next%[[%!sep% %!startlink%%!makeauthor%%!endlink%%!makenextauthor%]]} # "...; [NextID] ..." @@ -167,11 +167,11 @@ CiteFormat default !nextfullcite {%next%[[%!sep% %bibentry%%!nextfullcite%]]} # "Author et al." (if > 3 authors) or "??" - !abbrvauthor {%abbrvauthor%[[%abbrvauthor%]][[??]]} + !abbrvciteauthor {%abbrvciteauthor%[[%abbrvciteauthor%]][[??]]} # "Author et al." (always) or "??" - !forceabbrvauthor {%forceabbrvauthor%[[%forceabbrvauthor%]][[??]]} + !forceabbrvciteauthor {%forceabbrvciteauthor%[[%forceabbrvciteauthor%]][[??]]} # Handle starred command: force of abbr. author list, independent of maxcitenames - !makeauthor {%ifstar%[[%!forceabbrvauthor%]][[%!abbrvauthor%]]} + !makeauthor {%ifstar%[[%!forceabbrvciteauthor%]][[%!abbrvciteauthor%]]} # "prenote " !textbefore {%textbefore%[[%textbefore% ]]} # ", postnote" @@ -220,14 +220,14 @@ CiteFormat authoryear !close ) # "cf. Author et. al Year..." - !makecite %!startlink%%!abbrvauthor% %!year%%!endlink%%!nextcite% + !makecite %!startlink%%!abbrvciteauthor% %!year%%!endlink%%!nextcite% # Author et al. (cf. Year... - !maketextcite %!startlink%%!abbrvauthor%%!endlink% %!open%%!textbefore%%!year%%!nexttextcite% + !maketextcite %!startlink%%!abbrvciteauthor%%!endlink% %!open%%!textbefore%%!year%%!nexttextcite% # "...; Nextauthor Year..." !nextcite {%next%[[%!sep% %!makecite%]]} # "...); Nextauthor (Year..." - !nexttextcite {%next%[[%!close%%!smartsep%%!startlink%%!abbrvauthor%%!endlink% %!open%%!year%%!nexttextcite%]]} + !nexttextcite {%next%[[%!close%%!smartsep%%!startlink%%!abbrvciteauthor%%!endlink% %!open%%!year%%!nexttextcite%]]} # Add a year if it exists (else title, else "??") and possibly a modifier (as in 2017a) !yeartitle {%year%[[%year%{%modifier%[[%modifier%]][[{%export%[[]][[%!dummymod%]]}]]}]][[{%title%[[%title%]][[??]]}]]} @@ -273,12 +273,12 @@ CiteFormat numerical !close ] # "Author [cf. ID..." - !maketextcite %!abbrvauthor% %!open%%!textbefore%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nexttextcite% + !maketextcite %!abbrvciteauthor% %!open%%!textbefore%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nexttextcite% # "ID" !makekey {%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%%!nextkey%]]} # "...); Nextauthor [ID..." - !nexttextcite {%next%[[%!close%%!smartsep%%!abbrvauthor% %!open%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nexttextcite%]]} + !nexttextcite {%next%[[%!close%%!smartsep%%!abbrvciteauthor% %!open%{%dialog%[[#ID]][[%!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%]]}%!nexttextcite%]]} # "..., NextID..." !nextkey {%next%[[%!sep% %!startlink%{%numericallabel%[[%numericallabel%]][[#%key%]]}%!endlink%%!nextkey%]]} diff --git a/lib/citeengines/jurabib.citeengine b/lib/citeengines/jurabib.citeengine index 95d6632..34f6e07 100644 --- a/lib/citeengines/jurabib.citeengine +++ b/lib/citeengines/jurabib.citeengine @@ -137,7 +137,7 @@ CiteFormat authoryear !endlink {!</a>!} # "ShortAuthor", "Author" or "??" - !shortauthor {%shortauthor%[[%shortauthor%]][[{%abbrvauthor%[[%abbrvauthor%]][[??]]}]]} + !shortauthor {%shortauthor%[[%shortauthor%]][[{%abbrvciteauthor%[[%abbrvciteauthor%]][[??]]}]]} # "... ShortTitle" !shorttitle {%shorttitle%[[ %shorttitle%]][[{%dialog%[[ <%_shorttitle%>]][[%!makejurashorttitle%]]}]]} # Title or "??" diff --git a/lib/citeengines/natbib.citeengine b/lib/citeengines/natbib.citeengine index 89200dd..e92209e 100644 --- a/lib/citeengines/natbib.citeengine +++ b/lib/citeengines/natbib.citeengine @@ -124,11 +124,11 @@ CiteFormat default !endlink {!</a>!} # "Author et al." or "??" - !abbrvauthor {%abbrvauthor%[[%abbrvauthor%]][[??]]} + !abbrvciteauthor {%abbrvciteauthor%[[%abbrvciteauthor%]][[??]]} # "Author, ..." or "??" - !fullauthor {%fullauthor%[[%fullauthor%]][[??]]} + !fullciteauthor {%fullciteauthor%[[%fullciteauthor%]][[??]]} # Handle starred command: abbr. or full author list - !makeauthor {%ifstar%[[%!fullauthor%]][[%!abbrvauthor%]]} + !makeauthor {%ifstar%[[%!fullciteauthor%]][[%!abbrvciteauthor%]]} # "prenote " !textbefore {%textbefore%[[%textbefore% ]]} # ", postnote" diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index e391788..ae983cf 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -22322,7 +22322,7 @@ cite* \begin_layout Itemize -\change_inserted -712698321 1483868404 +\change_inserted -712698321 1483978485 \begin_inset Flex Code status collapsed @@ -22358,7 +22358,7 @@ status collapsed , else the false part (e.g., in a citation definition: \begin_inset Flex Code -status open +status collapsed \begin_layout Plain Layout @@ -22371,6 +22371,600 @@ status open \end_inset ) +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483978548 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483978499 +{%ifmultiple:<authortype>%[[true]][[false]]} +\end_layout + +\end_inset + +: process the +\begin_inset Quotes eld +\end_inset + +true +\begin_inset Quotes erd +\end_inset + + if the current author type (author, editor etc.) has multiple authors, else + the false part (e.g., in a bibliography definition: +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483978571 +{%ifmultiple:editor%[[eds.]][[ed.]]} +\end_layout + +\end_inset + +) +\change_unchanged + +\end_layout + +\begin_layout Standard + +\change_inserted -712698321 1483978958 +We said that +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483978693 +%author% +\end_layout + +\end_inset + + prints the author key as it is recorded in the bibliography file. + This might not be what you want, since it will result in a string such + as +\begin_inset Quotes eld +\end_inset + +Miller, Peter and Smith, Mary and White, Jane +\begin_inset Quotes erd +\end_inset + + (since +\begin_inset Quotes eld +\end_inset + +and +\begin_inset Quotes erd +\end_inset + + is used by Bib\SpecialChar TeX + to delimit authors). + \SpecialChar LyX + therefore provides some methods to get properly formatted name lists (which + will also get translated). + The following keys are provided: +\end_layout + +\begin_layout Enumerate + +\change_inserted -712698321 1483979807 +For name lists with pre- and surname, suitable for the main authors/editors + of a bibliography item. + The +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979800 +<nametype> +\change_unchanged + +\end_layout + +\end_inset + + part denotes the kind of list that is requested (e.g. + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979807 +<nametype:author> +\change_unchanged + +\end_layout + +\end_inset + +): +\end_layout + +\begin_deeper +\begin_layout Itemize + +\change_inserted -712698321 1483979186 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979743 +%abbrvnames:<nametype>% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a name list which is abbreviated (with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +) when +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979186 +MaxCiteNames +\change_unchanged + +\end_layout + +\end_inset + + is reached. +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483979527 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979748 +%fullnames:<nametype>% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a full name list (never abbreviated with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +). +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483979553 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483980138 +%forceabbrvnames:<nametype>% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a name list which is always abbreviated (with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +) irrespective of +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979535 +MaxCiteNames +\end_layout + +\end_inset + +. +\change_unchanged + +\end_layout + +\end_deeper +\begin_layout Enumerate + +\change_inserted -712698321 1483979413 +Alternative name lists with pre- and surname, if the order of pre- and surname + inside the bibliography item differs (as in: +\begin_inset Quotes eld +\end_inset + +Miller, John: Some text, in: Mary Smith, ed.: A volume +\begin_inset Quotes erd +\end_inset + +): +\change_unchanged + +\end_layout + +\begin_deeper +\begin_layout Itemize + +\change_inserted -712698321 1483979565 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979751 +%abbrvbynames:<nametype>% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a name list which is abbreviated (with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +) when +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979565 +MaxCiteNames +\end_layout + +\end_inset + + is reached. +\change_unchanged + +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483979570 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979753 +%fullbynames:<nametype>% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a full name list (never abbreviated with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +). +\change_unchanged + +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483979576 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483980143 +%forceabbrvbynames:<nametype>% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a name list which is always abbreviated (with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +) irrespective of +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979574 +MaxCiteNames +\end_layout + +\end_inset + +. +\end_layout + +\end_deeper +\begin_layout Enumerate + +\change_inserted -712698321 1483980219 +And finally name lists which consist of family names only, as used in author-yea +r citation labels. + these do not take a +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979871 +<nametype> +\change_unchanged + +\end_layout + +\end_inset + + part, but always return either an author list or, if this does not exist, + an editor list (as common in author-year labels): +\change_unchanged + +\end_layout + +\begin_deeper +\begin_layout Itemize + +\change_inserted -712698321 1483979715 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979700 +%abbrvciteauthor% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a name list which is abbreviated (with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +) when +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979715 +MaxCiteNames +\end_layout + +\end_inset + + is reached. +\change_unchanged + +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483979721 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979703 +%fullciteauthor% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a full name list (never abbreviated with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +). +\change_unchanged + +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483980272 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979705 +%forceabbrvciteauthor% +\change_unchanged + +\end_layout + +\end_inset + +: Provides a name list which is always abbreviated (with +\begin_inset Quotes eld +\end_inset + +et al. +\begin_inset Quotes erd +\end_inset + +) irrespective of +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483979726 +MaxCiteNames +\end_layout + +\end_inset + +. +\end_layout + +\end_deeper +\begin_layout Standard + +\change_inserted -712698321 1483980314 +The order of pre- and surname in the former two lists can be adjusted by + these macros: +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483980535 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483980354 +!firstnameform %surname%, %prename% +\change_unchanged + +\end_layout + +\end_inset + + (first author in lists of type 1) +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483980557 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483980367 +!othernameform %surname%, %prename% +\change_unchanged + +\end_layout + +\end_inset + + (other authors in lists of type 1) +\change_unchanged + +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483980550 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483980373 +!firstbynameform %prename% %surname% +\change_unchanged + +\end_layout + +\end_inset + + (first author in lists of type 2) +\end_layout + +\begin_layout Itemize + +\change_inserted -712698321 1483980570 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1483980381 +!otherbynameform %prename% %surname% +\change_unchanged + +\end_layout + +\end_inset + + (other authors in lists of type 2) +\end_layout + +\begin_layout Standard + +\change_inserted -712698321 1483980643 +This allows you to configure namings like +\begin_inset Quotes eld +\end_inset + +Miller, Peter and Mary Smith: \SpecialChar ldots +, in: John Doe and Pat Green, eds.:\SpecialChar ldots + +\begin_inset Quotes erd +\end_inset + +. \change_unchanged \end_layout diff --git a/lib/layouts/stdciteformats.inc b/lib/layouts/stdciteformats.inc index 86f24a2..d8506c0 100644 --- a/lib/layouts/stdciteformats.inc +++ b/lib/layouts/stdciteformats.inc @@ -1,31 +1,55 @@ # Standard formats for citations. # # Author: Richard Heck <[email protected]> +# Jürgen Spitzmüller <[email protected]> Format 63 CiteFormat default - # translatable bits + # + # Translatable bits + # _pptext pp. _edtext ed. + _edstext eds. _voltext vol. _numtext no. _in in + # The following are handled by BiblioInfo. Note that preceding and trailing spaces matter + _namesep , [[separate author names in citation, except for last name]] + _lastnamesep , and [[separate name of last author in citation]] + _pairnamesep and [[separate two authors in citation]] + # # Macros + # + # Scheme of the first author in the bibliography + !firstnameform %surname%, %prename% + # Scheme of other authors in the bibliography + !othernameform %surname%, %prename% + # Scheme of the first name in later parts (such as book editor) + !firstbynameform %prename% %surname% + # Scheme of other authors in later parts (such as book editor) + !otherbynameform %prename% %surname% + # pagination !pages {%pages%[[, %_pptext% %pages%]]} - !authoredit {%author%[[%author%, ]][[{%editor%[[%editor%, %_edtext%, ]]}]]} + # ed. or eds. + !makeed {%ifmultiple:editor%[[%_edstext%]][[%_edtext%]]} + # author or editor, as fullnames, following the schemes above + !authoredit {%fullnames:author%[[%fullnames:author%, ]][[{%fullnames:editor%[[%fullnames:editor%, %!makeed%, ]]}]]} + # "vol. 1, no. !volnum {%volume%[[ %_voltext% %volume%, {%number%[[%_numtext% %number%]]}]]} !quotetitle "%title%" !emphtitle {!<i>!}%title%{!</i>!} !emphjournal {!<i>!}{%journal%[[%journal%]][[{%journaltitle%[[%journaltitle%]]}]]}{!</i>!} !location {%address%[[%address%: ]][[{%location%[[%location%: ]]}]]} + # # Entry types. Note that final punctuation will be added later, if needed. + # + !insomething %fullnames:author%, %!quotetitle%, %_in%{%fullbynames:editor%[[ %fullbynames:editor%, %!makeed%,]]} {!<i>!}%booktitle%{!</i>!}%!volnum%{%edition%[[ %edition%]]} (%!location%%publisher%, %year%)%!pages%{%note%[[. %note%]]} - !insomething %author%, %!quotetitle%, %_in%{%editor%[[ %editor%, %_edtext%,]]} {!<i>!}%booktitle%{!</i>!}%!volnum%{%edition%[[ %edition%]]} (%!location%%publisher%, %year%)%!pages%{%note%[[. %note%]]} - - article %author%, %!quotetitle%, %!emphjournal% {%volume%[[ %volume%{%number%[[, %number%]]}]]} (%year%)%!pages%{%note%[[. %note%]]} + article %fullnames:author%, %!quotetitle%, %!emphjournal% {%volume%[[ %volume%{%number%[[, %number%]]}]]} (%year%)%!pages%{%note%[[. %note%]]} !booklike %!authoredit%%!emphtitle%%!volnum%{%edition%[[ %edition%]]} (%!location%%publisher%, %year%){%note%[[. %note%]]} book %!booklike% @@ -35,7 +59,7 @@ CiteFormat default incollection %!insomething% inproceedings %!insomething% - !theses %author%, %title% (%!location%{%school%[[%school%]][[%institution%]]}, %year%){%note%[[. %note%]]} + !theses %fullnames:author%, %title% (%!location%{%school%[[%school%]][[%institution%]]}, %year%){%note%[[. %note%]]} thesis %!theses% phdthesis %!theses% mastersthesis %!theses% diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp index 75ea5a2..ab06f37 100644 --- a/src/BiblioInfo.cpp +++ b/src/BiblioInfo.cpp @@ -7,6 +7,7 @@ * \author Herbert Voà * \author Richard Heck * \author Julien Rioux + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -45,51 +46,82 @@ namespace lyx { namespace { -// gets the "family name" from an author-type string -docstring familyName(docstring const & name) +// gets the "prename" and "family name" from an author-type string +pair<docstring, docstring> nameParts(docstring const & name) { if (name.empty()) - return docstring(); + return make_pair(docstring(), docstring()); // first we look for a comma, and take the last name to be everything // preceding the right-most one, so that we also get the "jr" part. - docstring::size_type idx = name.rfind(','); - if (idx != docstring::npos) - return ltrim(name.substr(0, idx)); + vector<docstring> pieces = getVectorFromString(name); + if (pieces.size() > 1) + // whether we have a jr. part or not, it's always + // the first and last item (reversed) + return make_pair(pieces.back(), pieces.front()); // OK, so now we want to look for the last name. We're going to // include the "von" part. This isn't perfect. // Split on spaces, to get various tokens. - vector<docstring> pieces = getVectorFromString(name, from_ascii(" ")); + pieces = getVectorFromString(name, from_ascii(" ")); // If we only get two, assume the last one is the last name if (pieces.size() <= 2) - return pieces.back(); + return make_pair(pieces.front(), pieces.back()); - // Now we look for the first token that begins with a lower case letter. + // Now we look for the first token that begins with + // a lower case letter or an opening group {. + docstring prename; vector<docstring>::const_iterator it = pieces.begin(); vector<docstring>::const_iterator en = pieces.end(); + bool first = true; for (; it != en; ++it) { if ((*it).empty()) continue; char_type const c = (*it)[0]; - if (isLower(c)) + if (isLower(c) || c == '{') break; + if (!first) + prename += " "; + else + first = false; + prename += *it; } - if (it == en) // we never found a "von" - return pieces.back(); + if (it == en) // we never found a "von" or group + return make_pair(prename, pieces.back()); - // reconstruct what we need to return - docstring retval; - bool first = true; + // reconstruct the family name + docstring surname; + first = true; for (; it != en; ++it) { if (!first) - retval += " "; + surname += " "; else first = false; - retval += *it; + surname += *it; } - return retval; + return make_pair(prename, surname); +} + + +docstring constructName(docstring const & name, string const scheme) +{ + // re-constructs a name from name parts according + // to a given scheme + docstring const prename = nameParts(name).first; + docstring const surname = nameParts(name).second; + docstring result = from_ascii(scheme); + result = subst(result, from_ascii("%prename%"), prename); + result = subst(result, from_ascii("%surname%"), surname); + return result; +} + + +bool multipleAuthors(docstring const author) +{ + vector<docstring> const authors = + getVectorFromString(author, from_ascii(" and ")); + return authors.size() > 1; } @@ -256,8 +288,20 @@ BibTeXInfo::BibTeXInfo(docstring const & key, docstring const & type) {} -docstring const BibTeXInfo::getAuthorList( - Buffer const * buf, bool full, bool forceshort) const +docstring const BibTeXInfo::getAuthorOrEditorList(Buffer const * buf, + bool full, bool forceshort) const +{ + docstring author = operator[]("author"); + if (author.empty()) + author = operator[]("editor"); + + return getAuthorList(buf, author, full, forceshort); +} + + +docstring const BibTeXInfo::getAuthorList(Buffer const * buf, docstring author, + bool full, bool forceshort, bool allnames, + bool beginning) const { // Maxnames treshold depend on engine size_t maxnames = buf ? @@ -277,12 +321,8 @@ docstring const BibTeXInfo::getAuthorList( return authors; } - docstring author = operator[]("author"); - if (author.empty()) { - author = operator[]("editor"); - if (author.empty()) - return author; - } + if (author.empty()) + return author; // FIXME Move this to a separate routine that can // be called from elsewhere. @@ -310,6 +350,17 @@ docstring const BibTeXInfo::getAuthorList( string const pairnamesep = buf ? buf->params().documentClass().getCiteMacro(engine_type, "_pairnamesep") : " and "; + string firstnameform = + buf ? buf->params().documentClass().getCiteMacro(engine_type, "!firstnameform") + : "%surname%, %prename%"; + if (!beginning) + firstnameform = buf ? buf->params().documentClass().getCiteMacro(engine_type, "!firstbynameform") + : "%prename% %surname%"; + string othernameform = buf ? buf->params().documentClass().getCiteMacro(engine_type, "!othernameform") + : "%surname%, %prename%"; + if (!beginning) + othernameform = buf ? buf->params().documentClass().getCiteMacro(engine_type, "!otherbynameform") + : "%prename% %surname%"; // Shorten the list (with et al.) if forceshort is set // and the list can actually be shorten, else if maxcitenames @@ -333,10 +384,18 @@ docstring const BibTeXInfo::getAuthorList( retval += buf ? buf->B_(lastnamesep) : from_ascii(lastnamesep); } else if (i > 0) retval += buf ? buf->B_(namesep) : from_ascii(namesep); - retval += familyName(*it); + if (allnames) + retval += (i == 0) ? constructName(*it, firstnameform) + : constructName(*it, othernameform); + else + retval += nameParts(*it).second; + } + if (shorten) { + if (allnames) + retval = constructName(authors[0], firstnameform) + (buf ? buf->B_(etal) : from_ascii(etal)); + else + retval = nameParts(authors[0]).second + (buf ? buf->B_(etal) : from_ascii(etal)); } - if (shorten) - retval = familyName(authors[0]) + (buf ? buf->B_(etal) : from_ascii(etal)); return convertLaTeXCommands(retval); } @@ -766,21 +825,75 @@ docstring BibTeXInfo::getValueForKey(string const & oldkey, Buffer const & buf, ret = modifier_; else if (key == "numericallabel") ret = cite_number_; - else if (key == "abbrvauthor") { - // Special key to provide abbreviated author names, + else if (prefixIs(key, "ifmultiple:")) { + // Return whether we have multiple authors + docstring const kind = operator[](from_ascii(key.substr(11))); + if (multipleAuthors(kind)) + ret = from_ascii("x"); // any non-empty string will do + } + else if (prefixIs(key, "abbrvnames:")) { + // Special key to provide abbreviated name list, + // with respect to maxcitenames. Suitable for Bibliography + // beginnings. + docstring const kind = operator[](from_ascii(key.substr(11))); + ret = getAuthorList(&buf, kind, 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. + docstring const kind = operator[](from_ascii(key.substr(10))); + ret = getAuthorList(&buf, kind, 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. + docstring const kind = operator[](from_ascii(key.substr(15))); + ret = getAuthorList(&buf, kind, 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 ...") + docstring const kind = operator[](from_ascii(key.substr(11))); + ret = getAuthorList(&buf, kind, 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 ...") + docstring const kind = operator[](from_ascii(key.substr(10))); + ret = getAuthorList(&buf, kind, 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 ...") + docstring const kind = operator[](from_ascii(key.substr(15))); + ret = getAuthorList(&buf, kind, false, true, true, false); + if (ci.forceUpperCase && isLowerCase(ret[0])) + ret[0] = uppercase(ret[0]); + } else if (key == "abbrvciteauthor") { + // Special key to provide abbreviated author or + // editor names (suitable for citation labels), // with respect to maxcitenames. - ret = getAuthorList(&buf, false, false); + ret = getAuthorOrEditorList(&buf, false, false); if (ci.forceUpperCase && isLowerCase(ret[0])) ret[0] = uppercase(ret[0]); - } else if (key == "fullauthor") { - // Return a full author list - ret = getAuthorList(&buf, true, false); + } else if (key == "fullciteauthor") { + // Return a full author or editor list (for citation labels) + ret = getAuthorOrEditorList(&buf, true, false); if (ci.forceUpperCase && isLowerCase(ret[0])) ret[0] = uppercase(ret[0]); - } else if (key == "forceabbrvauthor") { - // Special key to provide abbreviated author names, + } else if (key == "forceabbrvciteauthor") { + // Special key to provide abbreviated author or + // editor names (suitable for citation labels), // irrespective of maxcitenames. - ret = getAuthorList(&buf, false, true); + ret = getAuthorOrEditorList(&buf, false, true); if (ci.forceUpperCase && isLowerCase(ret[0])) ret[0] = uppercase(ret[0]); } else if (key == "bibentry") { @@ -903,13 +1016,13 @@ vector<docstring> const BiblioInfo::getEntries() const } -docstring const BiblioInfo::getAuthorList(docstring const & key, Buffer const & buf) const +docstring const BiblioInfo::getAuthorOrEditorList(docstring const & key, Buffer const & buf) const { BiblioInfo::const_iterator it = find(key); if (it == end()) return docstring(); BibTeXInfo const & data = it->second; - return data.getAuthorList(&buf, false); + return data.getAuthorOrEditorList(&buf, false); } @@ -1075,8 +1188,8 @@ namespace { // used in xhtml to sort a list of BibTeXInfo objects bool lSorter(BibTeXInfo const * lhs, BibTeXInfo const * rhs) { - docstring const lauth = lhs->getAuthorList(); - docstring const rauth = rhs->getAuthorList(); + docstring const lauth = lhs->getAuthorOrEditorList(); + docstring const rauth = rhs->getAuthorOrEditorList(); docstring const lyear = lhs->getYear(); docstring const ryear = rhs->getYear(); docstring const ltitl = lhs->operator[]("title"); @@ -1164,7 +1277,7 @@ void BiblioInfo::makeCitationLabels(Buffer const & buf) // the first test. // coverity[FORWARD_NULL] if (it != cited_entries_.begin() - && entry.getAuthorList() == last->second.getAuthorList() + && entry.getAuthorOrEditorList() == last->second.getAuthorOrEditorList() // we access the year via getYear() so as to get it from the xref, // if we need to do so && getYear(entry.key()) == getYear(last->second.key())) { @@ -1196,7 +1309,7 @@ void BiblioInfo::makeCitationLabels(Buffer const & buf) if (numbers) { entry.label(entry.citeNumber()); } else { - docstring const auth = entry.getAuthorList(&buf, false); + docstring const auth = entry.getAuthorOrEditorList(&buf, false); // we do it this way so as to access the xref, if necessary // note that this also gives us the modifier docstring const year = getYear(*it, buf, true); diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h index 3fc7866..f9126be 100644 --- a/src/BiblioInfo.h +++ b/src/BiblioInfo.h @@ -55,12 +55,16 @@ public: BibTeXInfo(bool ib) : is_bibtex_(ib), modifier_(0) {} /// constructor that sets the entryType BibTeXInfo(docstring const & key, docstring const & type); - /// \return the an authorlist (short form by default), + /// \return an author or editor list (short form by default), /// used for sorting. /// This will be translated to the UI language if buf is null /// otherwise, it will be translated to the buffer language. - docstring const getAuthorList(Buffer const * buf = 0, bool full = false, + docstring const getAuthorOrEditorList(Buffer const * buf = 0, bool full = false, bool forceshort = false) const; + /// Same for a specific author role (editor, author etc.) + docstring const getAuthorList(Buffer const * buf = 0, docstring author = docstring(), + bool full = false, bool forceshort = false, + bool allnames = false, bool beginning = true) const; /// docstring const getYear() const; /// \return formatted BibTeX data suitable for framing. @@ -179,8 +183,8 @@ public: std::vector<docstring> const getFields() const; /// \return a sorted vector of BibTeX entry types in use std::vector<docstring> const getEntries() const; - /// \return authorlist (abbreviated form by default) - docstring const getAuthorList(docstring const & key, Buffer const & buf) const; + /// \return author or editor list (abbreviated form by default) + docstring const getAuthorOrEditorList(docstring const & key, Buffer const & buf) const; /// \return the year from the bibtex data record for \param key /// if \param use_modifier is true, then we will also append any /// modifier for this entry (e.g., 1998b). diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 6157348..3ab14b2 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -1818,7 +1818,7 @@ Layout const & DocumentClass::htmlTOCLayout() const string const DocumentClass::getCiteFormat(CiteEngineType const & type, string const & entry, bool const punct, string const & fallback) const { - string default_format = "{%author%[[%author%, ]][[{%editor%[[%editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!<i>!}%journal%{!</i>!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}"; + string default_format = "{%fullnames:author%[[%fullnames:author%, ]][[{%fullnames:editor%[[%fullnames:editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!<i>!}%journal%{!</i>!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}"; if (punct) default_format += "."; ----------------------------------------------------------------------- Summary of changes: lib/citeengines/biblatex-natbib.citeengine | 26 +- lib/citeengines/biblatex.citeengine | 18 +- lib/citeengines/jurabib.citeengine | 2 +- lib/citeengines/natbib.citeengine | 6 +- lib/doc/Customization.lyx | 598 +++++++++++++++++++++++++++- lib/layouts/stdciteformats.inc | 36 ++- src/BiblioInfo.cpp | 201 ++++++++-- src/BiblioInfo.h | 12 +- src/TextClass.cpp | 2 +- 9 files changed, 820 insertions(+), 81 deletions(-) hooks/post-receive -- Repository for new features
