Как напечатать только редактора и заголовок родительской записи в дочерней записи в библиографии

Как напечатать только редактора и заголовок родительской записи в дочерней записи в библиографии

В моей библиографии я хочупечатать только имя редактора и название родительской работы в дочерней записи, если у родителя есть по крайней мере два потомка, в то время как теперь я получаю полную родительскую запись в каждой отдельной дочерней записи. Родительская запись должна быть затем напечатана полностью под именем редактора. Поэтому вместо

Test Author. “Testing the second Title”. In: My Proceedings. Ed. by Senor Editor and Senora Editora. Any Publisher, 2013, pp. 10–20.

Test Author. “Testing the Title”. In: My Proceedings. Ed. by Senor Editor and Senora Editora. Any Publisher, 2013, pp. 1–10.

Senor Editor and Senora Editora, eds. My Proceedings. Any Publisher, 2013.

Я хотел бы получить следующее:

Test Author: “Testing the second Title”. In: Senor Editor and Senora Editora, eds., *My Proceedings*, pp. 10–20.

[Test Author. “Testing the Title”. In: Senor Editor and Senora Editora, eds., *My Proceedings*, pp. 1–10.

Senor Editor and Senora Editora, eds. *My Proceedings*. Any Publisher, 2013.

Я знаю, что на аналогичный вопрос уже был дан ответ.здесь, но я просто не могу понять, как мне манипулировать предложенным там кодом, чтобы он выводил редактора и название. Мне удалось заменить буквенную метку на название сборника (или трудов, или книги) с помощью

\printfield{labeltitle}

вместо

\printfield{labelalpha}

но ни то, ни другое

\printfield{labelname}

ни

\printlist{labelname}

Кажется, работает, чтобы получить имя редактора. Есть идеи, что здесь не так? Я добавляю MWE:

\documentclass[]{scrartcl}

\usepackage[backend=biber,style=authortitle-icomp]{biblatex}
\usepackage{filecontents}

\begin{filecontents}{my.bib}
@incollection{inproc1,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {1--10},
    Title = {Testing the Title}}

@incollection{inproc2,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {10--20},
    Title = {Testing the second Title}}

@collection{proc,
    Editor = {Senor Editor and Senora Editora},
    Publisher = {Any Publisher},
    Title = {My Proceedings},
    Year = {2013}}

@inproceedings{inproc3,
    Author  = {Nother Author},
    Publisher = {Nother Publisher},
    Title   = {In Some Other Proceedings},
    Maintitle = {Main Title of Other Proceedings},
    Year     = {2001},
}
\end{filecontents}


\DeclareBibliographyDriver{incollection}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{in:}%
  \iffieldundef{crossref}
    {\usebibmacro{crossref:full}}
    {\usebibmacro{crossref:label}}
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \iffieldundef{crossref}
    {\usebibmacro{crossref:extrainfo}}
    {}
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

\newbibmacro{crossref:full}{%
    \usebibmacro{maintitle+booktitle}%
  \newunit\newblock
  \usebibmacro{event+venue+date}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \iffieldundef{maintitle}
    {\printfield{volume}%
     \printfield{part}}
    {}%
  \newunit
  \printfield{volumes}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \printlist{organization}%
  \newunit
  \usebibmacro{publisher+location+date}}

\newbibmacro{crossref:label}{%
  \entrydata{\strfield{crossref}}
     {\printtext{
        {\printfield{labeltitle}\printfield{extratitle}}}}}

\addbibresource{my.bib}

\begin{document}

Test \cite{inproc1} and \cite{inproc2} and \cite{inproc3}
\printbibliography
\end{document}

И еще один маленький момент (слишком связанный и незначительный для дополнительного вопроса): как сделать так, чтобы название коллекции в дочерней записи отображалось курсивом?

Спасибо за помощь. Поскольку это мой первый пост на TeX Stack Exchange, пожалуйста, не стесняйтесь поправлять меня, если я выразился непонятно или нарушил какие-либо правила!

решение1

Чтобы распечатать нужные вам имена \printnames{labelname}.

Если вы хотите labelnameнапечатать полные имена, то вам понадобится \DeclareNameAlias{labelname}{given-family}.

Чтобы получить (ред./ред.) после labelname, добавьте \setunit*{\addspace}\printtext[parens]{editorstrg}.

Чтобы получить (ed./eds.) после основного редактора в entry proc, вам нужно пропатчить bbx:editorмакрос, используя xpatch, например так:

\xpatchbibmacro{bbx:editor}
  {\usebibmacro{#1}}
  {\setunit{\addspace}\printtext[parens]{\usebibmacro{#1}}}
  {}{}

Чтобы получить курсив labeltitle, можно использовать , \printfield[title]{labeltitle}так как формат заголовка по умолчанию — курсив.

Итак, ваш crossref:labelмакрос становится таким:

\newbibmacro{crossref:label}{%
  \entrydata{\strfield{crossref}}
     {\DeclareNameAlias{labelname}{given-family}%
      \printnames{labelname}%
      \setunit*{\addspace}%
      \printtext[parens]{\usebibmacro{editorstrg}}%
      \setunit*{\addcomma\space}%
      \printfield[title]{labeltitle}}}

Примечание:Это очень специфично для вашего вопроса. Требуется больше настроек для обработки случаев, когда labelname не относится к редактору (например, переводчику).

Вот полный MWE и выходные данные:

\documentclass[]{scrartcl}

\usepackage{xpatch}
\usepackage[backend=biber,style=authortitle-icomp]{biblatex}
\usepackage{filecontents}

\begin{filecontents}{my.bib}
@incollection{inproc1,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {1--10},
    Title = {Testing the Title}}

@incollection{inproc2,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {10--20},
    Title = {Testing the second Title}}

@collection{proc,
    Editor = {Senor Editor and Senora Editora},
    Publisher = {Any Publisher},
    Title = {My Proceedings},
    Year = {2013}}

@inproceedings{inproc3,
    Author  = {Nother Author},
    Publisher = {Nother Publisher},
    Title   = {In Some Other Proceedings},
    Maintitle = {Main Title of Other Proceedings},
    Year     = {2001},
}
\end{filecontents}

\xpatchbibmacro{bbx:editor}
  {\usebibmacro{#1}}
  {\setunit{\addspace}\printtext[parens]{\usebibmacro{#1}}}
  {}{}

\DeclareBibliographyDriver{incollection}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{in:}%
  \iffieldundef{crossref}
    {\usebibmacro{crossref:full}}
    {\usebibmacro{crossref:label}}
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \iffieldundef{crossref}
    {\usebibmacro{crossref:extrainfo}}
    {}
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

\newbibmacro{crossref:full}{%
    \usebibmacro{maintitle+booktitle}%
  \newunit\newblock
  \usebibmacro{event+venue+date}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \iffieldundef{maintitle}
    {\printfield{volume}%
     \printfield{part}}
    {}%
  \newunit
  \printfield{volumes}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \printlist{organization}%
  \newunit
  \usebibmacro{publisher+location+date}}

\newbibmacro{crossref:label}{%
  \entrydata{\strfield{crossref}}
     {\DeclareNameAlias{labelname}{given-family}%
      \printnames{labelname}%
      \setunit*{\addspace}%
      \printtext[parens]{\usebibmacro{editorstrg}}%
      \setunit*{\addcomma\space}%
      \printfield[title]{labeltitle}}}

\newbibmacro{crossref:extrainfo}{%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{isbn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}}

\addbibresource{my.bib}
\pagestyle{empty}
\begin{document}

Test \cite{inproc1} and \cite{inproc2} and \cite{inproc3}
\printbibliography
\end{document}

введите описание изображения здесь

решение2

Это та функция BibTeX, по которой мне больше всего не хватает.

С BibTeX это просто работает: он прост, надежен и безопасен.

В Biblatex для каждого типа записи требуется дополнительный код, и этот код должен быть адаптирован к используемому стилю библиографии и цитирования: он сложен, подвержен ошибкам, его сложно поддерживать, и, следовательно, он чрезвычайно хрупкий.

Biblatex, очевидно, гораздо более мощный и сложный, чем BibTeX. Жаль, что раздутые библиографии являются одним из немногих реальных регрессов по сравнению с его предшественником.


Я думаю, хотя и не уверен, что вы хотите что-то вроде этого:

менее раздутая библиография

Ниже приведена адаптация кода, который я использую, который сам по себе адаптирован из различных ответов на различные вопросы по TeX SE и из частей стандартного кода Biblatex. Они указаны в комментариях в коде.

\begin{filecontents}{\jobname.bib}
@incollection{inproc1,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {1--10},
    Title = {Testing the Title}}

@incollection{inproc2,
    Author = {Test Author},
    Crossref = {proc},
    Pages = {10--20},
    Title = {Testing the second Title}}

@collection{proc,
    Editor = {Senor Editor and Senora Editora},
    Publisher = {Any Publisher},
    Title = {My Proceedings},
    Year = {2013}}

@inproceedings{inproc3,
    Author  = {Nother Author},
    Publisher = {Nother Publisher},
    Title   = {In Some Other Proceedings},
    Maintitle = {Main Title of Other Proceedings},
    Year     = {2001},
}
\end{filecontents}
\begin{filecontents}{biblatex.cfg}
\ProvidesFile{biblatex.cfg}
% solution adapted from moewe's answer at http://tex.stackexchange.com/a/267321/, standard.bbx based on answer by Denis at http://tex.stackexchange.com/a/118850/, manual
\newif\iffaxminell@biblatex@compcoll
\faxminell@biblatex@compcollfalse
\DeclareBibliographyOption[boolean]{comp-coll}[true]{%
  \edef\tempa{#1}%
  \edef\tempb{true}%
  \edef\tempc{false}%
  \ifx\tempa\tempb
    \faxminell@biblatex@compcolltrue
  \else
    \ifx\tempa\tempc
      \faxminell@biblatex@compcollfalse
    \fi
  \fi
}
\AtEndPreamble{%
  \iffaxminell@biblatex@compcoll
    \newbibmacro*{faxminell:incollection:coll}{% addaswyd o standard.bbx 2017-04-16
      \usebibmacro{maintitle+booktitle}%
      \newunit\newblock
      \usebibmacro{byeditor+others}%
      \newunit\newblock
      \printfield{edition}%
      \newunit
      \iffieldundef{maintitle}
        {\printfield{volume}%
          \printfield{part}}
        {}%
      \newunit
      \printfield{volumes}%
      \newunit\newblock
      \usebibmacro{series+number}%
      \newunit\newblock
      \printfield{note}%
      \newunit\newblock
      \usebibmacro{publisher+location+date}%
      \newunit\newblock
      \usebibmacro{chapter+pages}%
      \newunit\newblock
      \iftoggle{bbx:isbn}
        {\printfield{isbn}}
        {}%
      \newunit\newblock
      \usebibmacro{doi+eprint+url}%
      \newunit\newblock
      \usebibmacro{addendum+pubstate}%
    }%
    \newbibmacro*{faxminell:incollection:crossref}{%
      \ifentryinbib{\thefield{crossref}}{%
        \cite{\thefield{crossref}}%
        \newunit\newblock
        \usebibmacro{chapter+pages}%
      }{%
        \iffieldundef{xref}{%
          \usebibmacro{faxminell:incollection:coll}%
        }{%
          \usebibmacro{faxminell:incollection:xref}%
        }%
      }%
    }%
    \newbibmacro*{faxminell:incollection:xref}{%
      \ifentryinbib{\thefield{xref}}{%
        \cite{\thefield{xref}}%
        \newunit\newblock
        \usebibmacro{chapter+pages}%
      }{%
        \usebibmacro{faxminell:incollection:coll}%
      }%
    }%
    \DeclareBibliographyDriver{incollection}{% adapted from standard.bbx based on answer by Denis at http://tex.stackexchange.com/a/118850/
      \citereset%
      \usebibmacro{bibindex}%
      \usebibmacro{begentry}%
      \usebibmacro{author/translator+others}%
      \setunit{\printdelim{nametitledelim}}\newblock
      \usebibmacro{title}%
      \newunit
      \printlist{language}%
      \newunit\newblock
      \usebibmacro{byauthor}%
      \newunit\newblock
      \usebibmacro{bytranslator+others}%
      \newunit\newblock
      \usebibmacro{in:}%
      \iffieldundef{crossref}{%
        \iffieldundef{xref}{%
          \usebibmacro{faxminell:incollection:coll}%
        }{%
          \usebibmacro{faxminell:incollection:xref}%
        }%
      }{%
        \usebibmacro{faxminell:incollection:crossref}%
      }%
      \setunit{\bibpagerefpunct}\newblock
      \usebibmacro{pageref}%
      \newunit\newblock
      \iftoggle{bbx:related}
        {\usebibmacro{related:init}%
         \usebibmacro{related}}
        {}%
      \usebibmacro{finentry}%
    }%
  \fi
}
% END redefine handling of @incollection etc.
\endinput
\end{filecontents}

\documentclass{article}
\usepackage[backend=biber,style=authortitle-icomp,comp-coll]{biblatex}
\addbibresource{\jobname.bib}

\begin{document}

Test \cite{inproc1} and \cite{inproc2} and \cite{inproc3}
\printbibliography

\end{document}

Если у вас уже есть biblatex.cfg, вы, очевидно, можете добавить код в свои существующие настройки. В качестве альтернативы вы можете включить код в преамбулу обычным способом, т. е. вставив его между \makeatletterи \makeatother.

Если вам это нужно для таких типов записей, как и @inproceedingsт. д., то вы должны иметь возможность изменять их аналогичным образом. (Мне было неясно, нужно ли вам это или нет, поэтому я просто сделал этот @incollectionслучай, который, как я обнаружил, оказался единственным, который мне был нужен на данный момент.)

решение3

В стилях пакета biblatex-extесть опция citexref, которая позволяет использовать немного более короткие библиографические записи.

Просто замените style=authortitle-icomp,на style=ext-authortitle-icomp,и добавьте citexref=trueк параметрам.

\documentclass[]{scrartcl}
\usepackage[backend=biber,style=ext-authortitle-icomp, citexref=true]{biblatex}

\begin{filecontents}{\jobname.bib}
@incollection{inproc1,
  author   = {Test Author},
  crossref = {proc},
  pages    = {1--10},
  title    = {Testing the Title},
}
@incollection{inproc2,
  author   = {Test Author},
  crossref = {proc},
  pages    = {10--20},
  title    = {Testing the second Title},
}
@collection{proc,
  editor    = {Senor Editor and Senora Editora},
  publisher = {Any Publisher},
  title     = {My Proceedings},
  year      = {2013},
}
@inproceedings{inproc3,
  author    = {Nother Author},
  publisher = {Nother Publisher},
  title     = {In Some Other Proceedings},
  maintitle = {Main Title of Other Proceedings},
  year      = {2001},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
Test \autocite{inproc1} and \autocite{inproc2}
and \autocite{inproc3}
\printbibliography
\end{document}

Автор, Тест. «Тестирование второго заголовка». В: Редактор и редактора, Мои труды, стр. 10–20.

Это не дает "ред." в кратких цитатах, поскольку просто отражает обычные цитаты. "Ред." можно добавить, слегка изменив bibmacro cite.

\documentclass[]{scrartcl}
\usepackage[backend=biber,style=ext-authortitle-icomp, citexref=true]{biblatex}

\newbibmacro{cite:labelname}{%
  \printnames{labelname}%
  \iffieldequalstr{labelnamesource}{author}
    {\setunit{\printdelim{authortypedelim}}%
     \usebibmacro{authorstrg}}
    {\iffieldequalstr{labelnamesource}{editor}
       {\setunit{\printdelim{editortypedelim}}%
        \usebibmacro{editor+othersstrg}}
       {\iffieldequalstr{labelnamesource}{translator}
         {\setunit{\printdelim{editortypedelim}}%
          \usebibmacro{translator+othersstrg}}
         {}}}}

\makeatletter
\renewbibmacro*{bbx:inxrefcite}{%
  \iffieldundef{shorthand}
    {\ifthenelse{\ifciteibid\AND\NOT\iffirstonpage}
       {\usebibmacro{cite:ibid}}
       {\iffieldequals{namehash}{\cbx@lasthash}
          {\setunit{\compcitedelim}}
          {\usebibmacro{cite:labelname}%
           \setunit*{\printdelim{nametitledelim}}%
           \savefield{namehash}{\cbx@lasthash}}%
        \usebibmacro{cite:title}}}%
    {\usebibmacro{cite:shorthand}%
     \usebibmacro{cite:reinit}}%
  \setunit{\multicitedelim}}
\makeatother

\begin{filecontents}{\jobname.bib}
@incollection{inproc1,
  author   = {Test Author},
  crossref = {proc},
  pages    = {1--10},
  title    = {Testing the Title},
}
@incollection{inproc2,
  author   = {Test Author},
  crossref = {proc},
  pages    = {10--20},
  title    = {Testing the second Title},
}
@collection{proc,
  editor    = {Senor Editor and Senora Editora},
  publisher = {Any Publisher},
  title     = {My Proceedings},
  year      = {2013},
}
@inproceedings{inproc3,
  author    = {Nother Author},
  publisher = {Nother Publisher},
  title     = {In Some Other Proceedings},
  maintitle = {Main Title of Other Proceedings},
  year      = {2001},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
Test \autocite{inproc1} and \autocite{inproc2}
and \autocite{inproc3}
\printbibliography
\end{document}

Автор, Тест. «Тестирование второго заголовка». В: Редактор и редактора, ред., Мои труды, стр. 10–20.

Связанный контент