BibLaTeX: Jak mogę usunąć przecinek po słowie „szkoła” we wpisie @thesis?

Aug 15 2020

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 numericstyl 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

3 AlanMunn Aug 15 2020 at 22:37

Możesz dodać \nopuncttuż przed \newunitprzedefiniowanym institution+location+datemakrem. Zmieniłem klasę dokumentu twojego przykładu na article. Pomimo swojej nazwy, minimalklasa dokumentu nie powinna być używana dla MWE, ponieważ w rzeczywistości jest zbyt minimalna. Usunąłem również filecontentspakiet, 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}

2 moewe Aug 16 2020 at 10:45

Odpowiedź na zmianę kolejności stron i roku w Biblatexie , którego kodu używasz, używa dość tępych narzędzi, aby przesunąć datewydruk 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ą, biblatexobsł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+datetak naprawdę nie drukuje daty, \setunitprzed nie kontroluje ostatecznie interpunkcji przed datą. Data jest drukowana tylko przez date:printin chapter+pages, w którym to momencie inne \setunitpolecenia dodają inną interpunkcję do bufora.

\nopunctustawia 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ż \nopunctmoż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.