Können Zitatnummern als Variablen gespeichert und dann in meiner Tex-Datei verwendet werden?

Können Zitatnummern als Variablen gespeichert und dann in meiner Tex-Datei verwendet werden?

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 \newcommandMaterial verwende – aber dazu muss ich den Code kompilieren, mir die Bibliographie ansehen und dann die \newpaperund manuell \oldpaperso 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 \oldpaperund \newpaperVariablen 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 \oldpaperden 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 \bibitemmehr 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 keywerden intern in einem Makro gespeichert \b@keyund 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 hyperrefdie 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 \citekeyMakro 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} 

verwandte Informationen