BibLaTeX: Как убрать запятую после слова «школа» в записи @thesis?
Я хочу удалить запятую между полем "школа" и датой (годом) в библиографической записи @thesis:

Вот мой минимальный пример кода:
\documentclass{minimal}
\usepackage{ngerman}
\usepackage[backend = biber, style = numeric]{biblatex}
%%%%%%%% https://tex.stackexchange.com/a/492917
\newtoggle{bbx:datemissing}
\renewbibmacro*{date}{\toggletrue{bbx:datemissing}%}
\renewbibmacro{volume+number+eid}{%
\printfield{volume}%
\setunit{\addcomma\space}%
\printfield{eid}}
\renewbibmacro*{issue+date}{%
\toggletrue{bbx:datemissing}%
\iffieldundef{issue}{}{
\printtext[parens]{%
\printfield{issue}}}%
\newunit}
\newbibmacro*{date:print}{%
\togglefalse{bbx:datemissing}%
\printdate}
\renewbibmacro*{chapter+pages}{%
\printfield{chapter}%
\setunit{\bibpagespunct}%
\printfield{pages}%
\newunit
\usebibmacro{date:print}%
\newunit}
\renewbibmacro*{note+pages}{%
\printfield{note}%
\setunit{\bibpagespunct}%
\printfield{pages}%
\newunit
\usebibmacro{date:print}%
\newunit}
%%%%%%%%
%%% This is what I came up with
\renewbibmacro{institution+location+date}{%
\printlist{location}%
\iflistundef{institution}{%
\setunit*{\space}%
}{%
\setunit*{\addcolon\space}%
}%
\printlist{institution}%
\setunit*{\space}%
\usebibmacro{date}%
\newunit%
}
\usepackage{filecontents}
\begin{filecontents*}{lit.bib}
@thesis {mythesis,
author = {Me, I.},
school = {University},
title = {Sometitle},
type = {Phd thesis},
year = {123}
}
\end{filecontents*}
\addbibresource{lit.bib}
\begin{document}
\printbibliography
\end{document}
\nocite{*}
Я уже пробовал \renewbibmacro{institution+location+date}{...}
, но ничего не вышло. Я новичок в BibLaTeX.
Я думал, что в numeric
стиле используются типы записей standard
, откуда я скопировал макрос и удалил все запятые. Однако это явно не сработало. Как убрать эту запятую?
Ответы
Вы можете добавить его \nopunct
непосредственно перед \newunit
переопределенным institution+location+date
макросом. Я изменил класс документа вашего примера на article
. Несмотря на свое название, minimal
класс документа не следует использовать для MWE, поскольку он на самом деле слишком минимален. Я также удалил filecontents
пакет, который теперь является частью ядра LaTeX.
\documentclass{article}
\usepackage{ngerman}
\usepackage[backend = biber, style = numeric]{biblatex}
\newtoggle{bbx:datemissing}
\renewbibmacro*{date}{\toggletrue{bbx:datemissing}}
\renewbibmacro{volume+number+eid}{%
\printfield{volume}%
\setunit{\addcomma\space}%
\printfield{eid}}
\renewbibmacro*{issue+date}{%
\toggletrue{bbx:datemissing}%
\iffieldundef{issue}{}{
\printtext[parens]{%
\printfield{issue}}}%
\newunit}
\newbibmacro*{date:print}{%
\togglefalse{bbx:datemissing}%
\printdate}
\renewbibmacro*{chapter+pages}{%
\printfield{chapter}%
\setunit{\bibpagespunct}%
\printfield{pages}%
\newunit
\usebibmacro{date:print}%
\newunit}
\renewbibmacro*{note+pages}{%
\printfield{note}%
\setunit{\bibpagespunct}%
\printfield{pages}%
\newunit
\usebibmacro{date:print}%
\newunit}
%%% This is what I came up with
\renewbibmacro{institution+location+date}{%
\printlist{location}%
\iflistundef{institution}{%
\setunit*{\space}%
}{%
\setunit*{\space}%
}%
\printlist{institution}%
\setunit*{\space}%
\usebibmacro{date}%
\nopunct\newunit%
}
\begin{filecontents*}[overwrite]{\jobname.bib}
@thesis {mythesis,
author = {Me, I.},
school = {University of Somewhere},
title = {Sometitle},
type = {Phd thesis},
year = {1980}
}
\end{filecontents*}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}

Ответ на изменение порядка страниц и года в Biblatex , код которого вы используете, использует довольно грубые инструменты для перемещения date
печати после pages
. Это может быть не совсем то, что вам нужно или нужно во всех ситуациях.
Вот немного более сложная настройка, которая перемещает дату только в том случае, если есть pages
(или chapter
), что может привести к выводу, который в некоторых ситуациях работает для вас немного лучше.
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[backend=biber, style=numeric]{biblatex}
\newtoggle{bbx:datesuppressed}
\renewbibmacro*{date}{%
\ifboolexpr{
test {\iffieldundef{pages}}
and test {\iffieldundef{chapter}}}
{\printdate}
{\toggletrue{bbx:datesuppressed}}}
\renewbibmacro{volume+number+eid}{%
\printfield{volume}%
\setunit{\addcomma\space}%
\printfield{eid}}
\renewbibmacro*{issue+date}{%
\toggletrue{bbx:datesuppressed}%
\iffieldundef{issue}
{}
{\printtext[parens]{%
\printfield{issue}}}%
\newunit}
\newbibmacro*{date:print}{%
\iftoggle{bbx:datesuppressed}
{\togglefalse{bbx:datesuppressed}%
\printdate}
{}}
\renewbibmacro*{chapter+pages}{%
\printfield{chapter}%
\setunit{\bibpagespunct}%
\printfield{pages}%
\newunit
\usebibmacro{date:print}%
\newunit}
\renewbibmacro*{note+pages}{%
\printfield{note}%
\setunit{\bibpagespunct}%
\printfield{pages}%
\newunit
\usebibmacro{date:print}%
\newunit}
\renewbibmacro{institution+location+date}{%
\printlist{location}%
\iflistundef{institution}
{\setunit*{\space}}
{\setunit*{\addcolon\space}}%
\printlist{institution}%
\setunit*{\space}%
\usebibmacro{date}%
\newunit
}
\begin{filecontents*}{\jobname.bib}
@phdthesis{mythesis,
author = {Me, I.},
school = {University},
title = {Sometitle},
year = {123},
}
\end{filecontents*}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
\nocite{mythesis,sigfridsson,westfahl:space}
\printbibliography
\end{document}

Как объяснил Алан в комментариях под своим ответом, biblatex
обработка знаков препинания является асинхронной: знаки пунктуации хранятся в буфере и печатаются только тогда, когда они необходимы (т.е. когда следующая \print...
команда действительно что-то выводит). Поскольку в коде в вопросе \usebibmacro{date}
in institution+location+date
фактически не печатает дату, \setunit
он не контролирует пунктуацию перед датой. Дата печатается только через date:print
in chapter+pages
, после чего другие \setunit
команды добавят в буфер другие знаки препинания.
\nopunct
устанавливает постоянный маркер, чтобы не печатать знаки препинания, пока новый контент / текст не будет напечатан \print...
командой. В этом случае помогает подавить нежелательный период. Поскольку \nopunct
его можно использовать как внутри, так и за пределами трекера пунктуации, это удобный инструмент для настройки знаков препинания, но я обычно стараюсь избегать его и предпочитаю решения, не использующие его, так как он может иметь эффекты, выходящие за рамки желаемого.