В моей библиографии я хочубиблатекспечатать только имя редактора и название родительской работы в дочерней записи, если у родителя есть по крайней мере два потомка, в то время как теперь я получаю полную родительскую запись в каждой отдельной дочерней записи. Родительская запись должна быть затем напечатана полностью под именем редактора. Поэтому вместо
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}
Это не дает "ред." в кратких цитатах, поскольку просто отражает обычные цитаты. "Ред." можно добавить, слегка изменив 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}