BibLaTeX: Comment puis-je supprimer la virgule après «école» dans l'entrée @thesis?

Aug 15 2020

Je souhaite supprimer la virgule entre le champ "école" et la date (année) dans une entrée de bibliographie @thesis:

Voici mon exemple de code minimal:

\documentclass{minimal}

\usepackage{ngerman}
\usepackage[backend = biber, style = numeric]{biblatex}

%%%%%%%% https://tex.stackexchange.com/a/492917

\newtoggle{bbx:datemissing}

\renewbibmacro*{date}{\toggletrue{bbx:datemissing}%}

\renewbibmacro{volume+number+eid}{%
  \printfield{volume}%
  \setunit{\addcomma\space}%
  \printfield{eid}}

\renewbibmacro*{issue+date}{%
  \toggletrue{bbx:datemissing}%
  \iffieldundef{issue}{}{
    \printtext[parens]{%
    \printfield{issue}}}%
  \newunit}

\newbibmacro*{date:print}{%
  \togglefalse{bbx:datemissing}%
  \printdate}

\renewbibmacro*{chapter+pages}{%
  \printfield{chapter}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \usebibmacro{date:print}%
  \newunit}

\renewbibmacro*{note+pages}{%
  \printfield{note}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \usebibmacro{date:print}%
  \newunit}

%%%%%%%%

%%% This is what I came up with
\renewbibmacro{institution+location+date}{%
  \printlist{location}%
  \iflistundef{institution}{%
    \setunit*{\space}%
  }{%
    \setunit*{\addcolon\space}%
  }%
  \printlist{institution}%
  \setunit*{\space}%
  \usebibmacro{date}%
  \newunit%
}

\usepackage{filecontents}
\begin{filecontents*}{lit.bib}
  @thesis {mythesis,
    author = {Me, I.},
    school = {University},
    title = {Sometitle},
    type = {Phd thesis},
    year = {123}
  }  
\end{filecontents*}

\addbibresource{lit.bib}

\begin{document}
\printbibliography
\end{document}
\nocite{*}

J'ai déjà essayé \renewbibmacro{institution+location+date}{...}, mais cela n'a pas fonctionné. Je suis assez nouveau sur BibLaTeX.

Ma pensée était que le numericstyle utilise les types d'entrée à partir de standard, d'où j'ai copié la macro et supprimé toutes les virgules. Cependant, cela n'a manifestement pas fonctionné. Comment supprimer cette virgule?

Réponses

3 AlanMunn Aug 15 2020 at 22:37

Vous pouvez ajouter \nopunctjuste avant le \newunitde votre institution+location+datemacro redéfinie . J'ai changé la classe de document de votre exemple en article. Malgré son nom, la minimalclasse de document ne doit pas être utilisée pour les MWE car elle est en fait trop minimale. J'ai également supprimé le filecontentspaquet, qui fait maintenant partie du noyau LaTeX.

\documentclass{article}

\usepackage{ngerman}
\usepackage[backend = biber, style = numeric]{biblatex}

\newtoggle{bbx:datemissing}

\renewbibmacro*{date}{\toggletrue{bbx:datemissing}}

\renewbibmacro{volume+number+eid}{%
  \printfield{volume}%
  \setunit{\addcomma\space}%
  \printfield{eid}}

\renewbibmacro*{issue+date}{%
  \toggletrue{bbx:datemissing}%
  \iffieldundef{issue}{}{
    \printtext[parens]{%
    \printfield{issue}}}%
  \newunit}

\newbibmacro*{date:print}{%
  \togglefalse{bbx:datemissing}%
  \printdate}

\renewbibmacro*{chapter+pages}{%
  \printfield{chapter}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \usebibmacro{date:print}%
  \newunit}

\renewbibmacro*{note+pages}{%
  \printfield{note}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \usebibmacro{date:print}%
  \newunit}
%%% This is what I came up with
\renewbibmacro{institution+location+date}{%
  \printlist{location}%
  \iflistundef{institution}{%
    \setunit*{\space}%
  }{%
    \setunit*{\space}%
  }%
  \printlist{institution}%
  \setunit*{\space}%
  \usebibmacro{date}%
  \nopunct\newunit%
}

\begin{filecontents*}[overwrite]{\jobname.bib}
  @thesis {mythesis,
    author = {Me, I.},
    school = {University of Somewhere},
    title = {Sometitle},
    type = {Phd thesis},
    year = {1980}
  }  
\end{filecontents*}

\addbibresource{\jobname.bib}

\begin{document}
\nocite{*}
\printbibliography
\end{document}

2 moewe Aug 16 2020 at 10:45

La réponse à Changer l'ordre des pages et de l'année dans Biblatex , dont vous utilisez le code, utilise des instruments assez émoussés pour déplacer l' dateimpression après pages. Cela peut ne pas être exactement ce que vous voulez ou ce dont vous avez besoin dans toutes les situations.

Voici une configuration légèrement plus complexe qui ne déplace la date que s'il y en a pages(ou a chapter), ce qui peut entraîner une sortie qui fonctionne légèrement mieux pour vous dans certaines situations.

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[backend=biber, style=numeric]{biblatex}

\newtoggle{bbx:datesuppressed}

\renewbibmacro*{date}{%
  \ifboolexpr{
        test {\iffieldundef{pages}}
    and test {\iffieldundef{chapter}}}
    {\printdate}
    {\toggletrue{bbx:datesuppressed}}}

\renewbibmacro{volume+number+eid}{%
  \printfield{volume}%
  \setunit{\addcomma\space}%
  \printfield{eid}}

\renewbibmacro*{issue+date}{%
  \toggletrue{bbx:datesuppressed}%
  \iffieldundef{issue}
    {}
    {\printtext[parens]{%
       \printfield{issue}}}%
  \newunit}

\newbibmacro*{date:print}{%
  \iftoggle{bbx:datesuppressed}
    {\togglefalse{bbx:datesuppressed}%
     \printdate}
    {}}

\renewbibmacro*{chapter+pages}{%
  \printfield{chapter}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \usebibmacro{date:print}%
  \newunit}

\renewbibmacro*{note+pages}{%
  \printfield{note}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit
  \usebibmacro{date:print}%
  \newunit}

\renewbibmacro{institution+location+date}{%
  \printlist{location}%
  \iflistundef{institution}
    {\setunit*{\space}}
    {\setunit*{\addcolon\space}}%
  \printlist{institution}%
  \setunit*{\space}%
  \usebibmacro{date}%
  \newunit
}

\begin{filecontents*}{\jobname.bib}
@phdthesis{mythesis,
  author = {Me, I.},
  school = {University},
  title  = {Sometitle},
  year   = {123},
}  
\end{filecontents*}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}

\begin{document}
\nocite{mythesis,sigfridsson,westfahl:space}
\printbibliography
\end{document}

Comme Alan l'a expliqué dans les commentaires sous sa réponse, biblatexla gestion de la ponctuation est asynchrone: la ponctuation est stockée dans un tampon et n'est imprimée qu'une fois qu'elle est nécessaire (c'est-à-dire lorsque la \print...commande suivante imprime réellement quelque chose). Puisque dans le code de la question, le \usebibmacro{date}in institution+location+daten'imprime pas réellement la date, l' \setunitavant il ne contrôle finalement pas la ponctuation avant la date. La date n'est imprimée que par date:printin chapter+pages, auquel point d'autres \setunitcommandes auront ajouté une ponctuation différente dans la mémoire tampon.

\nopunctdéfinit un marqueur permanent pour ne pas imprimer de ponctuation tant que le nouveau contenu / texte n'est pas imprimé par une \print...commande. Dans ce cas, cela aide à supprimer la période indésirable. Puisqu'il \nopunctpeut être utilisé à l'intérieur et à l'extérieur du traqueur de ponctuation, c'est un outil pratique pour modifier la ponctuation, mais j'essaie généralement de l'éviter et de préférer les solutions qui ne l'utilisent pas, car il peut avoir des effets qui vont au-delà de ce que l'on souhaite.