
Ich habe zwei .bib
Dateien, die ich in meiner Bibliographie verwenden möchte. Die Einträge überlappen sich nicht. Ich habe dazu einige Forenbeiträge gefunden, aber keiner hat mich wirklich zufriedengestellt. Meine Idee ist also, die beiden zu einer .bib
Datei zusammenzufügen, die ich in der verwenden werde .tex
. Am einfachsten wäre das in LaTeX möglich (ich verwende also weder bibtool
, noch Referenzsoftware). Also habe ich ein Makro zum Zusammenfügen der beiden Dateien erstellt:
\newwrite\bibwrite
\newcommand{\concatbib}[2]{%
\begingroup
\IfFileExists{#1}%
{\CatchFileDef{\bibone}{#1}{}}
{\let\bibone\empty}
\IfFileExists{#2}%
{\CatchFileDef{\bibtwo}{#2}{}}
{\let\bibtwo\empty}%
\immediate\openout\bibwrite=MyBib.bib\relax
\immediate\write\bibwrite{\bibone \bibtwo}%
\immediate\closeout\bibwrite
\endgroup
}
die im Wesentlichen einer anderen Frage entnommen ist (Wie kann ich eine Datei im „Anhängen“-Modus öffnen?). Jetzt besteht das Problem darin, dass Latex den Dateiinhalt interpretieren möchte und Dinge wie \noexpand
, \detokenize
nicht wie gewünscht funktionierten. Ich muss es also wörtlich vorlesen, was ich gemäß Martin Scharrers Antwort hier versucht habe:Steuerbefehlsargumente.
\def\alltext{
\begingroup
\let\do\@makeother % define \do to change the category code of its argument to 'other'
\dospecials % makro that is a string of every special character preceeded with \do -> all catcodes are changed
\all@text
}
\def\all@text#1{
\endgroup
#1
}
und ich würde dies innerhalb des anderen Makros verwenden. Wenn ich es jedoch alleine teste, erhalte ich die Fehlermeldung, dass die Verwendung von \all
nicht mit der Definition übereinstimmt \alltext
, und ich glaube, dass ich hier einen wichtigen Punkt übersehe.
\all@text
Ich denke, dass ich die Definition von danach einfüge,\alltext
damit ich die Gruppe schließen kann, die ich nach meinem Verständnis brauche, um den Bereich zu definieren, in dem die Catcodes geändert werden. Aber ich verstehe nicht, warum dies\all@text
bereits in der Definition von bekannt sein sollte\alltext
?- Bisher habe ich verstanden, dass es
\@...
sich bei Befehlen um primitive Befehle handelt, aber ich dachte, es handele sich nur um eine Notation. Gibt es noch mehr? - gibt es eine Möglichkeit, diesen Code zum Laufen zu bringen?
Antwort1
Ich bin mir nicht sicher, ob ich etwas an Ihrem Setup übersehen habe, aber müssen Sie die beiden .bib
Dateien überhaupt kombinieren? Wenn sie beispielsweise und heißen biblio1.bib
, biblio2.bib
können BibTeX und LaTeX problemlos über die Anweisung auf beide Dateien zugreifen
\bibliography{biblio1,biblio2}
Wenn Sie das Paket verwenden biblatex
, ist meines Wissens nach der bevorzugte Stil die Verwendung eines Paars separater \addbibresource
Anweisungen (vgl. Abschnitt 3.6.1 derHandbuch):
\addbibresource{biblio1.bib}
\addbibresource{biblio2.bib}
.bib
Beachten Sie, dass bei Verwendung des Befehls die Angabe der Dateinamenerweiterung erforderlich ist \addbibresource
, während diese Erweiterung bei Verwendung des \bibliography
Befehls nicht angegeben werden sollte.
Antwort2
Wenn Sie es wirklich auf TeX-Ebene tun möchten (was nicht wirklich erforderlich ist, da Sie so viele Dateien eingeben können, wie Sie möchten), finden Sie hier einen Satz Makros, die dies tun. Sie können als obligatorisches Argument eine beliebige Anzahl von Bib-Dateinamen (ohne Erweiterung) .bib
angeben , getrennt durch Kommas.\concatbib
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% The document level command
\NewDocumentCommand{\concatbib}{ O{output} m }
{
\heinrich_concatbib:nn { #1 } { #2 }
}
% Variables and messages
\ior_new:N \l__heinrich_input_stream
\iow_new:N \l__heinrich_output_stream
\msg_new:nnnn { concatbib } { file-exist }
{ File~`#1'~exists.~Not~overwriting.}
{ The~file~`#1'~already~exists.~I'll~ignore~this~command. }
% Internal functions
% First we check that the named output file doesn't exist
\cs_new_protected:Npn \heinrich_concatbib:nn #1 #2
{
\file_if_exist:nTF { #1.bib }
{
\msg_error:nnn { concatbib } { file-exist } { #1.bib }
}
{
\__heinrich_concatbib_aux:nn { #1 } { #2 }
}
}
% If we're writing, we open an output stream and cycle
% through the second argument, a comma separated list
% of bib file names
\cs_new_protected:Npn \__heinrich_concatbib_aux:nn #1 #2
{
\iow_open:Nn \l__heinrich_output_stream { #1.bib }
\clist_map_inline:nn { #2 } { \__heinrich_read_write:n { ##1 } }
\iow_close:N \l__heinrich_output_stream
}
% At each step we read each line of the current .bib file
% and write it to the output stream
\cs_new_protected:Npn \__heinrich_read_write:n #1
{
\ior_open:Nn \l__heinrich_input_stream { #1.bib }
\ior_str_map_inline:Nn \l__heinrich_input_stream
{ \iow_now:Nn \l__heinrich_output_stream { ##1 } }
\ior_close:N \l__heinrich_input_stream
}
\ExplSyntaxOff
% This will concatenate in `output.bib'
\concatbib{foo1,foo2}
% This will concatenate in `foo.bib'
\concatbib[foo]{foo1,foo2}
Antwort3
Hm... ich bin ein großer Anhänger von „Verwende das richtige Werkzeug für die jeweilige Aufgabe“. Obwohl es intellektuell aufschlussreich ist, würde ich dies nicht in LaTeX implementieren, sondern einfach die grundlegenden Betriebssystemfunktionen verwenden (kein Bibtool oder anderer ausgefallener Kram erforderlich):
Öffnen Sie unter Linux/UNIX/MacOS eine Bash (oder eine andere Shell oder ein anderes Terminal) im entsprechenden Verzeichnis und geben Sie Folgendes ein:
cat bibone.bib bibtwo.bib >MyBib.bib
Öffnen Sie unter Windows eine CMD-Eingabeaufforderung und geben Sie Folgendes ein:
type bibone.bib bibtwo.bib >MyBib.bib
Auf beiden Systemen können Sie außerdemAnhängenzu einer bestehenden MyBib.bib, indem die Ausgabe mit >>
statt umgeleitet wird >
.