Biblatex shorttitle 与 incollction 和 crossref 排序问题

Biblatex shorttitle 与 incollction 和 crossref 排序问题

我必须重新定义集合的排序(以及驱动程序):

标题、编辑、地点、出版地、年份。

在第二次引用时,我得到了缩写形式:

作者姓氏、简称、引文。

但是,当我引用指向@incollectioncrossref内容时@collection,我不再得到我心爱的集合的缩写形式,而是:

简称。编辑姓名。引文。

我更希望

作者姓氏、简称、引文。

换句话说,在我的 MWE 中我得到:

雷娜塔·阿戈。 《十九世纪和二十世纪初在罗马的社交和消费》。在:Salotti 和女性之道。玛丽亚·贝特里 (Maria Betri) 的治疗师 - 马里奥·罗西 (Mario Rossi)。引文,第 177-188 页

但是我需要:

雷娜塔·阿戈。 《十九世纪和二十世纪初在罗马的社交和消费》。引自:Betri - Rossi,Salotti e ruolo femminile,引文。

为了shorttitle在这里我使用了 Maïeul 的包biblatex-opcit-booktitle,但在这种情况下它似乎效果不太好。

梅威瑟:

% !BIB TS-program = biber
% !BIB program = biber
% !TEX encoding = UTF-8 Unicode
% !TeX TS-program = xelatexmk

\begin{filecontents}{archivio.bib}

@collection{Bet:Sal,
    Address = {Venezia},
    Editor = {Maria Betri AND Mario Rossi},
    Publisher = {Marsilio},
    Shorttitle = {Salotti e ruolo femminile},
    Title = {Salotti e ruolo femminile in Italia, tra fine Seicento e primo Novecento},
    Year = {2004}},

@incollection{Ago:Soc,
    Author = {Renata Ago},
    Crossref = {Bet:Sal},
    Pages = {177-188},
    Title = {Socialit{\`a} e salotti a Roma tra Sei e Settecento}}

\end{filecontents}


\documentclass[A4, 11pt, twoside, openright]{book}
\usepackage{fontspec}
\usepackage{polyglossia}                        
    \setmainlanguage{italian}

\usepackage[autostyle,italian=guillemets]{csquotes}
\usepackage{xpatch}     
\usepackage[style=verbose-trad2,            
            language=italian,
            useprefix=true,                 
            citepages=omit,                 
            backend=biber,  
            ibidpage=true,
        ]{biblatex} 
        
\usepackage{biblatex-opcit-booktitle}

\NewBibliographyString{ibidemloccit,ibidemnoloccit}
\DefineBibliographyStrings{italian}{%
  editor           = {a cura di},
  editors          = {a cura di}
}

\renewcommand{\multinamedelim}{\space\hyphen\space}
\renewcommand{\finalnamedelim}{\space\hyphen\space}                         

\renewbibmacro*{cite:title}{%                           Ciò che segue è per avere lo shorttitle alla seconda citazione (funge solo in trad2)
  \printtext[bibhyperlink]{%
    \printfield[citetitle]{labeltitle}%
    \setunit{\addspace}%
    \bibstring[\mkibid]{opcit}}}
    

    
%%%%%%%%%%%%%% RIDEFINISCO IL DRIVER COLLECTION%%%%%%%%%%%%

\DeclareBibliographyDriver{collection}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{maintitle+title}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \usebibmacro{editor+others}%
  \newunit
  \printlist{language}%
  \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
  \printfield{pagetotal}%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{isbn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \newunit\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \usebibmacro{finentry}}
  
  
\addbibresource{archivio.bib}  


\begin{document}

I first cite a collection:\\

\cite{Bet:Sal} \\

Then in this incollection (with crossref) I would like to get the shorttitle of the collection:

\cite{Ago:Soc}\\

In other words I would like to have that shortened form:

\cite{Bet:Sal} \\

\end{document}

答案1

这是一个想法,但它并不总是有效。

此外,这不是非常干净的代码,我非常感谢任何使它更流畅的建议。

% !BIB TS-program = biber
% !BIB program = biber
% !TEX encoding = UTF-8 Unicode
% !TeX TS-program = xelatexmk

\begin{filecontents}{archivio.bib}

@collection{Bet:Sal,
    Address = {Venezia},
    Editor = {Maria Betri AND Mario Rossi},
    Publisher = {Marsilio},
    Shorttitle = {Salotti e ruolo femminile},
    Title = {Salotti e ruolo femminile in Italia, tra fine Seicento e primo Novecento},
    Year = {2004}}

@incollection{Ago:Soc,
    Author = {Renata Ago},
    Crossref = {Bet:Sal},
    Pages = {177-188},
    Title = {Socialitas e salotti a Roma tra Sei e Settecento}}

\end{filecontents}


\documentclass[A4, 11pt, twoside, openright]{book}%openany

\usepackage{fontspec}
\newfontfamily\russianfont[]{Garamond Premier Pro}

\usepackage{comment}                        % Per poter commentare ampie sezioni di testo con \begincomment

\usepackage{polyglossia}                        % Per le sillabazioni
    \setmainlanguage{italian}
    \setotherlanguages{english, latin, french}

%%%%%%%%%%%%%%%%%%%COMANDI DI BILIOGRAFIA%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[autostyle,italian=guillemets]{csquotes}
\usepackage{Stile_dottorato_prova3}
\addbibresource{archivio.bib}  

\begin{document}

\textbf{Collection}:\\

\cite{Bet:Sal} \\

\textbf{Then Incollection with crossref to a Collection}:\\

\cite{Ago:Soc}\\

For the Collection (after the firt citation) I need just:

\cite{Bet:Sal} \\
\end{document}

这是 .sty:

\usepackage[autostyle,italian=guillemets]{csquotes}
\usepackage{xpatch}     
\usepackage[style=verbose-trad2,            
            language=italian,
            useprefix=true,                 
     %    giveninits=true,      nomi per esteso    
            indexing=true,
        maxbibnames=7, 
        maxcitenames=2,
            citepages=omit, 
            backend=biber,  
            ibidpage=true
        ]{biblatex} 

%\usepackage{biblatex-opcit-booktitle}      % per avere cit. nelle citazioni di book in book con crosserf o simili

\NewBibliographyString{ibidemloccit,ibidemnoloccit}
\DefineBibliographyStrings{italian}{%
     idem   = {Id\adddot},
    idemsm = {Id\adddot},
    idemsf = {Ead\adddot},
    idemsn = {Id\adddot},
    idempm = {Id\adddot},
    idempf = {Id\adddot},
    idempn = {Id\adddot},
    idempp = {Id\adddot},
  ibidemloccit   = {Ibidem}, % tolto \mkbibemph perché ho già che tutte le latinitates sono enfatiche; \autocap{i} non funziona!
  ibidemnoloccit = {Ivi},
  editor           = {a cura di},
  editors          = {a cura di}
}

\xpatchbibmacro{author}
  {\printnames{author}}
  {\iffootnote
     {\ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}
       {\usebibmacro{cite:idem}}
       {\printnames{author}}}
     {\printnames{author}}}
  {}{}
\xpatchbibmacro{bbx:editor}
  {\printnames{editor}}
  {\iffootnote
     {\ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}
        {\usebibmacro{cite:idem}}
        {\printnames{editor}}}
     {\printnames{editor}}}
  {}{}
\xpatchbibmacro{bbx:translator}
  {\printnames{translator}}
  {\iffootnote
     {\ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}
        {\usebibmacro{cite:idem}}
        {\printnames{translator}}}
     {\printnames{translator}}}
  {}{}

\renewbibmacro*{cite:ibid}{%
  \printtext{%
    \bibhyperlink{cite\csuse{cbx@lastcite@\thefield{entrykey}}}{%
      \ifloccit
        {\bibstring[\mkibid]{ibidemloccit}%
         \global\toggletrue{cbx:loccit}}
        {\bibstring[\mkibid]{ibidemnoloccit}}}}}

\DeclareFieldFormat[article, inbook, incollection, inproceedings]{title}{\mkbibemph{#1}}    % Titolo in corsivo
\DeclareFieldFormat[article]{journaltitle}{\mkbibquote{#1}}                         % Titolo rivista tra virgolette a caporale
\DeclareFieldFormat[book, inbook, incollection, inproceedings]{volume}{#1}          % Elimina "vol."

\DefineBibliographyStrings{ngerman}{pages={p\adddot}}               % p. invece di pp. su pagine multiple
\DefineBibliographyStrings{italian}{pages={p\adddot}}
\DefineBibliographyStrings{french}{pages={p\adddot}}
\DefineBibliographyStrings{english}{pages={p\adddot}}
\DefineBibliographyStrings{italian}{volumes={vol\adddot}}               % vol. invece di voll. su volumi multipli
\DefineBibliographyStrings{ngerman}{volumes={vol\adddot}}
\DefineBibliographyStrings{french}{volumes={vol\adddot}}
\DefineBibliographyStrings{english}{volumes={vol\adddot}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%


\renewcommand*{\newunitpunct}{\addcomma\space}                              % Virgola tra le unità
\renewcommand*{\mkibid}{\emph}                                          % ibid, op cit e latinitates in enfatico
\renewcommand{\multinamedelim}{\space\hyphen\space}                         % delimitatore tra nomi. era \textendash
\renewcommand{\finalnamedelim}{\space\hyphen\space}                         % ultimo delimitatore tra nomi
\renewcommand{\bibinitdelim}{}                                              % annulla lo ~ di default tra le iniziali dei nomi

\renewbibmacro{in:}{\bibstring{in}\space}                                           % rimuove i due punti dopo "in"         
\renewbibmacro{in:}{%                                                   % rimuove "in" dagli Article
  \ifentrytype{article}{}{\printtext{\bibstring{in}\intitlepunct}}}          


% Virgola prima e dopo Il numero della rivista in Article
\renewbibmacro*{volume+number+eid}{%
  \setunit*{\addcomma\space}% NEW
  \printfield{volume}%
% \setunit*{\adddot}% DELETED
  \setunit*{\addcomma\space}% NEW
  \printfield{number}%
  \setunit{\addcomma\space}%
  \printfield{eid}}  


\xpatchbibmacro{publisher+location+date}{\addcolon}{\addcomma}{}{}  % virgola tra pub, loc e date

\renewbibmacro*{cite:title}{%                           Ciò che segue è per avere lo shorttitle alla seconda citazione (funge solo in trad2)
  \printtext[bibhyperlink]{%
    \printfield[citetitle]{labeltitle}%
    \setunit{\addspace}%
    \bibstring[\mkibid]{opcit}}}

    \DeclareFieldFormat[article, inbook, incollection, inproceedings]{citetitle}{\mkbibemph{#1}}        % e che resti in corsivo


\renewbibmacro*{series+number}{%                            % Questa è la macro usata da @book per trattare le serie:
\iffieldundef{series}{}{%
  \printtext[parens]{\printfield{series}\addcomma%
  \setunit*{\addspace}%
  \printfield{number}}}%
  \newunit}                     % 


\DeclareSourcemap{                                          % Ma alla fine vedi che la SERIE la elimino proprio!!!
  \maps[datatype=bibtex]{
    \map{
       \step[fieldset=series, null]
    }
  }
}


\DeclareBibliographyDriver{book}{%                          % Il driver @book è modificato per avere prima pub+loc+year e dopo ser+num
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/editor+others/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{maintitle+title}%
    \newunit
  \iffieldundef{maintitle}
    {\printfield{volume}%
     \printfield{part}}
    {}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \printfield{edition}%
  \newunit
  \printfield{volumes}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \usebibmacro{publisher+location+date}%
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \newunit
  \printfield{pagetotal}%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{isbn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \setunit{\addsemicolon\space}\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \newunit\newblock 
  \usebibmacro{pageref}%
  \newblock%\nopunct%               %%% MODIFICA MIA!tolto il \nopunct per avere virgola prima della pagina
    \usebibmacro{series+number}%
  \newunit\newblock
  \usebibmacro{finentry}}

  \renewbibmacro*{cite:title}{%                 "cit" in tondo              
  \printtext[bibhyperlink]{%
    \printfield[citetitle]{labeltitle}%
    \setunit{\addspace}%
    \bibstring{opcit}}}    

%%%%%%%%%%%%%% RIDEFINISCO IL DRIVER COLLECTION%%%%%%%%%%%%

\DeclareBibliographyDriver{collection}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{maintitle+title}%
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \usebibmacro{editor+others}%
  \newunit
  \printlist{language}%
  \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
  \printfield{pagetotal}%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{isbn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \newunit\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \usebibmacro{finentry}}




%%%%%%%%%% ADDENDA x risolvere la seconda citazione di una collection con crossref a incollection

\newbibmacro*{cite:seen:related}{%
 {\xifinlistcs{\thefield{crossref}}{blx@bsee@\the\c@refsection}
   {}
   {\listcsxadd{blx@bsee@\the\c@refsection}{\thefield{crossref}}}}}

\newcommand{\ifrelatedunseen}[2]{%
  \xifinlistcs{\thefield{crossref}}{blx@bsee@\the\c@refsection}
   {#2}
   {#1}}


\renewbibmacro*{cite}{%
  \usebibmacro{cite:citepages}%
  \global\togglefalse{cbx:fullcite}%
  \global\togglefalse{cbx:loccit}%
  \bibhypertarget{cite\the\value{instcount}}{%
    \ifciteseen
      {\iffieldundef{shorthand}
         {\ifciteibid
            {\usebibmacro{cite:ibid}}
            {\ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}
         {\usebibmacro{cite:idem}}
               {\usebibmacro{cite:name}}%           author della Collection da solo (in 2a cit?)
             \usebibmacro{cite:title}}%
          \usebibmacro{cite:save}}
         {\usebibmacro{cite:shorthand}}}
      {\ifboolexpr {
         test {\iffieldundef{crossref}}
         or not ( test {\ifentrytype{inbook}}
               or test {\ifentrytype{incollection}} ) }
       {\usebibmacro{cite:full}%
        \usebibmacro{cite:save}}
       {\ifrelatedunseen
        {\usebibmacro{cite:seen:related}%
         \usebibmacro{cite:full}%
         \usebibmacro{cite:save}}
        {\usebibmacro{related:info}}}}}}

\newbibmacro*{related:info}{%
  \usedriver{}{inbook:rel}}

\newbibmacro*{author_Inc_short}{%       Definisco la macro per l'autore dell'incollection corta
{\DeclareNameAlias{author}{given-family}%
    {\printnames{author}%
       {\setunit{\printdelim{authortypedelim}}%
        \usebibmacro{authorstrg}}}
    {}}}


\DeclareBibliographyDriver{inbook:rel}{%   questo si riferisce all'incollection
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author_Inc_short}  %                     autore dell' Incollection
  \setunit{\printdelim{nametitledelim}}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{in:}%
   \iffieldundef{crossref}                  % Righe aggiunte per evocare la macro di crossref
    {\usebibmacro{crossref:full}}           %       
    {\usebibmacro{crossref:label}}          %
  \newunit%
  \bibstring{opcit}%
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \newunit\newblock
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \newunit\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \usebibmacro{finentry}}

%%%% aggiungo le macro per crossref

\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}{%              Questo si attiva per la shortcite di una collection
  \entrydata{\strfield{crossref}}               
     {\printnames{labelname}%                   stampa autore (o curatore) dell' Incollection 
      \setunit*{\addspace}%
      \setunit*{\addcomma\space}%
      \printfield[title]{labeltitle}}}

答案2

这是一个解决方法。

如果我去掉第一个答案中的所有(丑陋的)编码,如果我已经单独引用了该集合,我仍然会遇到第一次引用集合的问题。在这种情况下,我希望有集合的长格式和集合的短格式。我设法用新的引用命令 \citecc 来做到这一点(它用于 crossref 集合)

\DeclareCiteCommand*{\citetitle}            % ridefinisco il tracking per avere la seconda citazione corretta
  { %                                       Qui c'era \boolfalse{citetracker}%   \boolfalse{pagetracker}%
   \usebibmacro{prenote}}
  {\ifciteindex
     {\indexfield{indextitle}}
     {}%
   \printfield[citetitle]{title}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\DeclareCiteCommand{\citela}        % id est cite long author - anche qui come sopra ho tolto boolfalse x tracking
  {\usebibmacro{prenote}}               % usa il valore nel campo prenote se presente
  {\ifciteindex
    {\DeclareNameAlias{labelname}{given-family}% Ridefinisco la labelname per avere il nome lungo
    \indexnames{labelname}}         % andrà nell'indice?? verifica
     {}%
   \printnames{labelname}}          % stampa la labelname
  {\multicitedelim}                 % dividi i nomi multipli di autore con il modo definito 
  {\usebibmacro{postnote}}          % scrivi le postnote se presenti


\newbibmacro*{postnotenew}{%            Definisco una nuova macro secondo cui
  \ifnameundef{labelname}       %       Se non è specificato autore o editore
    {\hspace*{-1ex}}                %       Non voglio la virgola e compenso lo spazio vuoto lasciato dal nome
    {\printtext{\addcomma}}}        %       Se invece è specificato voglio la virgola

\DeclareCiteCommand{\citeauthornew} % normale citeauthor ma che alla fine evoca la macro \postnotenew per la virgola condizionale
  {%
   \usebibmacro{prenote}}
  {\ifciteindex
     {\indexnames{labelname}}
     {}%
   \printnames{labelname}}
  {\multicitedelim}
  {\usebibmacro{postnotenew}}


%Definisco un nuovo comando \citecc (collection-crossref) a due argomenti, la Incollection, poi la Collection di provenienza e come argomento opzionale il numero di pagina, con condizionale

\newcommand\citecc[3][]{%           Definisco comando con tre argomenti e uno opzionale
  \ifstrempty{#1}%                  Se quello opzionale è vuoto (no pagina indicata)
    {\citela{#2}, \citetitle*{#2}, in \citeauthornew{#3}  \citetitle{#3}, cit., p.~\citefield{#2}{pages}}%  succede questo
    {\citela{#2}, \citetitle*{#2}, in \citeauthornew{#3}  \citetitle{#3}, p.~{#1}, cit.}}   % altrimenti questo

优点:它有效

缺点:(1)它是一种解决方法,只能产生我在这个“异常”中需要的东西;(2)它需要两个参数,而不是一个

再次,任何帮助都会很感激,尽管我设法解决了这个问题......不知何故。

相关内容