Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sorting bei \cites #81

Open
LukasCBossert opened this issue Mar 28, 2016 · 15 comments
Open

sorting bei \cites #81

LukasCBossert opened this issue Mar 28, 2016 · 15 comments
Assignees

Comments

@LukasCBossert
Copy link
Owner

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
Copy link
Contributor

moewew commented Mar 28, 2016

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
Copy link
Owner Author

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. <argument> \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
Copy link
Contributor

moewew commented Mar 28, 2016

@LukasCBossert
Copy link
Owner Author

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
Copy link
Owner Author

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
Copy link
Contributor

moewew commented Mar 28, 2016

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
Copy link
Owner Author

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
Copy link
Contributor

moewew commented Mar 28, 2016

War es schon plk/biblatex#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
Copy link
Owner Author

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

@LukasCBossert LukasCBossert added this to the späteres Update milestone Jun 4, 2016
@moewew
Copy link
Contributor

moewew commented Sep 15, 2016

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
Copy link
Owner Author

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
Copy link
Contributor

moewew commented Sep 15, 2016

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
Copy link
Owner Author

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
Copy link
Contributor

moewew commented Sep 16, 2016

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
Copy link
Owner Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants