
Estou tentando criar um "fluxograma" de artigos que mostre a progressão das ideias-chave ao longo do tempo. Um exemplo muito básico é 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}
A questão é que os nós circulares têm um número dentro deles que é igual ao número na bibliografia, então se você estiver olhando o fluxograma e vir um artigo que parece interessante, você pode olhar as referências para ver exatamente que papel é é. A única maneira de descobrir como fazer isso de maneira eficiente foi através do \newcommand
material - mas isso exige que eu compile o código, observe a bibliografia e, em seguida, defina manualmente o \newpaper
e \oldpaper
para ser o que "deveria" ser. Se eu adicionar outra referência, 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}
então eu tenho que redefinir minhas variáveis \oldpaper
e \newpaper
manualmente. Também é importante que os nós sejam nomeados com a mesma variável, para que o desenho pareça correto, independentemente do valor das variáveis. Meu fluxograma real contém mais de 30 artigos, e a bibliografia real tem mais de 50. Obviamente está ficando complicado fazer isso manualmente, então estou me perguntando se posso de alguma forma usar \cite{}
e extrair qual o número de referência "deveria ser". e nomeie/numere os nós de acordo, e ele será atualizado dinamicamente caso eu adicione ou elimine uma referência (algumas de minhas referências não aparecem no fluxograma). Eu tentei adicionar
\makeatletter
\renewcommand*{\@biblabel}[1]{#1}
\makeatother
no preâmbulo, em seguida, definindo
\newcommand{\oldpaper}{\cite{oldpaper}}
para que a variável \oldpaper
tivesse o valor igual ao número da citação atual, \cite{oldpaper}
mas isso não funcionou. A mensagem de erro é:
O argumento de \XC@definec@lor tem um } extra
Isso está além do meu conhecimento sobre TeX, e passei horas lendo sobre BiBTeX e pesquisando no Google sem sucesso. Alguém sabe como resolver isso? Desde já agradeço e espero que minha pergunta esteja clara.
Responder1
Por que você quer números como nomes de nós? Você poderia simplesmente usar as 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}
Responder2
A razão pela qual seu método não funciona é que o LaTeX normalmente faz alguns testes para ter certeza de que você está citando algo que possui um correspondente \bibitem
, e também permite citar mais de uma chave em cada \cite
comando, então \cite{key}
não é tão simples que ele pode simplesmente expandir para o número de citação de key
.
Os números de citação para chave de citação key
são armazenados internamente em uma macro \b@key
e são internos do LaTeX ("protegidos" do acesso normal pelo @
símbolo). Você pode acessá-los, mas é aconselhável não fazê-lo. Por exemplo, qual seria o comportamento se você estivesse usando uma extensão não padrão (mas suportada) para o sistema bibliográfico do LaTeX? Você pode ter certeza de que usar algo assim hyperref
não mudará os aspectos internos para atingir seus objetivos?
Portanto, a sugestão de Ulrike de que você tente encontrar outra maneira de fazer o que deseja é boa, mas e se você quiser alterar o estilo de citação apenas para seus nós tikz, mas não na própria bibliografia ou em outras referências? Nesse caso, você pode querer usar algo como a \citekey
macro que defini abaixo, que funciona como um wrapper para obter os valores internos para você. Observe que serão necessárias duas execuções para estar correto e pode haver maneiras melhores de fazer isso...
\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}