最近@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}