BibLaTeX: Bagaimana cara menghapus koma setelah "sekolah" di entri @tesis?

Aug 15 2020

Saya ingin menghapus koma di antara bidang "sekolah" dan tanggal (tahun) di entri bibliografi @thesis:

Inilah kode contoh minimal saya:

\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{*}

Saya sudah mencoba \renewbibmacro{institution+location+date}{...}, tetapi tidak berhasil. Saya cukup baru mengenal BibLaTeX.

Pikiran saya adalah bahwa numericgayanya menggunakan jenis entri dari standard, dari mana saya menyalin makro dan menghapus semua koma. Namun, itu jelas tidak berhasil. Bagaimana cara menghapus koma ini?

Jawaban

3 AlanMunn Aug 15 2020 at 22:37

Anda bisa menambahkan \nopuncttepat sebelum makro yang \newunitditentukan ulang institution+location+date. Saya telah mengubah kelas dokumen contoh Anda menjadi article. Terlepas dari namanya, minimalkelas dokumen sebaiknya tidak digunakan untuk MWE karena terlalu minim. Saya juga telah menghapus filecontentspaket tersebut, yang sekarang menjadi bagian dari kernel 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

Jawaban untuk Ubah urutan halaman dan tahun di Biblatex , yang kodenya sedang Anda gunakan, menggunakan instrumen yang cukup tumpul untuk memindahkan datepencetakan setelahnya pages. Ini mungkin bukan yang Anda inginkan atau butuhkan dalam semua situasi.

Berikut adalah penyiapan yang sedikit lebih rumit yang memindahkan tanggal hanya jika ada pages(atau a chapter), yang dapat menghasilkan keluaran yang bekerja sedikit lebih baik untuk Anda dalam beberapa situasi.

\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}

Seperti yang dijelaskan Alan dalam komentar di bawah jawabannya, biblatexpenanganan tanda baca tidak sinkron: Tanda baca disimpan dalam buffer dan hanya dicetak setelah diperlukan (yaitu ketika \print...perintah berikutnya benar-benar mencetak sesuatu). Karena dalam kode dalam pertanyaan \usebibmacro{date}in institution+location+datesebenarnya tidak mencetak tanggal, \setunitsebelum akhirnya tidak mengontrol tanda baca sebelum tanggal. Tanggal hanya dicetak dengan date:printin chapter+pages, di mana \setunitperintah lain akan menambahkan tanda baca yang berbeda ke dalam buffer.

\nopunctmenetapkan penanda permanen untuk tidak mencetak tanda baca apa pun hingga konten / teks baru dicetak dengan \print...perintah. Dalam hal ini membantu menekan periode yang tidak diinginkan. Karena \nopunctdapat digunakan di dalam dan di luar pelacak tanda baca, ini adalah alat yang berguna untuk mengubah tanda baca, tetapi saya biasanya mencoba menghindarinya dan lebih memilih solusi yang tidak menggunakannya, karena dapat memiliki efek yang melampaui apa yang diinginkan.