O novo comando citar engole a pontuação

Aug 17 2020

Eu defini um novo comando cite para mostrar em shorttitlevez de author- yearcombinação. O problema é que engole o sinal de pontuação que o segue.

Tentei usar \DeclareCitePunctuationPosition, mas não adiantou.

Como posso consertar isso?

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

Respostas

5 moewe Aug 17 2020 at 12:08

biblatex tem um sistema muito sofisticado para evitar pontuação dupla indesejável ou choques de pontuação.

Em particular, biblatexirá suprimir qualquer pontuação após um ponto final de frase (ponto final). Então '.;' torna-se apenas '.'. O 'problema' é que você não deseja suprimir uma vírgula ou ponto-e-vírgula após um ponto que significa uma abreviação, então 'sv;' está perfeitamente bem e não precisa ser reduzido a 'sv'. Desde o '.' tem essencialmente duas funções, você terá que ajudar biblatexe dizer o que você quer dizer ao digitar .. Por padrão, biblatexassume que a .é um período. Se quiser inserir uma abreviatura ponto, você pode dizer \adddotou apenas .\isdot.

Portanto, o seguinte exibe 'sv;' bem.

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


Se todos os .s que terminam suas notas de postagem forem pontos de abreviatura, você pode automatizar isso modificando o postnoteformato do campo (a definição original pode ser encontrada em 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}}%

Assim, você pode evitar ter que escrever \isdotsempre que usar s.v.uma nota de postagem. Mas é claro que isso significa que um .que deveria ser um ponto final de frase no final da nota de postagem não será reconhecido como tal.


Se estiver usando s.v.com frequência, você pode definir um comando prático para ele que evite a necessidade 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}