[risolto] biblatex-philosophy: campo “addendum” tra parentesi

  • Creatore
    Topic
  • #121188
    MatteoF
    Partecipante
      Up
      0
      Down
      ::


      Buongiorno a tutti,

      volevo formattare il campo [tt]addendum[/tt] tra parentesi tonde. Sbirciando nel codice di [tt]biblatex-philosophy[/tt] ho effettuato le seguenti modifiche, che penso siano corrette, visto che ottengo il risultato voluto senza messaggi di errore (in tal senso chiederei conferma a @ivan):
      `
      \renewbibmacro*{addendum+pubstate}{%
      \iffieldundef{addendum}{}{%
      \setunit{\addspace}
      \printtext[parens]{%
      \printfield{addendum}}}
      \newunit\newblock
      \printfield{pubstate}%
      \ifdefstring{\bbx@origfields}{none}{}{%
      \newunit\newblock
      \usebibmacro{origdata:book}}
      \newunit\newblock
      \usebibmacro{library}%
      }

      \renewbibmacro*{addendum+pubstate:article-inbook-incoll}{%
      \iffieldundef{addendum}{}{%
      \setunit{\addspace}
      \printtext[parens]{%
      \printfield{addendum}}}
      \newunit\newblock
      \printfield{pubstate}%
      \ifdefstring{\bbx@origfields}{none}{}{%
      \newunit\newblock
      \usebibmacro{origdata:article-inbook}}
      \newunit\newblock
      \usebibmacro{library}%
      }
      `
      Successivamente ho voluto compattare il codice tramite il comando [tt]\xpatchbibmacro[/tt] del pacchetto [tt]xpatch[/tt], ottenendo il seguente risultato:
      `
      \xpatchbibmacro{addendum+pubstate}{\printfield{addendum}}{%
      \iffieldundef{addendum}{}{%
      \setunit{\addspace}
      \printtext[parens]{%
      \printfield{addendum}}}%
      }{}{}

      \xpatchbibmacro{addendum+pubstate:article-inbook-incoll}{\printfield{addendum}}{%
      \iffieldundef{addendum}{}{%
      \setunit{\addspace}
      \printtext[parens]{%
      \printfield{addendum}}}%
      }{}{}
      `
      Di seguito un emc perfettamente funzionante:
      `
      % !TEX encoding = UTF-8 Unicode
      % !TEX program = lualatex
      % !BIB program = biber

      \begin{filecontents}[overwrite]{\jobname.bib}
      @InBook{Weintraub2002,
      author = {Weintraub, E. Roy},
      booktitle = {Introduzione storica all'economia politica},
      date = {2002},
      title = {Contenuti e metodi della storia del pensiero economico del '900: una proposta},
      shorttitle ={Contenuti e metodi},
      addendum = {Saggio in Appendice},
      bookauthor = {Parisi, Daniela},
      location = {Bologna},
      pages = {235-262},
      publisher = {il Mulino},
      }
      \end{filecontents}

      \documentclass{article}
      \usepackage{fontspec}
      \usepackage{polyglossia}
      \setmainlanguage[babelshorthands]{italian}
      \usepackage[autostyle]{csquotes}
      \usepackage[style=philosophy-classic]{biblatex}
      \addbibresource{\jobname.bib}
      \usepackage{xpatch}

      \xpatchbibmacro{addendum+pubstate}{\printfield{addendum}}{%
      \iffieldundef{addendum}{}{%
      \setunit{\addspace}
      \printtext[parens]{%
      \printfield{addendum}}}%
      }{}{}

      \xpatchbibmacro{addendum+pubstate:article-inbook-incoll}{\printfield{addendum}}{%
      \iffieldundef{addendum}{}{%
      \setunit{\addspace}
      \printtext[parens]{%
      \printfield{addendum}}}%
      }{}{}

      \begin{document}
      \nocite{*}
      \printbibliography
      \end{document}
      `
      La voce bibliografica viene stampata nel seguente modo:

      Weintraub, E. Roy (2002), «Contenuti e metodi della storia del pensiero economico del ’900: una proposta», in Daniela Parisi, Introduzione storica all’economia politica, il Mulino, Bologna, p. 235-262 (Saggio in Appendice).

      Dunque, la mia domanda: visto che il codice modificato è il medesimo sia per ma macro [tt]addendum+pubstate[/tt] che per la macro [tt]addendum+pubstate:article-inbook-incoll[/tt] (e così sarà anche per il codice sperimentale [tt]addendum+pubstate:juris[/tt]) c’è un modo per compattare ulteriormente il codice? Insomma: vi è la possibilità di modificare una stessa porzione di codice per un elenco di macro?

      Grazie a chi vorrà ragionarci sù!
      Matteo

    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #121189
        Up
        0
        Down
        ::


        Questo compatta ulteriormente il codice, ma non è una soluzione elegante.
        `\xpretobibmacro{addendum+pubstate:article-inbook-incoll}{\setunit{\addspace}}{}{}
        \xpretobibmacro{addendum+pubstate}{\setunit{\addspace}}{}{}
        \DeclareFieldFormat{addendum}{\mkbibparens{#1}}
        `

        Il problema, ovviamente, è eliminare la virgola prima del campo addendum tra parentesi. Quella virgola è creata da \newunit, che come già detto in un altro filone, non fa altro che mettere quella virgola in un buffer che puoi viene usato da \printfield. Purtroppo, però, non si può semplicemente mettere \setunit{\addspace} all’interno di \DeclareFieldFormat, perché a quel punto la virgola è stata già “scaricata”. Non ho idea di come si risolva il problema elegantemente. Ma ci penserò 😉

        Ciao
        Ivan

      • #121190
        MatteoF
        Partecipante
          Up
          0
          Down
          ::


          Grazie @ivan per la disponibilità.

          Nella fattispecie, prendo a pretesto la questione tipografica del campo “addendum” per approfondire una questione più generale riguardante il linguaggio LaTeX. Ovvero: mi domando se esista una sintassi che permetta di modificare più macro contemporaneamente, riguardo una porzione di codice comune.

          A voi tutti la parola 😉

          Matteo

        • #121191
          MatteoF
          Partecipante
            Up
            0
            Down
            ::


            Nella documentazione di [tt]biblatex[/tt] (§ 4.6.4 Miscellaneous Commands) viene spiegato il funzionamento del comando [tt]\letbibmacro[/tt], che permette di “copiare” il contenuto di una macro già definita.

            Dunque, posto che non esiste alcuna sintassi del tipo: `\renewbibmacro{foo, bar, baz, …}{}`il modo più efficiente e pratico per ridefinire più macro contenenti il medesimo codice è quello di ridefinire la prima macro e successivamente copiarne il contenuto.
            Riguardo la questione qui posta, le modifiche si concretizzano nel seguente codice:
            `
            \usepackage{xpatch}

            \xpatchbibmacro{addendum+pubstate}{\printfield{addendum}}{%
            \iffieldundef{addendum}{}{%
            \setunit{\addspace}
            \printtext[parens]{%
            \printfield{addendum}}}%
            }{}{}

            \letbibmacro{addendum+pubstate:article-inbook-incoll}{addendum+pubstate}
            \letbibmacro{addendum+pubstate:juris}{addendum+pubstate}
            `
            Matteo

            EDIT:

            Generalizzando il discorso alla sintassi [tt]LaTeX[/tt], dal 2020 esiste il comando [tt]NewCommandCopy[/tt]. È un comando di alto livello, praticamente il corrispondente [tt]LaTeX[/tt] di ciò che la primitiva \[tt]let[/tt] è per [tt]TeX[/tt]. Per maggiori informazioni si legga la newsletter LaTeX News Issue 32 e la guida usrguide3.pdf.

        Visualizzazione 2 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top