Я пытаюсь сослаться на стандарт в тексте моего документа. По этой темеКак сослаться на стандарт (ISO и т.п.) в BibLaTeX?Я создал labelalpha и библиографическую запись, которые подходят для моих нужд, но мне не удалось изменить команду textcite.
Вот MWE:
\documentclass{article}
\begin{filecontents}{Biblio.bib}
@standard{ASI1234_1,
year = {1999},
title = {somethings special in the world, that has to be defined},
urldate = {2012-09-10},
number = {1234-1},
date = {1999-04},
type = {ASI},
version = {1999-04},
organization = {{ASI}}
}
\end{filecontents}
%%Definition einer Normenklasse für Biblatex
\begin{filecontents}{standards.dbx}
%Modifikation für Normen in Biblatex
\DeclareDatamodelEntryfields[standard]{number,type}
\end{filecontents}
%Pakete für das Literaturverzeichnis mit BibLatex und Einstellung
\usepackage[
style=alphabetic,
% style=draft,
backend=biber,
datamodel=standards]{biblatex}
\addbibresource{Biblio.bib}
\DefineBibliographyStrings{ngerman}{andothers={et\addabbrvspace al\adddot}} %et al. statt u.a.
%\DefineBibliographyStrings{ngerman}{and={\&}} % und zu & machen
\renewcommand*{\labelalphaothers}{} %Zeichen für mehrere Authoren in Abkürzung löschen
%Label für Standard
\DeclareLabelalphaTemplate[standard]{
\labelelement{ %
\field{type} %
} %
\labelelement{ %
\field{number} %
} %
\labelelement{ %
\literal{:} %
} %
\labelelement{ %
\field{year} %
} %
} %
%Eintrag Bibliographie
\DeclareBibliographyDriver{standard}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\printfield{type}%
\setunit{\addspace}\newblock%
\printfield{number}%
\setunit{\addcolon}\newblock%
\printfield{year}%
\iffieldundef{month}{%
\setunit{\addspace}\newblock}%
{\setunit{\addperiod}}%
\printfield{month} %
\setunit*{\addspace}\newblock %
\usebibmacro{title}%
\usebibmacro{finentry}}
\begin{document}
Blablablabba \textcite[10-12]{ASI1234_1} Balbabab
\printbibliography
\end{document}
Я хочу изменить команду textcite только для стандарта entrytype. Я выяснил, что команда textcite сначала проверяет поле labelname, и если оно пустое, она будет использовать поле labeltitle. Вот почему полный заголовок будет напечатан с помощью команды textcite. Поле labeltitle анализирует пару полей title в определенном порядке. Поскольку у меня есть большое количество стандартов, определяющих shorttitle в файле .bib, это не лучший вариант. Возможно ли создать определяемый пользователем shorttitle на лету, чтобы команда textcite использовала его вместо полного заголовка?
Результат должен выглядеть так: ASI 1234 [ASI1234:1999, S. 10-12]
решение1
Похоже, это работа для \DeclareSourcemap
:
\documentclass{article}
\begin{filecontents}{Biblio.bib}
@standard{ASI1234_1,
year = {1999},
title = {somethings special in the world, that has to be defined},
urldate = {2012-09-10},
number = {1234-1},
date = {1999-04},
type = {ASI},
version = {1999-04},
organization = {{ASI}}
}
\end{filecontents}
%%Definition einer Normenklasse für Biblatex
\begin{filecontents}{standards.dbx}
%Modifikation für Normen in Biblatex
\DeclareDatamodelEntryfields[standard]{number,type}
\end{filecontents}
%Pakete für das Literaturverzeichnis mit BibLatex und Einstellung
\usepackage[
style=alphabetic,
% style=draft,
backend=biber,
datamodel=standards]{biblatex}
\addbibresource{Biblio.bib}
\DefineBibliographyStrings{ngerman}{andothers={et\addabbrvspace al\adddot}} %et al. statt u.a.
%\DefineBibliographyStrings{ngerman}{and={\&}} % und zu & machen
\renewcommand*{\labelalphaothers}{} %Zeichen für mehrere Authoren in Abkürzung löschen
%Label für Standard
\DeclareLabelalphaTemplate[standard]{
\labelelement{ %
\field{type} %
} %
\labelelement{ %
\field{number} %
} %
\labelelement{ %
\literal{:} %
} %
\labelelement{ %
\field{year} %
} %
} %
%Eintrag Bibliographie
\DeclareBibliographyDriver{standard}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\printfield{type}%
\setunit{\addspace}\newblock%
\printfield{number}%
\setunit{\addcolon}\newblock%
\printfield{year}%
\iffieldundef{month}{%
\setunit{\addspace}\newblock}%
{\setunit{\addperiod}}%
\printfield{month} %
\setunit*{\addspace}\newblock %
\usebibmacro{title}%
\usebibmacro{finentry}}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\pertype{standard}
\step[fieldsource=type, fieldset=shorttitle, origfieldval]
\step[fieldset=shorttitle,fieldvalue={\addspace}, append]
\step[fieldsource=number, fieldset=shorttitle, origfieldval, append]
}
}
}
\begin{document}
Blablablabba \textcite[10-12]{ASI1234_1} Balbabab
\printbibliography
\end{document}
решение2
Если вы ищете действительно оперативное решение, определите
\makeatletter
\newcommand*{\redeflabeltitle}[1]{\AtNextCitekey{\csdef{abx@field@labeltitle}{#1}}}
\makeatother
в вашей преамбуле, а затем используйте ее как
\redeflabeltitle{Eine tolle Norm}\textcite{ASI1234_1}
в документе.
Но на самом деле было бы гораздо, гораздо чище указать это shorttitle
в .bib
файле, чтобы все было действительно последовательно.
решение3
Быстрый хак:
\documentclass{article}
\begin{filecontents}{Biblio.bib}
@standard{ASI1234_1,
year = {1999},
title = {somethings special in the world, that has to be defined},
urldate = {2012-09-10},
number = {1234-1},
date = {1999-04},
type = {ASI},
version = {1999-04},
organization = {{ASI}}
}
\end{filecontents}
%%Definition einer Normenklasse für Biblatex
\begin{filecontents}{standards.dbx}
%Modifikation für Normen in Biblatex
\DeclareDatamodelEntryfields[standard]{number,type}
\end{filecontents}
%Pakete für das Literaturverzeichnis mit BibLatex und Einstellung
\usepackage[
style=alphabetic,
% style=draft,
backend=biber,
datamodel=standards]{biblatex}
\addbibresource{Biblio.bib}
\DefineBibliographyStrings{ngerman}{andothers={et\addabbrvspace al\adddot}} %et al. statt u.a.
%\DefineBibliographyStrings{ngerman}{and={\&}} % und zu & machen
\renewcommand*{\labelalphaothers}{} %Zeichen für mehrere Authoren in Abkürzung löschen
%Label für Standard
\DeclareLabelalphaTemplate[standard]{
\labelelement{ %
\field{type} %
} %
\labelelement{ %
\field{number} %
} %
\labelelement{ %
\literal{:} %
} %
\labelelement{ %
\field{year} %
} %
} %
%Eintrag Bibliographie
\DeclareBibliographyDriver{standard}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\printfield{type}%
\setunit{\addspace}\newblock%
\printfield{number}%
\setunit{\addcolon}\newblock%
\printfield{year}%
\iffieldundef{month}{%
\setunit{\addspace}\newblock}%
{\setunit{\addperiod}}%
\printfield{month} %
\setunit*{\addspace}\newblock %
\usebibmacro{title}%
\usebibmacro{finentry}}
\makeatletter
\renewbibmacro*{textcite}{%
\iffieldequals{namehash}{\cbx@lasthash}
{\setunit{\multicitedelim}}
{\ifentrytype{standard}{}{\ifnameundef{labelname}
{\printfield[citetitle]{labeltitle}}
{\printnames{labelname}}%
\setunit{%
\global\booltrue{cbx:parens}%
\printdelim{namelabeldelim}\bibopenbracket}%
\stepcounter{textcitecount}%
\savefield{namehash}{\cbx@lasthash}}}%
\ifnumequal{\value{citecount}}{1}
{\usebibmacro{prenote}}
{}%
\ifentrytype{standard}{\printfield{type}\printfield{number}}{\usebibmacro{cite}}%
\setunit{%
\ifbool{cbx:parens}
{\bibclosebracket\global\boolfalse{cbx:parens}}
{}%
\textcitedelim}}
\makeatother
\begin{document}
Blablablabba \textcite{ASI1234_1} Balbabab
\printbibliography
\end{document}