Neudefinition cite funktioniert nicht.

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


RobWeb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Di 1. Mär 2016, 16:47
Wohnort: Magdeburg

Neudefinition cite funktioniert nicht.

Beitrag von RobWeb »

Moin zusammen. Für eine Studienarbeit benötige ich eine bestimmte Zitierweise, die mir vorgegeben ist.
Folgendermaßen:
[ABC12]
([ABC12], S. 123)
(vgl. [ABC12], S. 123)
(vgl. [ABC12])

Die Autor-Text-Zitierweise hab ich mit natbib eingebunden.
Da ich eine solche Mehrfachklammerung nirgendwo fand, hab ich mir kurzerhand den Befehl selbst definiert.

Nun funktioniert die Zitierweise nicht wie gewünscht sondern ich erhalte wieder die alte, die ich schon davor hatte. [Vgl. Koe01, S.12].

Ich bitte sehr um Vorschläge, wie es funktionieren könnte.
Vielen Dank für eure Mühen.
(edit: Code umformatiert, Tex-Version ergänzt)

Hier das Minimalbeispiel
%minimalbeispiel
\documentclass[oneside,11pt,a4paper]{report}

\usepackage{ngerman}
\usepackage{textcomp} % to get the right copyright, etc.
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc} 

\usepackage[square, sort, comma, numbers]{natbib} %Zitierstil

\begin{document}

\renewcommand{\@cite}[1][2]3%
		{\@ifundefined{1}{(offen)}% zu ergänzen.
						{(\#1 \@cite{\#3}, \#2)}%
		}
		
		
Neuer Text blabla
\cite[Vgl.][S.~12]{Koe}		
				
\bibliographystyle{alphadin}
\bibliography{Literatur.bib}
		
\end{document}


%Und die Bibliographie Literatur.bib

@book{Koe,
  author	= {Koether, Reinhard},
  title		= {Technische Logistik},
  publisher	= {Carl Hanser},
  year		= {2001},
  address	= {München Wien},
  edition	= {2.Auflage},
  isbn		= {3-446-21759-2}
}
Texmaker, Ubuntu
Viele Grüße, RobWeb

Besserwisser

Re: Neudefinition cite funktioniert nicht.

Beitrag von Besserwisser »

RobWeb hat geschrieben:
\renewcommand{\@cite}[1][2]3%
		{\@ifundefined{1}{(offen)}% zu ergänzen.
						{(\#1 \@cite{\#3}, \#2)}%
		}
Das kann nicht funktionieren. Davon abgesehen, dass auch noch \makeatletter…\makeatother fehlen, definierst du da einen Befehl mit einem Argument, dessen erstes Argument ein optionales mit dem Defaultwert 2 ist. Der Befehl gibt dann lediglich eine 3 aus. Desweiteren prüfst du danach in einer Gruppe ob der Befehl \1 definiert ist. Falls das nicht der Fall ist, gibst du "(offen)" aus. Wenn doch, dann gibst du eine öffnende runde Klammer und ein Doppelkreuz gefolgt von einer 1 gefolgt von einem Leerzeichen gefolgt von einem Aufruf von \@cite gefolgt von einer Gruppe, bestehend aus Doppelkreuz gefolgt von "3", gefolgt von einem Komma, einem Leerzeichen einem Doppelkreuz einer 2 und einer runden Klammer aus.

Da \@cite normalerweise ein Befehl mit zwei obligatorischen Argumenten ist und auch so verwendet wird, ist mir absolut nicht klar, was du da wirklich bezweckst. Ich vermute, dass du daraus einen Befehl mit drei Argumenten machen wolltest, was aber nicht funktionieren kann, da es eben nicht so verwendet wird.

Aber egal: Ich empfehle die Verwendung von biblatex.

RobWeb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Di 1. Mär 2016, 16:47
Wohnort: Magdeburg

Beitrag von RobWeb »

Ok, also jetzt kenne ich schon mal den Grund.

Ja, also ich verwende auch ohne diese Neudefinition \cite mit drei Argumenten.
In der Neudefinition sollte das dann ja auch so sein.

Ohne die Backslash gab es immer einen Haufen Fehlermeldungen (! You can't use `macro parameter character #' in horizontal mode.) und mit #1 rufe ich doch den Inhalt von 1 auf, oder?

Demnach wäre eine Neudefinition mit drei Argumenten besser?
Leider gibt es da auch wieder Fehlermeldungen ohne Ende.
Viele Grüße, RobWeb

RobWeb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Di 1. Mär 2016, 16:47
Wohnort: Magdeburg

Beitrag von RobWeb »

Hab was neues ausprobiert.
\makeatletter

\def\citexxx[#1][#2]#3{%
		\@ifundefined{value{#1)}}{(\cite{#3}, #2)}%
						{(#1 \cite{#3}, #2)}}

\makeatother
Nur, wie bekomme ich den Wert von 1 oder #1? Gibt es da einen Trick? Mit ifundefined prüft man ja, ob ein Befehl belegt ist, ich will einen Wert prüfen.

Ausgabe ist hier: ([Koe01], S.12) (also er prüft den Wert nicht richtig.
Viele Grüße, RobWeb

Besserwisser

Beitrag von Besserwisser »

RobWeb hat geschrieben:Ja, also ich verwende auch ohne diese Neudefinition \cite mit drei Argumenten.
\cite ist nicht \@cite.
RobWeb hat geschrieben:mit #1 rufe ich doch den Inhalt von 1 auf
Ich habe keine Ahnung, was du unter dem "Inhalt von 1" verstehst. Innerhalb einer Makrodefinition ist #1 das erste Argument des Makros. Wie ich erklärt habe, bist du aber gar nicht mehr in der Makrodefinition, weil du eben eine ganz falsche Syntax für \renewcommand verwendest.
RobWeb hat geschrieben:Demnach wäre eine Neudefinition mit drei Argumenten besser?
Neudefinition eines neuen Befehls wäre möglich. Besser wäre wohl biblatex zu verwenden. Dort kann man ggf. auch die Zitierweise konfigurieren oder neue Zitierbefehle definieren. Dafür haben wir hier sogar Experten. Ob der Aufwand lohnt, ist die andere Frage. Ich kenne Studienarbeiten mit 15 Seiten und 5 Literaturquellen und nicht viel mehr Verweisen darauf. Die kann man auch einfach als
(vlg. \cite{foo}, Seite 5--12)
angeben. Da ist dann eben die Frage, ob man das pragmatisch angeht oder eine technisch optimale Lösung anstrebt.

RobWeb
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Di 1. Mär 2016, 16:47
Wohnort: Magdeburg

Beitrag von RobWeb »

Nun, es geht um eine Bachelorarbeit und ich hab schon etwa 45 Seiten geschrieben. Also mit Neudefinition und Strg+F alle ersetzen wäre ok für mich, einarbeiten in BibLatex gerade eher nicht. Vielleicht dann zur MA ...
\cite ist nicht \@cite.

Okay, das erklärt einiges.
Viele Grüße, RobWeb

Gast

Beitrag von Gast »

Wenn Du Deine Arbeit nicht gerade in der nächsten Woche abgeben musst, solltest Du ruhig ernsthaft darüber nachdenken, zu biblatex zu wechseln. Das sollte mit einem vernünftigen natbib-Dokument eigentlich höchstens ein paar Stunden dauern (als ich das letzte mal jemandem das persönlich erklärt habe, hat es nicht länger als fünfzehn Minuten gedauert), sofern Du über ein relativ neues TeX-System verfügst.

Die Länge Deiner Arbeit und die Größe des Literaturverzeichnis sollte überhaupt keine Rolle spielen.

Lies Dir zunächst die wichtigen Hinweise durch.

Zunächst musst Du das Paket biblatex und Biber installieren. Dies solltest Du bei MikTeX über den Package Manager tun, bei TeX live über tlmgr.

Dann bringst Du Deinem Editor bei, dass Du statt BibTeX Biber möchtest: Wie verwende ich Biber in meinem Editor. Wenn Du manuell kompilierst, dann brauchst Du statt
pdflatex test
bibtex test
pdflatex test
pdflatex test
die Abfolge
pdflatex test
biber test
pdflatex test
pdflatex test
Schließlich baust Du Dein Dokument ein wenig um.
Aus \usepackage[square, sort, comma, numbers]{natbib} %Zitierstil wird
\usepackage[style=alphabetic,backend=biber]{biblatex}
,
das (streng genommen nicht ganz so richtige) \bibliography{Literatur.bib} wird Durch
\addbibresource{Literatur.bib}
ersetzt, wichtig ist, dass dieser Befehl in die Präambel gehört.
\bibliographystyle{alphadin} kommt weg, an die Stelle, wo die Bibliographie soll, kommt \printbibliography. Der Rest darf so bleiben (wenn Du babel lädst, hast Du das veraltete Paket ngerman nicht mehr nötig)
\documentclass[oneside,11pt,a4paper]{report}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}

\usepackage[style=alphabetic,backend=biber]{biblatex}
\addbibresource{Literatur.bib}

\begin{document}
Neuer Text blabla
\cite[Vgl.][12]{Koe}          
\end{document}
Diese komischen Klammerungsregeln kannst Du mit biblatex dann wie folgt implementieren (mit Mehrfachzitaten geht es vielleicht nicht, aber da weiß ich auch nicht, wie das aussehen soll)
\DeclareCiteCommand{\cite}
  {\ifboolexpr{ not test {\iffieldundef{prenote}} or not test {\iffieldundef{postnote}} }
     {\bibopenparen}
     {}%
   \usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \printtext[brackets]{\usebibmacro{cite}}}
  {\multicitedelim}
  {\usebibmacro{postnote}%
   \ifboolexpr{ not test {\iffieldundef{prenote}} or not test {\iffieldundef{postnote}} }
     {\bibcloseparen}
     {}}
In Aktion
\documentclass[oneside,11pt,a4paper]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{csquotes}

\usepackage[style=alphabetic,backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}

\DeclareCiteCommand{\cite}
  {\ifboolexpr{ not test {\iffieldundef{prenote}} or not test {\iffieldundef{postnote}} }
     {\bibopenparen}
     {}%
   \usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \printtext[brackets]{\usebibmacro{cite}}}
  {\multicitedelim}
  {\usebibmacro{postnote}%
   \ifboolexpr{ not test {\iffieldundef{prenote}} or not test {\iffieldundef{postnote}} }
     {\bibcloseparen}
     {}}

\begin{document}
\cite{sigfridsson}

\cite[Vgl.][12]{sigfridsson}

\cite[12]{sigfridsson}

\cite[Vgl.][]{sigfridsson}
\end{document}

Antworten