PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Biblatex: Wie prüfen wie ein feld beginnt? Mit \@ifnextchar?



ElEsido
22-07-2009, 22:51
Hallo

Nächstes Problem, nächster thread. :eek:

Ich möchte in meinem Biblatex-Stil je nach dem wie der Eintrag des Feldes postnote beginnt unterschiedliche Resultate erzielen.

Der rot markierte Teil im folgenden Beispiel veranschaulicht es:


\documentclass[11pt, ngerman,oneside]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[style=authortitle-terse]{biblatex}
\usepackage[babel,german=guillemets]{csquotes}
\bibliography{faelle}
\usepackage[acronym=true]{glossaries}
\makeglossaries
\newacronym{ff}{ff.}{fortfolgende}
\glsunset{ff}
\newacronym{rpw}{RPW}{Recht und Politik des Wettebwerbs}
\glsunset{rpw}
\newacronym{aao}{a.a.O.}{Am aufgeführten Ort}
\glsunset{aao}

\begin{filecontents}{faelle.bib}
@jurisdiction{coop-carr,
Author = {Wettbewerbskommission},
Date = {2008.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {4},
Pages = {593 ff.},
Title = {Coop\slash Carre\-four},
Titleaddon = {Ver\-f{\"u}\-gung der Wett\-be\-werbs\-kom\-mis\-sion vom 17.~M{\"a}rz 2008},
Year = {2008}}

@jurisdiction{test,
Author = {Wettbewerbskommission},
Date = {2004.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {3},
Pages = {22 ff.},
Title = {Testfall},
Titleaddon = {Testentscheid},
Year = {2004}}
\end{filecontents}

% Es folgt die Anpassung des Biblatex-Stils.

% Nachfolgend das Makro, das die verschiedenen Felder des Bib-Datensatzes darstellt

\makeatletter
\newbibmacro{footcite-jurisdiction}{%\usebibmacro{bibliorpw}
\iffieldundef{shorttitle}{\printfield{title}}{\pri ntfield{shorttitle}}\addcomma\addspace
\iffieldundef{howpublished}{%
\printfield{journaltitle}%
\printfield{year}\addslash
\iffieldundef{issue}{}{\thefield{issue}}%
\iffieldundef{number}{}{\thefield{number}}%
}{\printfield{howpublished}}%
% Test if postnote contains pages
\iffieldundef{postnote}
{\addcomma\printfield{pages}}
{\savefield{postnote}{\bbx@tempa}%
\expandafter\ifnumerals\expandafter{\bbx@tempa}
{\addspace(\thefield{pages})}
{%
%Wenn das postnote-Feld mit "\pno" oder "\ppno" beginnt { DANN DIES }{ SONST DAS }
}}
% Test end
}

\DeclareCiteCommand{\footcite}[\mkbibfootnote]
{\bibsentence
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\ifthenelse{\equal{\thefield{entrytype}}{jurisdict ion}}{\usebibmacro{footcite-jurisdiction}}{\ifthenelse{\equal{\thefield{entryt ype}}{legislation}}{\usebibmacro{footcite-jurisdiction}}{\usebibmacro{cite}}}}
{\multicitedelim}
{\usebibmacro{postnote}}
\makeatother


\begin{document}

Dies ist der Fall ohne postnote-Feld\footcite{coop-carr}\\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600-700]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[\pno 600e]{test}. \\
Dies ist der Fall mit mehreren Seitenzahlen im postnote-Feld\footcite[\ppno600f-600f]{coop-carr}. \\
Dies ist der Fall mit einer Nicht-Seitenzahl im postnote-Feld\footcite[Erwägung 3]{coop-carr}.
\end{document}

Kann jemand weiterhelfen?
Danke!

mechanicus
22-07-2009, 23:21
Hallo,

so richtig hab eich euren Thread nicht verfolgt.

Wenn ich das Paket xstring nehme, würde evtl. das klappen:


\IfBeginWith{\bbx@tempa}{\pno}%
{~\textbf{POSTNOTE mit PNO}}%
{\IfBeginWith{\bbx@tempa}{\ppno}%
{~\textbf{POSTNOTE mit PPNO}}{~\textbf{POSTNOTE OHNE WAS}}
}
% \IfBeginWith{\bbx@tempa}{\ppno}{PNO ja}{PNO nein}%Wenn das postnote-Feld mit "\pno" oder "\ppno" beginnt { DANN DIES }{ SONST DAS }




\documentclass[11pt, ngerman,oneside]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[style=authortitle-terse]{biblatex}
\usepackage[babel,german=guillemets]{csquotes}
\bibliography{faelle}
\usepackage[acronym=true]{glossaries}
\makeglossaries
\newacronym{ff}{ff.}{fortfolgende}
\glsunset{ff}
\newacronym{rpw}{RPW}{Recht und Politik des Wettebwerbs}
\glsunset{rpw}
\newacronym{aao}{a.a.O.}{Am aufgeführten Ort}
\glsunset{aao}
\usepackage{xstring}
\begin{filecontents}{faelle.bib}
@jurisdiction{coop-carr,
Author = {Wettbewerbskommission},
Date = {2008.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {4},
Pages = {593 ff.},
Title = {Coop\slash Carre\-four},
Titleaddon = {Ver\-f{\"u}\-gung der Wett\-be\-werbs\-kom\-mis\-sion vom 17.~M{\"a}rz 2008},
Year = {2008}}

@jurisdiction{test,
Author = {Wettbewerbskommission},
Date = {2004.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {3},
Pages = {22 ff.},
Title = {Testfall},
Titleaddon = {Testentscheid},
Year = {2004}}
\end{filecontents}

% Es folgt die Anpassung des Biblatex-Stils.

% Nachfolgend das Makro, das die verschiedenen Felder des Bib-Datensatzes darstellt

\makeatletter
\newbibmacro{footcite-jurisdiction}{%\usebibmacro{bibliorpw}
\iffieldundef{shorttitle}{\printfield{title}}{\pri ntfield{shorttitle}}\addcomma\addspace
\iffieldundef{howpublished}{%
\printfield{journaltitle}%
\printfield{year}\addslash
\iffieldundef{issue}{}{\thefield{issue}}%
\iffieldundef{number}{}{\thefield{number}}%
}{\printfield{howpublished}}%
% Test if postnote contains pages
\iffieldundef{postnote}
{\addcomma\printfield{pages}}
{\savefield{postnote}{\bbx@tempa}%
\expandafter\ifnumerals\expandafter{\bbx@tempa}
{\addspace(\thefield{pages})}
{%
\IfBeginWith{\bbx@tempa}{\pno}%
{~\textbf{POSTNOTE mit PNO}}%
{\IfBeginWith{\bbx@tempa}{\ppno}%
{~\textbf{POSTNOTE mit PPNO}}{~\textbf{POSTNOTE OHNE WAS}}
}
% \IfBeginWith{\bbx@tempa}{\ppno}{PNO ja}{PNO nein}%Wenn das postnote-Feld mit "\pno" oder "\ppno" beginnt { DANN DIES }{ SONST DAS }
}}
% Test end
}

\DeclareCiteCommand{\footcite}[\mkbibfootnote]
{\bibsentence
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\ifthenelse{\equal{\thefield{entrytype}}{jurisdict ion}}{\usebibmacro{footcite-jurisdiction}}{\ifthenelse{\equal{\thefield{entryt ype}}{legislation}}{\usebibmacro{footcite-jurisdiction}}{\usebibmacro{cite}}}}
{\multicitedelim}
{\usebibmacro{postnote}}
\makeatother


\begin{document}

Dies ist der Fall ohne postnote-Feld\footcite{coop-carr}\\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600-700]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[\pno 600e]{test}. \\
Dies ist der Fall mit mehreren Seitenzahlen im postnote-Feld\footcite[\ppno600f-600f]{coop-carr}. \\
Dies ist der Fall mit einer Nicht-Seitenzahl im postnote-Feld\footcite[Erwägung 3]{coop-carr}.
\end{document}

Gruß
Marco

ElEsido
23-07-2009, 09:56
Super, vielen Dank!! :)

ElEsido
23-07-2009, 11:48
Auch dies funktioniert nur im Miminalbeispiel, aber nicht im tatsächlichen Test. der Grund ist, dass ich einige Zitate mit

\footcite[\protect\gls|{e} 12]{kuerzel}
habe und dieses \protect die Sache durcheinander zu bringen scheint.

Weiss jemand, wie ich das lösen kann? (Evtl. ohne Verwendung eines zusätzlichen Paketes?)

Komplettes Beispiel:


\documentclass[11pt, ngerman,oneside]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[style=authortitle-terse]{biblatex}
\usepackage[babel,german=guillemets]{csquotes}
\bibliography{faelle}
\usepackage[acronym=true]{glossaries}
\makeglossaries
\newacronym{ff}{ff.}{fortfolgende}
\glsunset{ff}
\newacronym{rpw}{RPW}{Recht und Politik des Wettebwerbs}
\glsunset{rpw}
\newacronym{aao}{a.a.O.}{Am aufgeführten Ort}
\glsunset{aao}
\newacronym{rz}{RZ}{Randziffer}
\glsunset{rz}
\newacronym{e}{E.}{Erwägung}
\glsunset{e}
\usepackage{xstring}
\begin{filecontents}{faelle.bib}
@jurisdiction{coop-carr,
Author = {Wettbewerbskommission},
Date = {2008.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {4},
Pages = {593 ff.},
Title = {Coop\slash Carre\-four},
Titleaddon = {Ver\-f{\"u}\-gung der Wett\-be\-werbs\-kom\-mis\-sion vom 17.~M{\"a}rz 2008},
Year = {2008}}

@jurisdiction{test,
Author = {Wettbewerbskommission},
Date = {2004.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {3},
Pages = {22 ff.},
Title = {Testfall},
Titleaddon = {Testentscheid},
Year = {2004}}

\end{filecontents}

% Es folgt die Anpassung des Biblatex-Stils.

% Nachfolgend das Makro, das die verschiedenen Felder des Bib-Datensatzes darstellt
\makeatletter
\newbibmacro{footcite-jurisdiction}{%\usebibmacro{bibliorpw}
\iffieldundef{shorttitle}{\printfield{title}}{\pri ntfield{shorttitle}}\addcomma\addspace
\iffieldundef{howpublished}{%
\printfield{journaltitle}%
\printfield{year}\addslash
\iffieldundef{issue}{}{\thefield{issue}}%
\iffieldundef{number}{}{\thefield{number}}%
}{\printfield{howpublished}}%
% Begin of test if postnote contains pages
\iffieldundef{postnote}
{\addcomma\addspace\printfield{pages}}
{\savefield{postnote}{\bbx@tempa}%
\expandafter\ifnumerals\expandafter{\bbx@tempa}
{\addspace(\thefield{pages})}
{% Test ob pno oder ppno
\IfBeginWith{\bbx@tempa}{\pno}%
{\addspace(\thefield{pages})}%
{\IfBeginWith{\bbx@tempa}{\ppno}%
{\addspace(\thefield{pages})}{\addcomma\addspace\p rintfield{pages}}
%Ende Test ob pno oder ppno
}
}}
% End of test if postnote contains pages
}


\DeclareCiteCommand{\footcite}[\mkbibfootnote]
{\bibsentence
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\ifthenelse{\equal{\thefield{entrytype}}{jurisdict ion}}{\usebibmacro{footcite-jurisdiction}}{\ifthenelse{\equal{\thefield{entryt ype}}{legislation}}{\usebibmacro{footcite-jurisdiction}}{\usebibmacro{cite}}}}
{\multicitedelim}
{\usebibmacro{postnote}}
\makeatother


\begin{document}
Dies ist der Fall ohne postnote-Feld\footcite{coop-carr}\\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600-700]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[\pno 600e]{test}. \\
Dies ist der Fall mit mehreren Seitenzahlen im postnote-Feld\footcite[\ppno600f-600f]{coop-carr}. \\
Dies ist der Fall ohne postnote-Feld\footcite{coop-carr}\\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[\protect\gls{e} 12]{coop-carr}.
\end{document}

ElEsido
23-07-2009, 12:36
Habe die Lösung zusammengesetzt, vielleicht hilft es mal jemandem.

Danke an alle, die mit Lösungen und Anregungen oder Vorschlägen, die mich auf eine Spur gebracht haben, dazu beigetragen haben; insbesondere Ulrike und mechanicus!

Anstelle des Paketes xstring zu verwenden, wird das folgende Makro definiert:

\makeatletter
\newcommand\@IfBeginWith[2]{%
\def\@test@IfFirstIs##1#2##2\@nil{%
\ifx\@empty##1\@empty%
\expandafter\@firstoftwo%
\else%
\expandafter\@secondoftwo%
\fi%
}%
\@test@IfFirstIs#1#2\@nil%
}
\makeatother

Der Test läuft dann wie folgt ab:



\iffieldundef{postnote}
{\addcomma\addspace\printfield{pages}}
{\savefield{postnote}{\bbx@tempa}%
\expandafter\ifnumerals\expandafter{\bbx@tempa}
{\addspace(\thefield{pages})}
{% Test if begins with \protect
\expandafter\@IfBeginWith\expandafter{\bbx@tempa}{ \protect}
{\addcomma\addspace\printfield{pages}}%
{%Test if \pno
\expandafter\@IfBeginWith\expandafter{\bbx@tempa}{ \pno}
{\addspace(\thefield{pages})}
{% Test if \ppno
\expandafter\@IfBeginWith\expandafter{\bbx@tempa}{ \ppno}
{\addspace(\thefield{pages})}
{\addcomma\addspace\printfield{pages}
}}}}}

Das lauffähige Beispiel:


\documentclass[11pt, ngerman,oneside]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[style=authortitle-terse]{biblatex}
\usepackage[babel,german=guillemets]{csquotes}
\bibliography{faelle}
\usepackage[acronym=true]{glossaries}
\makeglossaries
\newacronym{ff}{ff.}{fortfolgende}
\glsunset{ff}
\newacronym{rpw}{RPW}{Recht und Politik des Wettebwerbs}
\glsunset{rpw}
\newacronym{e}{E.}{Erwägung}
\glsunset{e}
\begin{filecontents}{faelle.bib}
@jurisdiction{coop-carr,
Author = {Wettbewerbskommission},
Date = {2008.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {4},
Pages = {593 ff.},
Title = {Coop\slash Carre\-four},
Titleaddon = {Ver\-f{\"u}\-gung der Wett\-be\-werbs\-kom\-mis\-sion vom 17.~M{\"a}rz 2008},
Year = {2008}}

@jurisdiction{test,
Author = {Wettbewerbskommission},
Date = {2004.03.17},
Institution = {Weko},
Journaltitle = {\gls{rpw}},
Number = {3},
Pages = {22 ff.},
Title = {Testfall},
Titleaddon = {Testentscheid},
Year = {2004}}

\end{filecontents}

\makeatletter
\newcommand\@IfBeginWith[2]{%
\def\@test@IfFirstIs##1#2##2\@nil{%
\ifx\@empty##1\@empty%
\expandafter\@firstoftwo%
\else%
\expandafter\@secondoftwo%
\fi%
}%
\@test@IfFirstIs#1#2\@nil%
}

% Es folgt die Anpassung des Biblatex-Stils.

% Nachfolgend das Makro, das die verschiedenen Felder des Bib-Datensatzes darstellt

\newbibmacro{footcite-jurisdiction}{%\usebibmacro{bibliorpw}
\iffieldundef{shorttitle}{\printfield{title}}{\pri ntfield{shorttitle}}\addcomma\addspace
\iffieldundef{howpublished}{%
\printfield{journaltitle}%
\printfield{year}\addslash
\iffieldundef{issue}{}{\thefield{issue}}%
\iffieldundef{number}{}{\thefield{number}}%
}{\printfield{howpublished}}%
% Begin of test if postnote contains pages
\iffieldundef{postnote}
{\addcomma\addspace\printfield{pages}}
{\savefield{postnote}{\bbx@tempa}%
\expandafter\ifnumerals\expandafter{\bbx@tempa}
{\addspace(\thefield{pages})}
{% Test if begins with \protect
\expandafter\@IfBeginWith\expandafter{\bbx@tempa}{ \protect}
{\addcomma\addspace\printfield{pages}}%
{%Test if \pno
\expandafter\@IfBeginWith\expandafter{\bbx@tempa}{ \pno}
{\addspace(\thefield{pages})}
{% Test if \ppno
\expandafter\@IfBeginWith\expandafter{\bbx@tempa}{ \ppno}
{\addspace(\thefield{pages})}
{\addcomma\addspace\printfield{pages}
}}}}}
}


\DeclareCiteCommand{\footcite}[\mkbibfootnote]
{\bibsentence
\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\ifthenelse{\equal{\thefield{entrytype}}{jurisdict ion}}{\usebibmacro{footcite-jurisdiction}}{\ifthenelse{\equal{\thefield{entryt ype}}{legislation}}{\usebibmacro{footcite-jurisdiction}}{\usebibmacro{cite}}}}
{\multicitedelim}
{\usebibmacro{postnote}}
\makeatother


\begin{document}
Dies ist der Fall ohne postnote-Feld\footcite{coop-carr}\\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[600-700]{coop-carr}. \\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[\pno 600e]{test}. \\
Dies ist der Fall mit mehreren Seitenzahlen im postnote-Feld\footcite[\ppno600f-600f]{coop-carr}. \\
Dies ist der Fall ohne postnote-Feld\footcite[a.a.O]{coop-carr}\\
Dies ist der Fall mit einer Seitenzahl im postnote-Feld\footcite[\protect\gls{e} 12]{coop-carr}.
\end{document}