Ich versuche, ein „Flussdiagramm“ der Dokumente zu erstellen, das die Entwicklung der wichtigsten Ideen im Laufe der Zeit zeigt. Ein sehr einfaches Beispiel ist dieses:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand{\oldpaper}{2}
\newcommand{\newpaper}{1}
\begin{tikzpicture}[show/.style={circle,draw}]
\node[show] (\newpaper) at (0,2) [label=right:{This 2011 paper utilizes the good ideas and makes them even better}] {\newpaper};
\node[show] (\oldpaper) at (0,0) [label=right:{This paper came out in 1900 and has good ideas}] {\oldpaper};
\draw[->] (\oldpaper) -- (\newpaper);
\end{tikzpicture}
\bibliographystyle{amsplain}
\begin{thebibliography}{10}
\bibitem{newpaper}C. Charles, \emph{New Stuff}, 2011.
\bibitem{oldpaper}H. Huckley, \emph{Old Stuff}, 1900.
\end{thebibliography}
\end{document}
Der Punkt ist, dass die kreisförmigen Knoten eine Nummer in sich tragen, die der Nummer in der Bibliographie entspricht. Wenn Sie sich also das Flussdiagramm ansehen und ein Papier sehen, das interessant aussieht, können Sie anhand der Referenzen genau feststellen, um welches Papier es sich handelt. Ich konnte nur herausfinden, wie ich das einigermaßen effizient machen kann, indem ich das \newcommand
Material verwende – aber dazu muss ich den Code kompilieren, mir die Bibliographie ansehen und dann die \newpaper
und manuell \oldpaper
so definieren, wie sie „sein sollten“. Wenn ich eine weitere Referenz hinzufüge, sagen wir,
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand{\oldpaper}{2}
\newcommand{\newpaper}{1}
\begin{tikzpicture}[show/.style={circle,draw}]
\node[show] (\newpaper) at (0,2) [label=right:{This 2011 paper utilizes the good ideas and makes them even better}] {\newpaper};
\node[show] (\oldpaper) at (0,0) [label=right:{This paper came out in 1900 and has good ideas}] {\oldpaper};
\draw[->] (\oldpaper) -- (\newpaper);
\end{tikzpicture}
\bibliographystyle{amsplain}
\begin{thebibliography}{10}
\bibitem{newerpaper}B. Becker, \emph{Even Newer Stuff}, 2012.
\bibitem{newpaper}C. Charles, \emph{New Stuff}, 2011.
\bibitem{oldpaper}H. Huckley, \emph{Old Stuff}, 1900.
\end{thebibliography}
\end{document}
dann muss ich meine \oldpaper
und \newpaper
Variablen von Hand neu definieren. Es ist auch wichtig, dass die Knoten mit derselben Variable benannt werden, damit die Zeichnung richtig aussieht, egal welchen Wert die Variablen haben. Mein echtes Flussdiagramm enthält über 30 Dokumente und die echte Bibliographie über 50. Offensichtlich wird es mühsam, dies von Hand zu tun, also frage ich mich, ob ich irgendwie verwenden \cite{}
und extrahieren kann, was die Referenznummer „sein sollte“, und die Knoten entsprechend benennen/nummerieren kann, und es wird dynamisch aktualisiert, wenn ich eine Referenz hinzufüge oder lösche (einige meiner Referenzen werden im Flussdiagramm nicht angezeigt). Ich habe versucht, hinzuzufügen
\makeatletter
\renewcommand*{\@biblabel}[1]{#1}
\makeatother
in der Präambel, dann definieren
\newcommand{\oldpaper}{\cite{oldpaper}}
damit die Variable \oldpaper
den Wert der aktuellen Zitatnummer hätte \cite{oldpaper}
, aber das funktionierte überhaupt nicht. Die Fehlermeldung lautet:
Das Argument von \XC@definec@lor hat ein zusätzliches }
Das übersteigt meine TeX-Kenntnisse und ich habe Stunden damit verbracht, über BiBTeX zu lesen und zu googeln, aber ohne Erfolg. Weiß jemand, wie man das löst? Vielen Dank im Voraus und ich hoffe, meine Frage ist klar.
Antwort1
Warum möchten Sie Zahlen als Knotennamen? Sie könnten einfach die Bibkeys verwenden:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[show/.style={circle,draw}]
\node[show] (newpaper) at (0,2)
[label=right:{This 2011 paper ...}]
{\cite{newpaper}};
\node[show] (oldpaper) at (0,0)
[label=right:{This paper came out in 1900 ...}]
{\cite{oldpaper}};
\draw[->] (oldpaper) -- (newpaper);
\end{tikzpicture}
\bibliographystyle{amsplain}
\begin{thebibliography}{10}
\bibitem{newerpaper}B. Becker, \emph{Even Newer Stuff}, 2012.
\bibitem{newpaper}C. Charles, \emph{New Stuff}, 2011.
\bibitem{oldpaper}H. Huckley, \emph{Old Stuff}, 1900.
\end{thebibliography}
\end{document}
Antwort2
Der Grund, warum Ihre Methode nicht funktioniert, liegt darin, dass LaTeX normalerweise einige Tests durchführt, um sicherzustellen, dass Sie etwas zitieren, das eine entsprechende hat , und dass Sie in jedem Befehl \bibitem
mehr als einen Schlüssel zitieren können . Es ist also nicht so einfach, dass es einfach auf die Zitatnummer für erweitert werden kann .\cite
\cite{key}
key
Die Zitatnummern für den Zitatschlüssel key
werden intern in einem Makro gespeichert \b@key
und sind interne Elemente von LaTeX (durch das @
Symbol vor normalem Zugriff geschützt). Sie können darauf zugreifen, aber es wird davon abgeraten. Was würden Sie beispielsweise von dem Verhalten erwarten, wenn Sie eine nicht standardmäßige (aber unterstützte) Erweiterung des Bibliographiesystems von LaTeX verwenden? Können Sie sicher sein, dass die Verwendung von etwas wie hyperref
die internen Elemente nicht ändert, um seine Ziele zu erreichen?
Ulrikes Vorschlag, dass Sie versuchen sollten, einen anderen Weg zu finden, um das zu erreichen, was Sie möchten, ist also gut, aber was ist, wenn Sie den Zitierstil nur für Ihre Tikz-Knoten ändern möchten, nicht aber in der Bibliografie selbst oder in anderen Referenzen? In einem solchen Fall möchten Sie vielleicht etwas wie das \citekey
Makro verwenden, das ich unten definiert habe und das als Wrapper fungiert, um die internen Werte für Sie abzurufen. Beachten Sie, dass zwei Durchläufe erforderlich sind, um korrekt zu sein, und es möglicherweise bessere Möglichkeiten gibt, dies zu tun ...
\documentclass{article}
\usepackage{tikz}
%if we were to try to do \newcommand{\oldpaper}{\b@oldpaper}, we would need \makeatletter ... \makeatother protection around the \newcommand, but we're using \csname...\endcsname here, so we don't need to worry about that!
\newcommand*{\citekey}[1]{\csname b@#1\endcsname}
\begin{document}
%\newcommand{\oldpaper}{2}
%\newcommand{\newpaper}{1}
\newcommand{\oldpaper}{\citekey{oldpaper}}
\newcommand{\newpaper}{\citekey{newpaper}}
\begin{tikzpicture}[show/.style={circle,draw}]
\node[show] (\newpaper) at (0,2) [label=right:{This 2011 paper utilizes the good ideas and makes them even better}] {\newpaper};
\node[show] (\oldpaper) at (0,0) [label=right:{This paper came out in 1900 and has good ideas}] {\oldpaper};
\draw[->] (\oldpaper) -- (\newpaper);
\end{tikzpicture}
\bibliographystyle{amsplain}
\begin{thebibliography}{10}
\bibitem{newerpaper}B. Becker, \emph{Even Newer Stuff}, 2012.
\bibitem{newpaper}C. Charles, \emph{New Stuff}, 2011.
\bibitem{oldpaper}H. Huckley, \emph{Old Stuff}, 1900.
\end{thebibliography}
\end{document}