
Problem
Ich erstelle einen benutzerdefinierten Biblatex-Stil und wollte eine Unterstützung für Bibstrings haben, die der des month
Felds in den gängigen Implementierungen ähnelt. Das heißt, wenn ich etwas in Klammern setze, wird {something}
der Inhalt something
im Feld gerendert. Aber wenn ich etwas ohne Klammern habe, wird es als Bibstring interpretiert und in seine Definition konvertiert.
Ich kann das teilweise erreichen, indem ich überprüfe, ob der Inhalt des Felds ein Bibstring ist \ifbibstring
(und so). Das funktioniert jedoch nur, wenn der Inhalt immer in Klammern steht. Wenn nicht, gibt Biber einen Fehler aus und übergibt das Feld nicht zur weiteren Verarbeitung.
Der folgende Code erzeugt beispielsweise die Warnmeldung
WARNUNG – BibTeX-Subsystem: /tmp/M3YJZ8wGD7/mwe.bib_28410.utf8, Zeile 21, Warnung: undefiniertes Makro „mytitle“
und das veranlasst Biber, dieses Feld nicht in der Datei zu erstellen .bbl
. Ich habe einen ähnlichen Fehler gefunden aufbiblatex/biber: Verwenden von String-Makros aus einer Datei in mehreren Referenzabschnitten, aber das löst mein Problem nicht.
MWE
Dies ist meine minimale Implementierung, um mein Problem zu demonstrieren.
% !BIB program = biber
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@test{test1,
title = {A},
year = {1995},
}
@test{test2,
title = {B},
year = {1994},
}
@test{test3,
title = {mytitle},
year = {1998},
}
@test{test4,
title = mytitle,
year = {1998},
}
\end{filecontents}
\begin{filecontents}{test.dbx}
\DeclareDatamodelFields[type=field, datatype=literal]{title}
\DeclareDatamodelFields[type=field, datatype=datepart]{year}
\DeclareDatamodelEntryfields[test]{%
year,%
title%
}
\end{filecontents}
\begin{filecontents}{english-test.lbx}
\InheritBibliographyExtras{english}
% Bibliography strings
\NewBibliographyString{mytitle}
\DeclareBibliographyStrings{%
inherit = {american},
mytitle = {{my title}{my title}},
}
\end{filecontents}
\begin{filecontents}{test.bbx}
\RequireBibliographyStyle{standard}
% map language
\DeclareLanguageMapping{english}{english-test}
% Dummy driver for testing
\DeclareBibliographyDriver{test}{%
\usebibmacro{begentry}%
\printfield{title}%
\newunit%
\printfield{year}%
\newunit%
\usebibmacro{finentry}%
}
\DeclareFieldFormat[test]{title}{%
\ifbibstring{#1}{\bibstring{#1}}{#1}%
}
\end{filecontents}
\usepackage[backend=biber, bibstyle=test]{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\nocite{*}
\printbibliography
\end{document}
Aktueller Output:
Erwartete Ausgabe:
Frage
Beachten Sie, dass ich dasselbe Verhalten mit Bibstrings wie erwarte month
. Wenn ich das Feld ohne Klammern habe, sollte der Fall des test4
Eintrags in anhand der Definition des Bibstrings konvertiert werden. Wenn ich jedoch dieselbe Definition mit Klammern habe, wie in , sollte stattdessen der Inhalt gedruckt werden..bib
test3
Wie kann ich das mit einem benutzerdefinierten Stil erreichen?
Antwort1
Es gibt hier mindestens zwei Begriffe für „String“. Keiner von beiden erreicht allein das, was Sie wollen. Nur eine Kombination der beiden kann das erreichen.
@string
S
Erstens gibt es eine Möglichkeit @string
, @string
denselben Text in mehrere .bib
Einträge einzufügen, ohne den gesamten Text jedes Mal neu eingeben zu müssen. Diese Funktion funktioniert vollständig auf Dateiebene .bib
.
Ein @string
Eintrag hat eine ID (genau wie der Eintragsschlüssel eines normalen .bib
Eintrags) und kann unter diesem Namen aufgerufen werden.
@string{brontostring = {On the Theory of Brontosauruses}}
Der Inhalt von @string
kann verwendet werden, indem die Zeichenfolge ID als Feldwert angegeben wird.ohnedie Zahnspange.
@book{foo,
author = {Anne Elk},
title = brontostring,
date = {1970},
}
Biber (oder BibTeX) löst diese Zeichenfolgen sofort beim Lesen der .bib
Datei auf. Eine Einschränkung besteht darin, dass @string
s definiert werden müssen, bevor sie verwendet werden können. Insbesondere können Sie keinen beliebigen Text ohne Klammern verwenden, nur bekannte @string
s funktionieren. Wir haben dann noch
@book{foo,
author = {Anne Elk},
title = {On the Theory of Brontosauruses},
date = {1970},
}
Bei der weiteren Verarbeitung der Eingabe ist kein Hinweis mehr darauf zu erkennen, dass der Text aus einer stammt @string
.
Dies würde es Ihnen ermöglichen, beliebigen Text in einen Eintrag einzufügen. Der Text wäre nicht durch veränderbar biblatex
, Sie könnten ihn aber ändern, indem Sie verschiedene .bib
Dateien mit unterschiedlichen Definitionen für dieselbe Zeichenfolge laden. Dies ist, was ieeetran
mit IEEEabrv.bib
und geschieht IEEEfull.bib
. Sie laden entweder, IEEEabbrv.bib
um den abgekürzten Zeitschriftennamen oder IEEEfull.bib
den vollständigen Zeitschriftennamen zu erhalten.
Im Grunde funktionieren Monatszeichenfolgen auf ähnliche Weise.
jan
ist ein @string
für 1
, feb
für 2
und so weiter.
@string
Verwenden Sie keine Klammern in der .bib
Datei, wenn sie als Feldwerte verwendet werden.
Bibliographiezeichenfolgen
Dann gibt es noch ein zweites, völlig unabhängiges Konzept von „Strings“, nämlich Bibstrings. Das sind die, auf die Sie mit \ifbibstring
, \bibstring
und verweisen \NewBibliographyString
. Bibstrings sind Teil der biblatex
Lokalisierungsfunktion von und ermöglichen Ihnen, bestimmte Begriffe in andere Sprachen zu übersetzen. Normalerweise sind sie in den Dateien definiert .lbx
, aber ihre Werte können auch in der Präambel überschrieben werden.
Bibstrings können mit verwendet werden, \bibstring{<bibstringid>}
wobei <bibstringid>
der Name eines mit definierten Bibstrings ist \NewBibliographyString
. Idealerweise <bibstringid>
ist in der Datei auch ein Wert enthalten .lbx
, andernfalls <bibstringid>
ist fett gedruckt.
Die gesamte Datumsverarbeitung ist viel komplizierter, aber für diese Antwort können wir davon ausgehen, dass biblatex
eine Funktion aufgerufen wird, \mkbibmonth
die 1 auf \bibstring{january}
, 2 auf \bibstring{february}
usw. abbildet. Wenn also \mkbibmonth{7}
aufgerufen wird, ergibt sich daraus \bibstring{july}
und daher wird in Ihrem Dokument „Juli“ gedruckt, wenn Englisch die aktive Sprache ist, oder „Juli“, wenn Deutsch die aktive Sprache ist.
Ein einfacheres und typischeres Beispiel für Bibstrings ist das pubstate
Feld. Das Feldformat für pubstate
ist
\DeclareFieldFormat{pubstate}{\ifbibstring{#1}{\bibstring{#1}}{#1}}
Es gibt einige vordefinierte Zeichenfolgen, die Sie für das pubstate
Feld verwenden können, z. B.
inpress
, forthcoming
, submitted
. Wenn Sie eine davon verwenden, d. h. Sie haben
pubstate = {inpress},
in einem Ihrer .bib
Einträge, dann biblatex
wird nicht „inpress“ in das Dokument gedruckt, sondern die Übersetzung dieses Begriffs, wie sie im Bibstring angegeben ist. (Natürlich biblatex
würde ich auch gerne jeden anderen Bibstring verwenden, den Sie angeben, das pubstate = {january}
würde genauso gut funktionieren.) Das Feld wird so gedruckt, wie es ist, wenn es keinen Bibstring mit diesem Namen gibt, es pubstate = {foonostring}
würde also einfach „foonostring“ gedruckt.
Bei bibstrings
der Eingabe in die .bib
Datei sind grundsätzlich Klammern zu verwenden.
Vergleich der beiden Saitentypen
Soweit ich weiß, gibt es keine anderen Kombinationen von @strings
und Bibstrings in , biblatex
die genau so funktionieren. Ich vermute stark, dass die Monate @string
nur aus Gründen der Abwärtskompatibilität implementiert wurden.
Wie wir gesehen haben, gibt es im Allgemeinen zwei Möglichkeiten, kontextabhängige Ausgaben zu erstellen.
@string
s durch das Backend gelöst- (
.lbx
) Bibstrings aufgelöst durchbiblatex
Welche Methode besser geeignet ist, hängt von Ihrem Anwendungsfall ab.
@string
s scheinen besser geeignet, wenn Sie sich nur Tipparbeit sparen möchten oder wenn Sie eine Möglichkeit haben möchten, zwischen mehreren Eingabeformen (lange vs. kurze Zeitschriftennamen) zu wechseln. Im Allgemeinen @string
sind s nicht an Sprachen oder Gebietsschemas gebunden. Bibstrings sind die beste Lösung, wenn Sie eine echte Lokalisierung wünschen.
Welcher der beiden Ansätze in deinem Anwendungsfall sinnvoller wäre, lässt sich anhand des Beispiels aus deiner Frage nicht ganz erkennen.
Können wir besorgen, was Sie wollen?
Wenn Sie auf dem in Ihrer Frage beschriebenen Schema bestehen, ist dies durch die Kombination der beiden Ansätze fast möglich. Ich halte das nicht für eine besonders gute Idee, aber los geht’s.
@string
Für jeden möglichen Wert ohne Klammern müssen Sie einen Ersatztext definieren . Wenn Sie eine portable Lösung wünschen, muss dies in einer speziellen .bib
Datei erfolgen, die Sie in alle Ihre Projekte laden müssen.
@string{bracelessa = {bracelessa}}
@string{bracelessb = {bracelessb}}
Dann machen Sie die Trägerhosen bracelessa
, bracelessb
bekanntbiblatex
\NewBibliographyString{bracelessa}
\NewBibliographyString{bracelessb}
und definieren Sie sie
\DeclareBibliographyStrings{%
inherit = {american},
bracelessa = {{A title}{A t\addddot}},
bracelessb = {{B title}{B t\addddot}},
}
Verwenden Sie dann das Feldformat
\DeclareFieldFormat[test]{title}{\ifbibstring{#1}{\bibstring{#1}}{#1}}
für das betreffende Feld.
Jetzt
title = bracelessa,
druckt „Ein Titel“ in Ihr Dokument.
Warum erhalten Sie dadurch nicht genau das, was Sie beschreiben?
Erstens ist die Eingabe ohne Klammern nicht beliebig. Sie müssen sowohl einen @string
als auch einen geeigneten definieren bibstring
. Zweitens title = {something}
wird nicht immer ein ausgegeben something
. Wenn Sie title = {bracelessa}
„Ein Titel“ schreiben, wird stattdessen ein ausgegeben. Kollisionen können erschwert werden, indem man absurdere Namen für die Bibstrings wählt, aber sie werden immer möglich sein, da es keine Möglichkeit gibt, herauszufinden, ob ein Feldwert direkt oder über einen angegeben wurde @string
.