Os números das citações podem ser armazenados como variáveis ​​e depois usados ​​no meu arquivo tex?

Os números das citações podem ser armazenados como variáveis ​​e depois usados ​​no meu arquivo tex?

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 \newcommandmaterial - mas isso exige que eu compile o código, observe a bibliografia e, em seguida, defina manualmente o \newpapere \oldpaperpara 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 \newpapermanualmente. 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 \oldpapertivesse 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 \citecomando, 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 keysão armazenados internamente em uma macro \b@keye 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 hyperrefnã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 \citekeymacro 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} 

informação relacionada