根据 moewe 的回答进行更新

根据 moewe 的回答进行更新

最近@moewe 好心地制作了自定义代码,以便为文章和书籍章节的首次引用添加完整的页面范围

这段代码运行良好,但导致了一个我刚刚注意到的小错误:当引用的输出以右括号结尾时(例如,书籍或博士论文的引用),后面的标点符号会从分号更改为逗号。

输出:

在此处输入图片描述

期望输出:相同,但第一个引文后用分号代替逗号

有没有简单的方法可以解决这个问题?我看到自定义代码使用了\addcomma两次,但我不确定这是否是问题所在或如何更改它。

梅威瑟:

\documentclass{article}

\usepackage[notes]{biblatex-chicago}
\addbibresource{biblatex-examples.bib}

\DefineBibliographyStrings{english}{
  thiscite = {at},
}

\newtoggle{cbxchic:hadpages}

\renewbibmacro*{fullpostnote}{%
  \global\toggletrue{cbxchic:hadpages}%
  \iffieldundef{chapter}%
   {\iffieldundef{pages}%
      {\postnotewrapper
       \global\togglefalse{cbxchic:hadpages}}%
      {\postnotedelim%
        \printfield{pages}}}%
   {\postnotedelim%
    \printfield{chapter}}%
  \ifboolexpr{
      test {\ifnumequal{\value{citecount}}{\value{citetotal}}}
      and
      test {\iffieldpages{postnote}}
      and
      togl {cbxchic:hadpages}
    }
    {\setunit{\addcomma\space}%
     \bibstring{thiscite}%
     \setunit{\addspace}}
    {}%
  \usebibmacro{semel:postnote}}

\renewbibmacro*{eid+fullpostnote}{%
  \global\toggletrue{cbxchic:hadpages}%
  \iffieldundef{chapter}%
    {\iffieldundef{pages}%
      {\iffieldundef{eid}%
        {\postnotewrapper
         \global\togglefalse{cbxchic:hadpages}}%
        {\postnotedelim%
          \printfield{eid}%
          \clearfield{eid}}}%
      {\postnotedelim%
        \printfield{pages}}}%
    {\postnotedelim%
      \printfield{chapter}}%
  \ifboolexpr{
      test {\ifnumequal{\value{citecount}}{\value{citetotal}}}
      and
      test {\iffieldpages{postnote}}
      and
      togl {cbxchic:hadpages}
    }
    {\setunit{\addcomma\space}%
     \bibstring{thiscite}%
     \setunit{\addspace}}
    {}%
  \usebibmacro{semel:postnote}}

\begin{document}
\cite{worman};
\cite{hyman}.
\end{document}

根据 moewe 的回答进行更新

@moewe 的以下回答解决了我提出的问题,但似乎又产生了一个新问题:当一本书(或以右括号结尾的任何其他输出,包括博士论文或 bib 条目中页面范围为空白的文章)在第一次引用时引用页面,页面引用出现在右括号后,没有逗号或空格。

因此例如基于@moewe 的回答但添加了最终的 book-citation-with-page 的代码的输出是:

在此处输入图片描述

产生该输出的代码:

\documentclass{article}

\usepackage[notes]{biblatex-chicago}
\addbibresource{biblatex-examples.bib}

\DefineBibliographyStrings{english}{
  thiscite = {at},
}

\newtoggle{cbxchic:hadpages}

\renewbibmacro*{fullpostnote}{%
  \global\toggletrue{cbxchic:hadpages}%
  \iffieldundef{chapter}%
   {\iffieldundef{pages}%
      {\global\togglefalse{cbxchic:hadpages}}%
      {\postnotedelim%
        \printfield{pages}}}%
   {\postnotedelim%
    \printfield{chapter}}%
  \ifboolexpr{
      test {\ifnumequal{\value{citecount}}{\value{citetotal}}}
      and
      test {\iffieldpages{postnote}}
      and
      togl {cbxchic:hadpages}
    }
    {\setunit{\addcomma\space}%
     \bibstring{thiscite}%
     \setunit{\addspace}}
    {}%
  \usebibmacro{semel:postnote}}

\renewbibmacro*{eid+fullpostnote}{%
  \global\toggletrue{cbxchic:hadpages}%
  \iffieldundef{chapter}%
    {\iffieldundef{pages}%
      {\iffieldundef{eid}%
        {\global\togglefalse{cbxchic:hadpages}}%
        {\postnotedelim%
          \printfield{eid}%
          \clearfield{eid}}}%
      {\postnotedelim%
        \printfield{pages}}}%
    {\postnotedelim%
      \printfield{chapter}}%
  \ifboolexpr{
      test {\ifnumequal{\value{citecount}}{\value{citetotal}}}
      and
      test {\iffieldpages{postnote}}
      and
      togl {cbxchic:hadpages}
    }
    {\setunit{\addcomma\space}%
     \bibstring{thiscite}%
     \setunit{\addspace}}
    {}%
  \usebibmacro{semel:postnote}}

\begin{document}
\cite{worman};
\cite{hyman}.

\citereset
\cite{worman,hyman}.

\citereset
\cite[20]{worman}.
\end{document}

为了清楚起见,这里列出了我能想到的所有需要​​处理的情况(所有都是首次引用,因为简短的引用不会出现问题):

  • 没有页码引用的书籍:后续标点符号应保留,或在多页引用的情况下,视情况使用分号或句号,而不是逗号

作者,标题(剑桥:剑桥大学出版社,2000 年);……

  • 页面引用:括号后应为逗号空格,然后是页面

作者,标题(剑桥:剑桥大学出版社,2000 年),35

  • 博士论文:与书相同

作者,“标题”(博士论文,亚利桑那州立大学,2000 年);......

作者,《标题》(亚利桑那州立大学博士论文,2000 年),35

  • 未指定页面范围的文章:输出末尾不应有冒号,后续标点符号应保留不变/呈现为分号或句号

作者,“标题”,杂志12,第1号(1910年);......

作者,“标题”,杂志12,第 1 期(1910 年):40 [当引用文章中的特定页面时,其完整页码范围未知/未指定]

  • 未指定页码范围的书籍章节:相同

作者,“标题”,,编辑(剑桥:剑桥大学出版社,2020 年);......

作者,“标题”,,编辑(剑桥:剑桥大学出版社,2020 年),22 [引用书籍章节中的特定页面时,其完整页码范围未知/未指定]

可能还有我没有想到的其他情况,但希望这是一个好的开始。

答案1

请尝试以下操作。

\documentclass{article}

\usepackage[notes]{biblatex-chicago}
\addbibresource{biblatex-examples.bib}

\DefineBibliographyStrings{english}{
  thiscite = {at},
}

\newtoggle{cbxchic:hadpages}


\renewbibmacro*{fullpostnote}{%
  \global\toggletrue{cbxchic:hadpages}%
  \iffieldundef{chapter}%
   {\iffieldundef{pages}%
      {\global\togglefalse{cbxchic:hadpages}}%
      {\postnotedelim%
        \printfield{pages}}}%
   {\postnotedelim%
    \printfield{chapter}}%
  \ifboolexpr{
      test {\ifnumequal{\value{citecount}}{\value{citetotal}}}
      and
      test {\iffieldpages{postnote}}
      and
      togl {cbxchic:hadpages}
    }
    {\setunit{\addcomma\space}%
     \bibstring{thiscite}%
     \setunit{\addspace}}
    {\iffieldundef{postnote}{}{\postnotewrapper}}%
  \usebibmacro{semel:postnote}}

\renewbibmacro*{eid+fullpostnote}{%
  \global\toggletrue{cbxchic:hadpages}%
  \iffieldundef{chapter}%
    {\iffieldundef{pages}%
      {\iffieldundef{eid}%
        {\global\togglefalse{cbxchic:hadpages}}%
        {\postnotedelim%
          \printfield{eid}%
          \clearfield{eid}}}%
      {\postnotedelim%
        \printfield{pages}}}%
    {\postnotedelim%
      \printfield{chapter}}%
  \ifboolexpr{
      test {\ifnumequal{\value{citecount}}{\value{citetotal}}}
      and
      test {\iffieldpages{postnote}}
      and
      togl {cbxchic:hadpages}
    }
    {\setunit{\addcomma\space}%
     \bibstring{thiscite}%
     \setunit{\addspace}}
    {\iffieldundef{postnote}{}{\postnotewrapper}}%
  \usebibmacro{semel:postnote}}


\begin{document}
\cite{worman};
\cite{hyman}.

\citereset
\cite{worman,hyman}.

\citereset
\cite[162]{hyman}

\citereset
\cite[20]{worman}.
\end{document}

Nancy Worman,《人物性格:希腊文学风格》(奥斯汀:得克萨斯大学出版社,2002 年);Arthur Hyman,《亚里士多德的理智理论及其由阿威罗伊所作的诠释》,《亚里士多德研究》,Dominic J. O'Meara 主编,《哲学和哲学史研究》第 9 卷(华盛顿特区:美国天主教大学出版社,1981 年),第 161–191 页。

相关内容