Какие изменения необходимо внести, чтобы использовать \textcite для цитирования стандартов в строке

Какие изменения необходимо внести, чтобы использовать \textcite для цитирования стандартов в строке

Я пытаюсь сослаться на стандарт в тексте моего документа. По этой темеКак сослаться на стандарт (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}

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