Richtige Methode zum Deklarieren von Feldern, die Bibstrings im benutzerdefinierten Biblatex-Stil unterstützen

Richtige Methode zum Deklarieren von Feldern, die Bibstrings im benutzerdefinierten Biblatex-Stil unterstützen

Problem

Ich erstelle einen benutzerdefinierten Biblatex-Stil und wollte eine Unterstützung für Bibstrings haben, die der des monthFelds in den gängigen Implementierungen ähnelt. Das heißt, wenn ich etwas in Klammern setze, wird {something}der Inhalt somethingim 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:

Bildbeschreibung hier eingeben

Erwartete Ausgabe:

Bildbeschreibung hier eingeben

Frage

Beachten Sie, dass ich dasselbe Verhalten mit Bibstrings wie erwarte month. Wenn ich das Feld ohne Klammern habe, sollte der Fall des test4Eintrags in anhand der Definition des Bibstrings konvertiert werden. Wenn ich jedoch dieselbe Definition mit Klammern habe, wie in , sollte stattdessen der Inhalt gedruckt werden..bibtest3

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.

@stringS

Erstens gibt es eine Möglichkeit @string, @stringdenselben Text in mehrere .bibEinträge einzufügen, ohne den gesamten Text jedes Mal neu eingeben zu müssen. Diese Funktion funktioniert vollständig auf Dateiebene .bib.

Ein @stringEintrag hat eine ID (genau wie der Eintragsschlüssel eines normalen .bibEintrags) und kann unter diesem Namen aufgerufen werden.

@string{brontostring = {On the Theory of Brontosauruses}}

Der Inhalt von @stringkann 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 .bibDatei auf. Eine Einschränkung besteht darin, dass @strings definiert werden müssen, bevor sie verwendet werden können. Insbesondere können Sie keinen beliebigen Text ohne Klammern verwenden, nur bekannte @strings 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 .bibDateien mit unterschiedlichen Definitionen für dieselbe Zeichenfolge laden. Dies ist, was ieeetranmit IEEEabrv.bibund geschieht IEEEfull.bib. Sie laden entweder, IEEEabbrv.bibum den abgekürzten Zeitschriftennamen oder IEEEfull.bibden vollständigen Zeitschriftennamen zu erhalten.

Im Grunde funktionieren Monatszeichenfolgen auf ähnliche Weise. janist ein @stringfür 1, febfür 2und so weiter.

@stringVerwenden Sie keine Klammern in der .bibDatei, 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, \bibstringund verweisen \NewBibliographyString. Bibstrings sind Teil der biblatexLokalisierungsfunktion 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 biblatexeine Funktion aufgerufen wird, \mkbibmonthdie 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 pubstateFeld. Das Feldformat für pubstateist

\DeclareFieldFormat{pubstate}{\ifbibstring{#1}{\bibstring{#1}}{#1}}

Es gibt einige vordefinierte Zeichenfolgen, die Sie für das pubstateFeld verwenden können, z. B. inpress, forthcoming, submitted. Wenn Sie eine davon verwenden, d. h. Sie haben

pubstate = {inpress},

in einem Ihrer .bibEinträge, dann biblatexwird nicht „inpress“ in das Dokument gedruckt, sondern die Übersetzung dieses Begriffs, wie sie im Bibstring angegeben ist. (Natürlich biblatexwü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 bibstringsder Eingabe in die .bibDatei sind grundsätzlich Klammern zu verwenden.

Vergleich der beiden Saitentypen

Soweit ich weiß, gibt es keine anderen Kombinationen von @stringsund Bibstrings in , biblatexdie genau so funktionieren. Ich vermute stark, dass die Monate @stringnur 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.

  1. @strings durch das Backend gelöst
  2. ( .lbx) Bibstrings aufgelöst durchbiblatex

Welche Methode besser geeignet ist, hängt von Ihrem Anwendungsfall ab. @strings 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 @stringsind 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.

@stringFü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 .bibDatei erfolgen, die Sie in alle Ihre Projekte laden müssen.

@string{bracelessa = {bracelessa}}
@string{bracelessb = {bracelessb}}

Dann machen Sie die Trägerhosen bracelessa, bracelessbbekanntbiblatex

\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 @stringals 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.

verwandte Informationen