BibLaTeX: Jak mogę usunąć przecinek po słowie „szkoła” we wpisie @thesis?
Chcę usunąć przecinek między polem „szkoła” a datą (rokiem) we wpisie bibliograficznym @thesis:
Oto mój minimalny przykładowy kod:
\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{*}
Próbowałem już \renewbibmacro{institution+location+date}{...}
, ale to nie zadziałało. Jestem całkiem nowy w BibLaTeX.
Pomyślałem, że numeric
styl wykorzystuje typy wpisów z standard
, skąd skopiowałem makro i usunąłem wszystkie przecinki. Jednak to najwyraźniej nie zadziałało. Jak mogę usunąć ten przecinek?
Odpowiedzi
Możesz dodać \nopunct
tuż przed \newunit
przedefiniowanym institution+location+date
makrem. Zmieniłem klasę dokumentu twojego przykładu na article
. Pomimo swojej nazwy, minimal
klasa dokumentu nie powinna być używana dla MWE, ponieważ w rzeczywistości jest zbyt minimalna. Usunąłem również filecontents
pakiet, który jest teraz częścią jądra 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}
Odpowiedź na zmianę kolejności stron i roku w Biblatexie , którego kodu używasz, używa dość tępych narzędzi, aby przesunąć date
wydruk pages
. Może to nie być dokładnie to, czego chcesz lub potrzebujesz we wszystkich sytuacjach.
Oto nieco bardziej złożona konfiguracja, która przesuwa datę tylko wtedy, gdy istnieje pages
(lub a chapter
), co może spowodować, że dane wyjściowe będą działać nieco lepiej w niektórych sytuacjach.
\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}
Jak wyjaśnił Alan w komentarzach pod swoją odpowiedzią, biblatex
obsługa interpunkcji jest asynchroniczna: interpunkcja jest przechowywana w buforze i drukowana tylko wtedy, gdy jest potrzebna (tj. Kiedy następne \print...
polecenie faktycznie coś drukuje). Ponieważ w kodzie w pytaniu \usebibmacro{date}
in institution+location+date
tak naprawdę nie drukuje daty, \setunit
przed nie kontroluje ostatecznie interpunkcji przed datą. Data jest drukowana tylko przez date:print
in chapter+pages
, w którym to momencie inne \setunit
polecenia dodają inną interpunkcję do bufora.
\nopunct
ustawia marker permanentny, aby nie drukować żadnych znaków interpunkcyjnych, dopóki nowa treść / tekst nie zostanie wydrukowana za pomocą \print...
polecenia. W tym przypadku pomaga powstrzymać niepożądany okres. Ponieważ \nopunct
można go używać wewnątrz i na zewnątrz modułu do śledzenia interpunkcji, jest to przydatne narzędzie do modyfikowania interpunkcji, ale generalnie staram się tego unikać i preferuję rozwiązania, które go nie używają, ponieważ mogą mieć efekty wykraczające poza to, co jest pożądane.