![Quais modificações devem ser feitas para usar \textcite para citar padrões inline](https://rvso.com/image/370327/Quais%20modifica%C3%A7%C3%B5es%20devem%20ser%20feitas%20para%20usar%20%5Ctextcite%20para%20citar%20padr%C3%B5es%20inline.png)
Estou tentando citar um padrão no texto do meu documento. Em relação a este tópicoComo citar um padrão (ISO, etc.) no BibLaTeX?Criei um labelalpha e uma entrada bibliográfica adequada às minhas necessidades, mas não consegui modificar o comando textcite.
Aqui um 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}
Quero modificar o comando textcite apenas para o padrão entrytype. Eu descobri que o comando textcite primeiro verifica o campo labelname e se estiver vazio ele usará o campo labeltitle. É por isso que o título completo será impresso usando o comando textcite. O campo labeltitle analisa alguns campos de título em uma determinada ordem. Como tenho um grande número de padrões, definir um título curto no arquivo .bib não é uma boa opção. É possível criar um título curto definido pelo usuário instantaneamente para que o comando textcite o use em vez do título completo?
O resultado deverá ficar assim: ASI 1234 [ASI1234:1999, S. 10-12]
Responder1
Parece um trabalho para \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}
Responder2
Se você está procurando uma solução verdadeiramente dinâmica, defina
\makeatletter
\newcommand*{\redeflabeltitle}[1]{\AtNextCitekey{\csdef{abx@field@labeltitle}{#1}}}
\makeatother
em seu preâmbulo e então use-o como
\redeflabeltitle{Eine tolle Norm}\textcite{ASI1234_1}
no documento.
Mas na verdade seria muito, muito mais limpo dar um shorttitle
no .bib
arquivo, então as coisas são realmente consistentes.
Responder3
Hack rápido:
\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}