Новая команда cite игнорирует знаки препинания

Aug 17 2020

Я определил новую команду cite для показа shorttitleвместо author- yearкомбинации. Проблема в том, что он проглатывает следующий за ним знак препинания.

Я пробовал пользоваться \DeclareCitePunctuationPosition, но безуспешно.

Как я могу это исправить?

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

Ответы

5 moewe Aug 17 2020 at 12:08

biblatex имеет очень сложную систему, позволяющую избежать нежелательных двойных знаков препинания или противоречий в пунктуации.

В частности, biblatexбудет подавлена ​​всякая пунктуация после точки в конце предложения (точка). Так '.;' становится просто '.'. «Проблема» в том, что вы не хотите убирать запятую или точку с запятой после точки, обозначающей сокращение, поэтому «sv;» совершенно нормально, и его не нужно сокращать до sv. Поскольку '.' по существу имеет две функции, вам нужно будет помочь biblatexи рассказать, что вы имеете в виду, когда печатаете .. По умолчанию biblatexпредполагается, что .это точка. Если вы хотите ввести точку аббревиатуры, вы можете сказать \adddotили просто .\isdot.

Следовательно, следующие символы отображаются «sv;» просто хорошо.

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


Если все .символы, заканчивающиеся на ваших пост-примечаниях, представляют собой точки с сокращениями, вы можете автоматизировать это, изменив postnoteформат поля (исходное определение можно найти в 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}}%

Тогда вам не придется писать \isdotкаждый раз, когда вы используете s.v.сообщение. Но, конечно, это означает, .что точка, которая должна быть точкой окончания предложения в конце пост-примечания, не будет признана таковой.


Если вы используете s.v.очень часто, вы можете определить для него удобную команду, которая избавит вас от необходимости \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}