La nouvelle commande citer avale la ponctuation

Aug 17 2020

J'ai défini une nouvelle commande cite à afficher shorttitleau lieu de author- yearcombinaison. Le problème est qu'il avale le signe de ponctuation qui le suit.

J'ai essayé d'utiliser \DeclareCitePunctuationPosition, mais en vain.

Comment puis-je réparer cela?

\documentclass{article}
\usepackage{biblatex-chicago}

\DeclareCiteCommand{\citeabbr}
{\usebibmacro{cite:init}%
  \usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \printtext[bibhyperref]{\textit{\printfield{shorttitle}}}}
  {\multicitedelim}
  {\usebibmacro{postnote}}
  
\DeclareCitePunctuationPosition{\citeabbr}{r} % doesn't work

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Howlett1975,
  title = {Dictionary of Medieval Latin from British Sources},
  shorttitle = {DMLBS},
  editor = {Howlett, D.R.},
  date = {1975/2013},
  publisher = {Oxford University Press},
  location = {Oxford},
  addendum = {DMLBS},
}
\end{filecontents}

\addbibresource{\jobname.bib}
\usepackage{hyperref}    

\begin{document}
  \citeabbr[s.v.]{Howlett1975}; this cite command has swallowed my semicolon.
\end{document}

Réponses

5 moewe Aug 17 2020 at 12:08

biblatex dispose d'un système très sophistiqué pour éviter les doubles ponctuations indésirables ou les conflits de ponctuation.

En particulier biblatex, supprimera toute ponctuation après une période de fin de phrase (point). Alors '.;' devient juste «.». Le "problème" est que vous ne voudriez pas supprimer une virgule ou un point-virgule après un point signifiant une abréviation, donc "sv;" est parfaitement bien et n'a pas besoin d'être réduit à «sv». Depuis le '.' a essentiellement deux fonctions, vous devrez aider biblatexet lui dire ce que vous voulez dire lorsque vous tapez .. Par défaut, biblatexsuppose que a .est un point. Si vous souhaitez saisir un point d'abréviation, vous pouvez dire \adddotou simplement .\isdot.

Par conséquent, les affichages suivants 'sv;' ça va.

\documentclass{article}
\usepackage{biblatex-chicago}

\DeclareCiteCommand{\citeabbr}
  {\usebibmacro{cite:init}%
   \usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \printtext[bibhyperref]{\printfield[emph]{shorttitle}}}
  {\multicitedelim}
  {\usebibmacro{postnote}}


\begin{filecontents}{\jobname.bib}
@book{Howlett1975,
  title = {Dictionary of Medieval Latin from British Sources},
  shorttitle = {DMLBS},
  editor = {Howlett, D.R.},
  date = {1975/2013},
  publisher = {Oxford University Press},
  location = {Oxford},
  addendum = {DMLBS},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\usepackage{hyperref}

\begin{document}
  \citeabbr[s.v.\isdot]{Howlett1975}; this cite command has swallowed my semicolon.
\end{document}


Si tous les .s qui terminent vos notes de publication sont des points d'abréviation, vous pouvez automatiser cela en modifiant le postnoteformat du champ (la définition d'origine se trouve dans chicago-notes.cbx)

\DeclareFieldFormat{postnote}{% Changed for page compression option
  \ifboolexpr{%
    togl {cms@comprange}%
    and
    test {\ifpages{#1}}%
  }%
  {\iffieldundef{pagination}%
    {\mkcomprange{#1}}%
    {\mkcomprange[{\mkpageprefix[pagination]}]{#1}}}%
  {\iffieldundef{pagination}%
    {#1}%
    {\mkpageprefix[pagination]{#1}}%
   \isdot}}%

Ensuite, vous pouvez éviter d'avoir à écrire \isdotchaque fois que vous utilisez s.v.dans une note de publication. Mais bien sûr, cela signifie qu'un .qui est censé être une période de fin de phrase à la fin de la note ne sera pas reconnu comme tel.


Si vous utilisez s.v.très souvent, vous voudrez peut-être définir une commande pratique qui évite le besoin de \isdot.

\documentclass{article}
\usepackage{biblatex-chicago}

\DeclareCiteCommand{\citeabbr}
  {\usebibmacro{cite:init}%
   \usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \printtext[bibhyperref]{\printfield[emph]{shorttitle}}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\NewBibliographyString{sv}
\DefineBibliographyStrings{english}{
  sv = {s\adddot v\adddot},
}
\newcommand*{\sv}{\bibstring{sv}}

\begin{filecontents}{\jobname.bib}
@book{Howlett1975,
  title = {Dictionary of Medieval Latin from British Sources},
  shorttitle = {DMLBS},
  editor = {Howlett, D.R.},
  date = {1975/2013},
  publisher = {Oxford University Press},
  location = {Oxford},
  addendum = {DMLBS},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\usepackage{hyperref}


\begin{document}
  \citeabbr[\sv]{Howlett1975}; this cite command has swallowed my semicolon.
\end{document}