¿Qué modificaciones se deben realizar para usar \textcite para citar estándares en línea?

¿Qué modificaciones se deben realizar para usar \textcite para citar estándares en línea?

Estoy intentando citar un estándar dentro del texto de mi documento. Respecto a este tema¿Cómo citar un estándar (ISO, etc.) en BibLaTeX?Creé una etiqueta alfa y una entrada de bibliografía que se adapta a mis necesidades, pero no pude modificar el comando textcite.

Aquí un 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}

ingrese la descripción de la imagen aquí

Quiero modificar el comando textcite solo para el estándar de tipo de entrada. Descubrí que el comando textcite primero verifica el campo de nombre de etiqueta y, si está vacío, usará el campo de título de etiqueta. Esa es la razón por la cual el título completo se imprimirá usando el comando textcite. El campo de título de etiqueta analiza un par de campos de título en un orden determinado. Debido a que tengo una gran cantidad de estándares, definir un título corto dentro del archivo .bib no es una buena opción. ¿Es posible crear un título corto definido por el usuario sobre la marcha para que el comando textcite lo use en lugar del título completo?

El resultado debería verse así: ASI 1234 [ASI1234:1999, S. 10-12]

Respuesta1

Parece un trabajo 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}

ingrese la descripción de la imagen aquí

Respuesta2

Si está buscando una solución verdaderamente sobre la marcha, defina

\makeatletter
\newcommand*{\redeflabeltitle}[1]{\AtNextCitekey{\csdef{abx@field@labeltitle}{#1}}}
\makeatother

en su preámbulo y luego usarlo como

\redeflabeltitle{Eine tolle Norm}\textcite{ASI1234_1}

en el documento.

Pero en realidad sería mucho, mucho más limpio incluir un archivo shorttitleen el .bibarchivo, para que las cosas sean realmente consistentes.

Respuesta3

Truco 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}

información relacionada