![Различать все типы записей в библатексе (например, mathesis и phdthesis)](https://rvso.com/image/335494/%D0%A0%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%B0%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D1%82%D0%B8%D0%BF%D1%8B%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9%20%D0%B2%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B0%D1%82%D0%B5%D0%BA%D1%81%D0%B5%20(%D0%BD%D0%B0%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%2C%20mathesis%20%D0%B8%20phdthesis).png)
Недавно я перешел на biblatex, который пока что великолепен, но не так прост, как bibtex. Я столкнулся с проблемой, которую не смог решить до сих пор:
Моя библиография содержит reports, techreports, mastersthesis
и phdthesis,
кроме некоторых articles
и books
. Как написано в документе biblatex, первые два сопоставлены с @reports
, а третий и четвертый сопоставлены с @thesis
. Причина этого кажется неясной, и поскольку у меня есть разные параметры форматирования для четырех записей, объединить их невозможно. Комбинация, похоже, организована в соответствии с biblatex.def
Поскольку \DeclareDriverSourceMap
я сам работал над определением собственного *.bbx
файла для пользовательского стиля библиографии, я также определил разные виды для всех четырех записей.
\DeclareBibliographyDriver{report}{ ...
...
\DeclareBibliographyDriver{phdthesis}{...
Но biblatex все равно ссылается на biblatex.def
и игнорирует мои записи. Как я могу подавить или обновить команды в \DeclareDriverSourceMap
разделе? Предпочтительным вариантом было бы добавить какой-то код в *.bbx
файл, если это невозможно, также преамбула пошла бы. Но с моим MWE повторное объявление в преамбуле, похоже, невозможно.
Вот MWE:
\begin{filecontents*}{Beispielbibliographie.bib}
@PHDTHESIS{Mus15,
Title = {Doktorarbeit ABC},
Author = {Wax Mustermann},
School = {XY Universität},
Year = {2015},
Note = {ISBN unbekannt},
}
@MASTERSTHESIS{Mus10,
Title = {Bachelorarbeit DEF},
Author = {Martina Musterfrau},
School = {XY Universität},
Year = {2010},
Note = {Max Mustermann},
Type = {unveröffentlichte Bachelorarbeit},
}
@ARTICLE{Gan11,
Title = {GHI},
Author = {T. Gantenbein},
Journal = {Journal für Beispiele},
Year = {2011},
Number = {8},
Pages = {1001-1010},
Volume = {43},
}
\end{filecontents*}
\begin{filecontents}{Beispiel.bbx}
\ProvidesFile{Beispiel.bbx}
\RequireBibliographyStyle{standard}
\ExecuteBibliographyOptions{labelalpha,sorting=anyt}
\DeclareFieldFormat{labelalphawidth}{\mkbibbrackets{#1}}
\DeclareFieldFormat{shorthandwidth}{\mkbibbrackets{#1}}
\defbibenvironment{bibliography}
{\list
{\printtext[labelalphawidth]{%
\printfield{prefixnumber}%
\printfield{labelalpha}%
\printfield{extraalpha}}}
{\setlength{\labelwidth}{\labelalphawidth}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\labelsep}{\biblabelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{\bibitemsep}%
\setlength{\parsep}{\bibparsep}}%
\renewcommand*{\makelabel}[1]{##1\hss}}
{\endlist}
{\item}
\defbibenvironment{shorthand}
{\list
{\printfield[shorthandwidth]{shorthand}}
{\setlength{\labelwidth}{\shorthandwidth}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\labelsep}{\biblabelsep}%
\addtolength{\leftmargin}{\labelsep}%
\setlength{\itemsep}{\bibitemsep}%
\setlength{\parsep}{\bibparsep}%
\renewcommand*{\makelabel}[1]{##1\hss}}}
{\endlist}
{\item}
\renewcommand*{\labelnamepunct}{\addcolon\addspace}
\renewcommand{\mkbibnamefamily}[1]{\textsc{#1}}
\DeclareFieldFormat[article,inbook,incollection,inproceedings,patent,thesis,unpublished]{title}{#1\isdot}
\DeclareBibliographyDriver{mastersthesis}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author}%
\setunit{\labelnamepunct}\newblock
\usebibmacro{title}%
\newunit\newblock
\printfield{school}%
\newunit\newblock
\printfield{type}%
\newunit\newblock
\printfield{note}%
\newunit\newblock
\printfield{year}%
\newunit\newblock
{}%
}
\DeclareBibliographyDriver{phdthesis}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author}%
\setunit{\labelnamepunct}\newblock
\usebibmacro{title}%
\newunit\newblock
\printfield{school}%
\newunit\newblock
\printfield{year}%
\newunit\newblock
\printfield{note}%
\newunit\newblock
{}%
}
\endinput
\end{filecontents}
\documentclass[12pt,halfparskip,BCOR0pt,DIV12]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lipsum}
\DeclareDriverSourcemap[datatype=bibtex]{
\map{
\step[fieldset=day, null]
}
}
\usepackage[backend=bibtex, bibstyle=Beispiel, citestyle=alphabetic, firstinits=true, isbn=false, doi=false, url=false, maxbibnames=99]{biblatex}
\bibliography{Beispielbibliographie.bib}
\begin{document}
\lipsum[1] \cite{Gan11,Mus10,Mus15}
\lipsum[2]
\printbibliography[title=Literaturverzeichnis]
\end{document}
решение1
Вы обнаружите, что @techreport
s сопоставляются @report
с type = {techreport}
, в то время как @phdthesis
и @mastersthesis
оба сопоставляются @thesis
с type = {phdthesis}
и type = {mastersthesis}
соответственно. Так что есть способ различать типы, просто не через тип записи, а через type
поле.
Я бы подумал, что выходные данные для типов достаточно похожи, так что было бы достаточно иметь по одному драйверу для каждого (в чем именно разница между ожидаемыми выходными данными для @mastersthesis
и @phdtehsis
за исключением строки, которая уже автоматически указывает, есть ли у нас магистерская или докторская диссертация?), конечно, это зависит от того, какой именно выходной данные вы ищете, но вы можете проверить его по типу с помощью \iffieldequalstr{type}{techreport}{Ohh, a @techreport}{just a normal @report}
.
Например
\DeclareBibliographyDriver{report}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author}%
\setunit{\printdelim{nametitledelim}}\newblock
\usebibmacro{title}%
\newunit\newblock
\printtext{\iffieldequalstr{type}{techreport}{Ohh, a @techreport}{just a normal @report}}
\newunit\newblock
\usebibmacro{finentry}}
Если вам абсолютно необходимо подавить переназначение, biblatex.def
вы можете воспользоваться тем фактом, что biblatex
может быть принята только одна директива sourcemapping любого типа. Так что если вы добавите
\DeclareDriverSourcemap[datatype=bibtex]{
\map{
\step[fieldset=day, null]
}
}
в преамбуле вашего документа, сопоставления по умолчанию игнорируются.