LukasCBossert / biblatex-archaeologie

This ci­ta­tion-style cov­ers the ci­ta­tion and bib­li­og­ra­phy rules of the Ger­man Ar­chae­ol­ogical In­sti­tute. Var­i­ous op­tions are avail­able to change and ad­just the out­come ac­cord­ing to one’s own pref­er­ences.
http://biblatex-archaeologie.texografie.de
10 stars 3 forks source link

sorting bei \cites #81

Open LukasCBossert opened 8 years ago

LukasCBossert commented 8 years ago

Ich denke, dass es kein archaeologie-Stil spezifisches Problem ist, aber die Sortierung bei \cites{ab}{cd} funktioniert (bei keinem Stil?) nicht.

\documentclass[german,english,ngerman]{article}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=archaeologie,backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}%
\begin{document}
\cite{massa,knuth:ct,pines,iliad}\\
\cites{massa}{knuth:ct}{pines}{iliad}\\
\cites(vgl.)(){massa}{knuth:ct}{pines}{iliad}\\
\cites{massa}[23]{knuth:ct}[vgl.][212]{pines}[s.][]{iliad}\\
\parencites(s.)(){massa}[23]{knuth:ct}{pines}{iliad}
\end{document}

führt zu:

screen shot 2016-03-28 at 16 38 46

Dabei sollte aber nach Name, Jahr, Titel sortiert werden (wie in der .cbx angegeben).

Kann man das lösen? @moewew ?

moewew commented 8 years ago

Die multicite-Befehle können über Multi-Argumente hinweg eigentlich nicht sortieren, das hängt damit zusammen wie die Befehle implementiert sind. Wenn es denn unbedingt sein muss, dann gibt es auf TeX.SX Sorting citations using \cites command in biblatex und zur Erweiterung Biblatex: Sorting citations in qualified citation list \parencites.

Ich weiß gerade nicht, ob \textcites vielleicht schon automatisch sortieren kann, aber das kann man ja rausfinden.

LukasCBossert commented 8 years ago

Danke für die schnelle Antwort. Schade, dass das (noch?) nicht implementiert ist. Ich habe die auf TeX.SX vorgestellten Lösungen zwar eingebaut, aber dennoch kommen Fehlermeldungen. `! Undefined control sequence.

\cbx@sortkeys` ``` \documentclass[german,english,ngerman]{article} \usepackage{babel} \usepackage{csquotes} \usepackage[backend=biber,style=archaeologie,sorting=nyt]{biblatex} \makeatletter \DeclareMultiCiteCommand{\cbx@parencites}[\mkbibparens]{\parencite}{\multicitedelim} \DeclareMultiCiteCommand{\parencites}[\cbx@cite@wrapper\cbx@parencites]{\cbx@cite}{} \DeclareMultiCiteCommand{\cbx@textcites}{\textcite}{\multicitedelim} \DeclareMultiCiteCommand{\textcites}[\cbx@cite@wrapper\cbx@textcites]{\cbx@cite}{} % original definition of \cites \DeclareMultiCiteCommand{\cbx@cites}{\cite}{\multicitedelim} % new definition \DeclareMultiCiteCommand{\cites}[\cbx@cite@wrapper\cbx@cites]{\cbx@cite}{} % first pass saves keys, prenotes, postnotes \DeclareCiteCommand{\cbx@cite} {\csxdef{prenote:\thefield{entrykey}}{\thefield{prenote}}} {\listxadd\cbx@savekeys{\thefield{entrykey}}} {} {\csxdef{postnote:\thefield{entrykey}}{\thefield{postnote}}} % second pass outputs sorted citation list \newrobustcmd{\cbx@cite@wrapper}[2]{% \def\cbx@savekeys{}% \def\cbx@citecall{#1}% #2\cbx@sortkeysinit\cbx@citesort\cbx@citecall} % internal list of saved keys => sorted argument list \def\cbx@citesort{% \def\do##1{% \ifinlist{##1}{\cbx@savekeys} {\protected@xappto\cbx@citecall{% [\csuse{prenote:##1}][\csuse{postnote:##1}]{##1}}} {}}% \dolistloop{\cbx@sortkeys}} % internal list of sorted entry keys \def\cbx@sortkeysinit{% \ifcsundef{blx@sort@\the\c@refsection} {\global\letcs{\cbx@sortkeys}% {blx@slists@\the\c@refsection @entry@\blx@sorting}}% Biber {\global\letcs{\cbx@sortkeys}{blx@sort@\the\c@refsection}}}% BibTeX \def\cbx@sortkeys{} \makeatother \addbibresource{biblatex-examples.bib}% \begin{document} \cite{massa,knuth:ct,pines,iliad}\\ \cites{massa}{knuth:ct}{pines}{iliad}\\ \cites(vgl.)(){massa}{knuth:ct}{pines}{iliad}\\ \cites{massa}[23]{knuth:ct}[vgl.][212]{pines}[s.][]{iliad}\\ \parencites(s.)(){massa}[23]{knuth:ct}{pines}{iliad}\\ \textcites(s.)(){massa}[23]{knuth:ct}{pines}{iliad} \end{document} ```
moewew commented 8 years ago

Könnte das mit http://tex.stackexchange.com/questions/65809/sorting-citations-using-cites-command-in-biblatex#comment375993_70183 gelöst sein?

LukasCBossert commented 8 years ago

Hm, wo ersetze ich den biber-spezifischen Code? Wenn ich direkt vor \addbibresource setze, kommt

Package biblatex Info: Redefining '\cites' on input line 13.
! You can't use `\unhbox' after \the.
\leavevmode ->\unhbox
\voidb@x
l.47 ...sts@\the\c@refsection @entry@\blx@sorting}
{}{\global\letcs{\cbx@sort...
I'm forgetting what you said and using zero instead.
! Missing \endcsname inserted.
LukasCBossert commented 8 years ago

Ok, gefunden und eingebaut.

% internal list of sorted entry keys
\def\cbx@sortkeysinit{%
  \ifcsundef{blx@sort@\the\c@refsection}
    {\ifcsundef{blx@slists@\the\c@refsection @entry@\blx@sorting}{}{\global\letcs{\cbx@sortkeys}{blx@slists@\the\c@refsection @entry@\blx@sorting}}}% Biber
    {\global\letcs{\cbx@sortkeys}{blx@sort@\the\c@refsection}}}% BibTeX
\def\cbx@sortkeys{}

Es gibt zwar keine Fehlermeldung mehr, aber dafür auch kein Ergebnis:

screen shot 2016-03-28 at 18 55 47

moewew commented 8 years ago

Tja, vielleicht haben sich in den letzten paar Jahren (und besonders den letzten paar Monaten) die Innereien von biblatex so geändert, dass es jetzt nicht mehr funktioniert.

In biblatex 3.3 wird das Sortieren jetzt von der refsection übernommen, das müsste wohl angepasst werden. Ich habe jetzt gerade nicht so die Zeit, mir das in aller Tiefe zu Gemüte zu führen, aber ich denke, dass sollte möglich sein.

LukasCBossert commented 8 years ago

hm, ok - vielleicht gibt es "irgendwann" eine Lösung. Solange muss wohl händisch sortiert werden. Aber vielleicht kann das auf die Issue-Liste von biblatex?! Besten Dank für die Hilfe!

moewew commented 8 years ago

War es schon https://github.com/plk/biblatex/issues/214, Audrey schrieb damals, dass eine vernünftige Lösung wohl nur schwer in biblatex direkt implementiert werden könnte, da dabei einiges umgeworfen werden müsste.

LukasCBossert commented 8 years ago

oh - ich sollte wohl besser nachschauen... Ok, dann ist/bleibt es ein bekanntes Problem.

moewew commented 7 years ago

Mit den Anpassungen in http://tex.stackexchange.com/q/314199/35864 funktioniert der Code in http://tex.stackexchange.com/q/65809/35864 mit biblatex 3.5 zumindest wieder. Es gelten aber noch immer die genannten Einschränkungen, das die Multi-Notes verloren gehen.

LukasCBossert commented 7 years ago

Seit wann ist biblatex 3.5 raus? Es hat bei mir noch nicht aktualisiert.

Wäre dies dann ein passendes MWE?

\documentclass[german,english,ngerman]{article}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[                    %% use  for bibliography
backend=biber,
%style=../biblatex-archaeologie/archaeologie,
style=archaeologie,
    lstabbrv,
    lstlocations,
    lstpublishers,
    publisher,
        sortcites=true,
    sorting=ynt
    ]{biblatex}

\makeatletter
% original definition of \cites
\DeclareMultiCiteCommand{\cbx@cites}{\cite}{\multicitedelim}

% new definition
\DeclareMultiCiteCommand{\cites}[\cbx@cite@wrapper\cbx@cites]{\cbx@cite}{}

% first pass saves keys, prenotes, postnotes
\DeclareCiteCommand{\cbx@cite}
  {\csxdef{prenote:\thefield{entrykey}}{\thefield{prenote}}}
  {\listxadd\cbx@savekeys{\thefield{entrykey}}}
  {}
  {\csxdef{postnote:\thefield{entrykey}}{\thefield{postnote}}}

% second pass outputs sorted citation list
\newrobustcmd{\cbx@cite@wrapper}[2]{%
  \def\cbx@savekeys{}%
  \def\cbx@citecall{#1}%
  #2\cbx@sortkeysinit\cbx@citesort\cbx@citecall}

% internal list of saved keys => sorted argument list
\def\cbx@citesort{%
  \def\do##1{%
    \ifinlist{##1}{\cbx@savekeys}
      {\protected@xappto\cbx@citecall{%
         [\csuse{prenote:##1}][\csuse{postnote:##1}]{##1}}}
      {}}%
  \dolistloop{\cbx@sortkeys}}

% internal list of sorted entry keys
\def\cbx@sortkeysinit{% 
\ifcsdef{blx@slist@centry@\the\c@refsection @\blx@refcontext@context} {\global\letcs{\cbx@sortkeys}{blx@slist@centry@\the\c@refsec‌​tion %
@\blx@refcontext@context}}{}}
\makeatother

\addbibresource{biblatex-examples.bib}
\begin{document}
\cite{massa,knuth:ct,pines,iliad}\\
\cites{massa}{knuth:ct}{pines}{iliad}\\
\cites(vgl.)(){massa}{knuth:ct}{pines}{iliad}\\
\cites{massa}[23]{knuth:ct}[vgl.][212]{pines}[s.][]{iliad}\\
\parencites(s.)(){massa}[23]{knuth:ct}{pines}{iliad}\\
\textcites(s.)(){massa}[23]{knuth:ct}{pines}{iliad}
\end{document}

Was meinst du damit, dass die Multi-Notes verloren gehen?

moewew commented 7 years ago

Bis auf das Kommentar-bei-TeX.SX-Copy-and-Paste-Problem (manchmal schleichen sich merkwürdige Zeichen ein, hier im \the\c@refsec‌​tion vor dem %) und das fehlende \def\cbx@sortkeys{} sieht das gut, aus.

Bei mir wäre es

\documentclass[german,english,ngerman]{article}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[                    %% use  for bibliography
backend=biber,
%style=../biblatex-archaeologie/archaeologie,
style=archaeologie,
    lstabbrv,
    lstlocations,
    lstpublishers,
    publisher,
        sortcites=true,
    sorting=ynt
    ]{biblatex}

\makeatletter
% original definition of \cites
\DeclareMultiCiteCommand{\cbx@cites}{\cite}{\multicitedelim}

% new definition
\DeclareMultiCiteCommand{\cites}[\cbx@cite@wrapper\cbx@cites]{\cbx@cite}{}

% first pass saves keys, prenotes, postnotes
\DeclareCiteCommand{\cbx@cite}
  {\csxdef{prenote:\thefield{entrykey}}{\thefield{prenote}}}
  {\listxadd\cbx@savekeys{\thefield{entrykey}}}
  {}
  {\csxdef{postnote:\thefield{entrykey}}{\thefield{postnote}}}

% second pass outputs sorted citation list
\newrobustcmd{\cbx@cite@wrapper}[2]{%
  \def\cbx@savekeys{}%
  \def\cbx@citecall{#1}%
  #2\cbx@sortkeysinit\cbx@citesort\cbx@citecall}

% internal list of saved keys => sorted argument list
\def\cbx@citesort{%
  \def\do##1{%
    \ifinlist{##1}{\cbx@savekeys}
      {\protected@xappto\cbx@citecall{%
         [\csuse{prenote:##1}][\csuse{postnote:##1}]{##1}}}
      {}}%
  \dolistloop{\cbx@sortkeys}}

% internal list of sorted entry keys
\def\cbx@sortkeysinit{% 
  \ifcsdef{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}
    {\global\letcs{\cbx@sortkeys}{blx@slist@centry@\the\c@refsection @\blx@refcontext@context}}
    {}}

\def\cbx@sortkeys{}
\makeatother

\addbibresource{biblatex-examples.bib}
\begin{document}
\cite{massa,knuth:ct,pines,iliad}\\
\cites{massa}{knuth:ct}{pines}{iliad}\\
\cites(vgl.)(){massa}{knuth:ct}{pines}{iliad}\\
\cites(A)(B){massa}[23]{knuth:ct}[vgl.][212]{pines}[s.][]{iliad}\\
\parencites(A)(B){massa}[23]{knuth:ct}{pines}{iliad}\\
\textcites(A)(B){massa}[23]{knuth:ct}{pines}{iliad}
\end{document}

Schau dir genau an, wie \cites das "A" und "B" verhunzt. Das ist das, was ich meinte, das steht als Warnung am Ende von Audreys Antwort.

bibilatex 3.5 ist seit etwa einer Woche draußen und inzwischen auch bei MikTeX und TeX live.

LukasCBossert commented 7 years ago

Laut TeXLive sind meine Pakete alle aktuell, aber die log-file sagt: Package: biblatex 2016/05/14 v3.4 programmable bibliographies (PK/JW/AB), also habe ich noch version 3.4 drauf?

Dennoch: Mit deinem verbesserten MWE läuft es durch. So wie ich das sehe, ist das Ergebnis sehr durchwachsen, und manchmal klappt es mit A und B wie bspw. bei parencites und textcites, dafür sind die Einträge bei diesen nicht mehr sortiert.

bildschirmfoto 2016-09-15 um 22 08 03

moewew commented 7 years ago

Die aktuelle Version ist 3.5 (https://www.ctan.org/pkg/biblatex), allerdings scheint TeX live da gerade etwas hinterher zu sein. Das sollte aber bald ins Lot kommen, solange musst Du halt noch warten.

Beachte, dass mit Version 3.5 die Datumsausgabe umgestellt wurde, es kann sein, dass Du da Einiges anpassen musst.

Wenn Du Dir den Code genau ansiehst, wirst Du feststellen, dass er nur \cites ändert, \parencites und \textcites werden nicht modifiziert. Dementsprechend sortiert auch nur \cites die Argumente, vergeigt aber die Multi-Notes; während die anderen beiden nicht sortieren, aber die Notes dahaben. Siehe auch http://tex.stackexchange.com/q/271307/35864

Wie dem auch sei, ich wollte nur darauf hinweisen, dass es theoretisch auch mit den neueren Versionen möglich ist die Multicites zu sortieren, empfehlen würde ich es immer noch nicht.

LukasCBossert commented 7 years ago

Gerade habe ich auf biblatex 3.5 aktualisierst. Werde das also jetzt mal testen. Wenn es aber noch nicht 'wirklich' klappt, dann lohnt sich die Implementierung in archaeologie.cbx nicht.