Estoy intentando crear un "diagrama de flujo" de artículos que muestre la progresión de las ideas clave a lo largo del tiempo. Un ejemplo muy básico es este:
\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}
El punto es que los nodos circulares tienen un número dentro de ellos que es igual al número en la bibliografía, por lo que si estás mirando el diagrama de flujo y ves un artículo que parece interesante, puedes mirar las referencias para ver exactamente de qué artículo se trata. es. La única forma en que pude descubrir cómo hacer esto de manera algo eficiente fue mediante el \newcommand
material, pero esto requiere que compile el código, mire la bibliografía y luego defina manualmente \newpaper
y \oldpaper
para que sean lo que "deberían" ser. Si agrego otra referencia, digamos,
\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}
entonces tengo que redefinir mis variables \oldpaper
y \newpaper
a mano. También es importante que los nodos estén nombrados con la misma variable, de esa manera el dibujo se verá bien sin importar el valor que tengan las variables. Mi diagrama de flujo real tiene más de 30 artículos y la bibliografía real tiene más de 50. Obviamente, se está volviendo engorroso hacer esto a mano, así que me pregunto si de alguna manera puedo usar \cite{}
y extraer cuál "debería ser" el número de referencia. y nombre/numere los nodos en consecuencia, y se actualizará dinámicamente si agrego o elimino una referencia (algunas de mis referencias no aparecen en el diagrama de flujo). Intenté agregar
\makeatletter
\renewcommand*{\@biblabel}[1]{#1}
\makeatother
en el preámbulo, definiendo luego
\newcommand{\oldpaper}{\cite{oldpaper}}
para que la variable \oldpaper
tenga el valor igual al número de cita actual \cite{oldpaper}
pero eso no funcionó en absoluto. El mensaje de error es:
El argumento de \XC@definec@lor tiene un } extra
Esto va más allá de mis conocimientos de TeX y he pasado horas leyendo sobre BiBTeX y buscando en Google en vano. Alguien sabe cómo resolver esto? Gracias de antemano y espero que mi pregunta sea clara.
Respuesta1
¿Por qué quieres números como nombres de nodos? Simplemente podrías usar las bibkeys:
\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}
Respuesta2
La razón por la que tu método no funciona es que LaTeX normalmente hace algunas pruebas para asegurarse de que estás citando algo que tiene un correspondiente \bibitem
y también te permite citar más de una clave en cada \cite
comando, por lo que \cite{key}
no es tan simple. que puede simplemente expandirse al número de cita para key
.
Los números de cita para la clave de cita key
se almacenan internamente en una macro \b@key
, y estos son elementos internos de LaTeX ("protegidos" del acceso normal mediante el @
símbolo). Puede acceder a ellos, pero se recomienda no hacerlo. Por ejemplo, ¿cuál esperaría que fuera el comportamiento si estuviera utilizando una extensión no estándar (pero compatible) para el sistema de bibliografía de LaTeX? ¿Puedes estar seguro de que usar algo así hyperref
no cambiará las partes internas para lograr sus objetivos?
Entonces, la sugerencia de Ulrike de que deberías intentar encontrar otra manera de hacer lo que quieres es buena, pero ¿qué pasa si quieres cambiar el estilo de cita solo para tus nodos tikz, pero no en la bibliografía misma ni en otras referencias? En tal caso, es posible que desee utilizar algo como la \citekey
macro que definí a continuación, que actúa como un contenedor para obtener los valores internos. Tenga en cuenta que se necesitarán dos ejecuciones para ser correcto y puede haber mejores formas de hacerlo...
\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}