So verwenden Sie \DeclareCiteCommand mit Stil

So verwenden Sie \DeclareCiteCommand mit Stil

Ich versuche etwas Ähnliches wie:Biblatex-Fußnoten am Rand In dem Maße, dass ich ihr Beispiel stehlen kann.

Ich möchte, dass der Text wie gewohnt im Haupttext zitiert wird und dann in der Seitenleiste der Name des Autors, dann das Datum und dann der Name des Werks.

Für die Zwecke dieses MWE verwende ich nur Basislatex \marginpar. (In meiner eigentlichen Arbeit verwende ich Koma-Scrnote-Layer-Material. Aber das spielt keine Rolle, da ich versuche, BibLaTeX zu verstehen.)

MWE:

\documentclass{article}
\usepackage{blindtext}


% bib-file
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
  @book{Knu86,
    author = {Knuth, Donald E.},
    year = {1986},
    title = {The \TeX book},
  }
  @BOOK{KandR,
    AUTHOR    = {Kernighan, Brian W. and Ritchie, Dennis M.},
    TITLE     = {{The C Programming Language Second Edition}},
    PUBLISHER = {Prentice-Hall, Inc.},
    YEAR      = {1988},
}  
\end{filecontents}

\usepackage[]{biblatex}
\addbibresource{\jobname}


\newcommand{\tcite}[1]{
    \textcite{#1}
    \marginpar{
        \citeauthor{#1}, 
        \citeyear{#1}. 
        \citetitle{#1}  
    }
} 

% doc
\begin{document}
\blindtext
\tcite{Knu86}
\blindtext
\tcite{Knu86,KandR}
\blindtext
\end{document}

MSE-Ausgabe

Man kann sehen, dass der blau eingekreiste Text perfekt ist. Aber der rot eingekreiste Text ist falsch, weil er nach Feldern sortiert ist. Der Grund dafür ist natürlich offensichtlich. Mein Befehl verarbeitet nicht pro Taste, sondern alle Tasten zusammen.

Mein aktueller Befehl ist:

\newcommand{\tcite}[1]{
    \textcite{#1}
    \marginpar{
        \citeauthor{#1}, 
        \citeyear{#1}. 
        \citetitle{#1}  
    }
} 

Ich glaube, ich möchte es durch etwas ersetzen, das mit BibLaTeX erstellt wurde.\DeclareCiteCommand

Also habe ich es versucht:

\DeclareCiteCommand{\tcite}
{   % prenote
    \usebibmacro{prenote}%
}
{   %loopcode
    \printnames{author}%
    \marginpar{
        \printnames{author}, 
        \printfield{year}. 
        \printfield{title}  
    }
}
{   %sepcode
    \multicitedelim%
}
{\usebibmacro{postnote}}

Besser arbeiten

Das funktioniert. Wir können sehen, dass sowohl die blauen als auch die roten Kreise in Ordnung sind, soweit sie getrennt sind. Aber ich profitiere nicht von der Formatierung der Autorennamen (z. B. dass sie basierend auf meinen Einstellungen nur auf den Nachnamen gekürzt werden). Und da ich sie nicht verwendet, \textcitesondern nur eingefügt habe printnames{author}, profitiere ich auch dort nicht von der Formatierung.

Das liegt (nehme ich an) daran, dass ich für diese Dinge die Low-Level-Befehle verwendet habe. Wie kann ich High-Level-Befehle verwenden, die Stil/Konfiguration berücksichtigen?

Antwort1

Sie sollten keine hochrangigen Befehle wie \citeauthorin einem verwenden \DeclareCiteCommand. Dies ist mit möglich \citeauthor{\thefield{entrykey}}, aber keine gute Idee.

Verwenden Sie stattdessen einfach die Bibmacros, die für\citeauthor

\newbibmacro{sidecite}{%
  \printnames{labelname}%
  \setunit{\printdelim{nametitledelim}}%
  \printfield[citetitle]{labeltitle}%
  \setunit{\addperiod\space}%
  \printfield{year}}

\textciteDa Sie in Ihrem Beispiel von neu erstellen wollten numeric, habe ich mich für entschieden.

\documentclass{article}
\usepackage{blindtext}


% bib-file
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Knu86,
  author = {Knuth, Donald E.},
  year = {1986},
  title = {The \TeX book},
}
@BOOK{KandR,
  AUTHOR    = {Kernighan, Brian W. and Ritchie, Dennis M.},
  TITLE     = {{The C Programming Language Second Edition}},
  PUBLISHER = {Prentice-Hall, Inc.},
      YEAR      = {1988},
}  
\end{filecontents}

\usepackage[]{biblatex}


\newbibmacro{sidecite}{%
  \printnames{labelname}%
  \setunit{\printdelim{nametitledelim}}%
  \printfield[citetitle]{labeltitle}%
  \setunit{\addperiod\space}%
  \printfield{year}}

\makeatletter
\DeclareCiteCommand{\cbx@textcite}
  {\usebibmacro{textcite:init}}
  {\usebibmacro{citeindex}%
   \usebibmacro{textcite}%
   \setunit{}%
   \marginpar{\usebibmacro{sidecite}}%
   \setunit{%
     \ifbool{cbx:parens}
       {\bibcloseparen\global\boolfalse{cbx:parens}}
       {}%
     \textcitedelim}}
  {}
  {\usebibmacro{textcite:postnote}}
\makeatother

\addbibresource{\jobname.bib}

% doc
\begin{document}
\blindtext
\textcite{Knu86}
\blindtext
\textcite{Knu86,KandR}
\blindtext
\end{document}

numerische Beispielausgabe, beschnitten


Mit authoryearsind die Dinge einfacher

\documentclass{article}
\usepackage{blindtext}


% bib-file
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Knu86,
  author = {Knuth, Donald E.},
  year = {1986},
  title = {The \TeX book},
}
@BOOK{KandR,
  AUTHOR    = {Kernighan, Brian W. and Ritchie, Dennis M.},
  TITLE     = {{The C Programming Language Second Edition}},
  PUBLISHER = {Prentice-Hall, Inc.},
      YEAR      = {1988},
}  
\end{filecontents}

\usepackage[style=authoryear]{biblatex}


\newbibmacro{sidecite}{%
  \printnames{labelname}%
  \setunit{\printdelim{nametitledelim}}%
  \printfield[citetitle]{labeltitle}%
  \setunit{\addperiod\space}%
  \printfield{year}}

\DeclareCiteCommand{\tcite}
  {\usebibmacro{prenote}}%
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}%
   \marginpar{\usebibmacro{sidecite}}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\addbibresource{\jobname.bib}

% doc
\begin{document}
\blindtext
\tcite{Knu86}
\blindtext
\tcite{Knu86,KandR}
\blindtext
\end{document}

AutorJahr MWE

Antwort2

\usebibmacro{<macroname>}ermöglicht Ihnen, ein Bib-Makro in einem aufzurufen DeclareCiteCommand. Es erlaubt Ihnen jedoch nicht, etwas aufzurufen, das selbst mit definiert wurde, DeclareCiteCommandalso kein \usebibmacro{citeauthor}.

Der neue Code könnte also lauten:

\DeclareCiteCommand{\tcite}%
{\usebibmacro{prenote}}% prenote
{   %loopcode
    \usebibmacro{cite}%
    \marginpar{\usebibmacro{cite}, \printfield{title} \\
}
}
{\multicitedelim}% sepcode
{\usebibmacro{postnote}}

Wenn Sie dies mit einem interessanteren Zitierstil in Biblatex ausführen, \usepackage[citestyle=authoryear]{biblatex} erhalten Sie:

Fest

verwandte Informationen