El nuevo comando cite se traga la puntuación

Aug 17 2020

Definí un nuevo comando cite para mostrar en shorttitlelugar de author- yearcombinación. El problema es que se traga el signo de puntuación que le sigue.

Intenté usarlo \DeclareCitePunctuationPosition, pero fue en vano.

¿Cómo puedo arreglar esto?

\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}

Respuestas

5 moewe Aug 17 2020 at 12:08

biblatex tiene un sistema muy sofisticado para evitar doble puntuación indeseable o choques de puntuación

En particular biblatex, suprimirá cualquier puntuación después de un período de finalización de una oración (punto). Entonces '.;' se convierte en solo '.'. El 'problema' es que no querría suprimir una coma o un punto y coma después de un punto que significa una abreviatura, entonces 'sv;' está perfectamente bien y no es necesario reducirlo a 'sv'. Desde el '.' tiene esencialmente dos funciones, tendrá que ayudar biblatexy decirle lo que quiere decir cuando escribe .. De forma predeterminada, se biblatexasume que a .es un punto. Si desea ingresar un punto de abreviatura, puede decir \adddoto simplemente .\isdot.

Por lo tanto, lo siguiente muestra 'sv;' muy bien.

\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 todos .los mensajes de correo electrónico que terminan en sus postnotes son puntos de abreviatura, puede automatizar esto modificando el postnoteformato del campo (la definición original se puede encontrar en 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}}%

Entonces puedes evitar tener que escribir \isdotcada vez que utilices s.v.en una nota posterior. Pero, por supuesto, eso significa que un .período que se supone que es un período de finalización de oración al final de la nota posterior no se reconocerá como tal.


Si lo utiliza con s.v.mucha frecuencia, es posible que desee definir un comando útil que evite la necesidad 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}