Можно ли сохранить номера цитирований как переменные, а затем использовать их в моем tex-файле?

Можно ли сохранить номера цитирований как переменные, а затем использовать их в моем tex-файле?

Я пытаюсь создать "схему потока" статей, которая показывает развитие ключевых идей с течением времени. Вот очень простой пример:

\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}

Дело в том, что внутри круглых узлов есть число, равное числу в библиографии, так что если вы смотрите на блок-схему и видите интересную статью, вы можете посмотреть на ссылки, чтобы точно узнать, что это за статья. Единственный способ, которым я мог понять, как сделать это более-менее эффективно, был с помощью материала \newcommand-- но для этого мне нужно скомпилировать код, посмотреть на библиографию, а затем вручную определить \newpaperи \oldpaperтак, чтобы они были такими, какими они «должны» быть. Если я добавлю еще одну ссылку, скажем,

\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} 

затем мне нужно вручную переопределить мои \oldpaperи \newpaperпеременные. Также важно, чтобы узлы были названы одной и той же переменной, таким образом рисунок будет выглядеть правильно, независимо от того, какое значение имеют переменные. В моей реальной блок-схеме более 30 статей, а в реальной библиографии их более 50. Очевидно, что делать это вручную становится громоздко, поэтому я задаюсь вопросом, могу ли я как-то использовать \cite{}и извлекать то, каким «должен быть» номер ссылки, и называть/нумеровать узлы соответствующим образом, и он будет обновляться динамически, если я добавлю или уберу ссылку (некоторые из моих ссылок не отображаются в блок-схеме). Я попробовал добавить

\makeatletter
\renewcommand*{\@biblabel}[1]{#1}
\makeatother

в преамбуле, затем определение

\newcommand{\oldpaper}{\cite{oldpaper}}

так что переменная \oldpaperимела бы значение, равное текущему номеру цитирования \cite{oldpaper}, но это вообще не сработало. Сообщение об ошибке:

Аргумент \XC@definec@lor имеет дополнительный }

Это выходит за рамки моих знаний TeX, и я потратил часы на чтение BiBTeX и гугл, но безрезультатно. Кто-нибудь знает, как это решить? Заранее спасибо, и я надеюсь, что мой вопрос понятен.

решение1

Зачем вам нужны числа в качестве имен узлов? Вы можете просто использовать 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} 

решение2

Причина, по которой ваш метод не работает, заключается в том, что LaTeX обычно выполняет некоторые проверки, чтобы убедиться, что вы цитируете что-то, имеющее соответствующий \bibitem, и он также позволяет вам ссылаться на более чем один ключ в каждой \citeкоманде, так что \cite{key}он не настолько прост, чтобы его можно было просто расширить до номера цитирования для key.

Номера ссылок для ключа цитирования keyхранятся внутри макроса \b@key, и это внутренние данные LaTeX («защищенные» от обычного доступа символом @). Вы можете получить к ним доступ, но не рекомендуется этого делать. Например, какое поведение вы ожидаете, если используете нестандартное (но поддерживаемое) расширение библиографической системы LaTeX? Можете ли вы быть уверены, что использование чего-то вроде hyperrefне изменит внутренние данные для достижения своих целей?

Итак, предложение Ульрике о том, что вам следует попытаться найти другой способ сделать то, что вы хотите, хорошее, но что, если вы хотите изменить стиль цитирования только для ваших узлов tikz, но не в самой библиографии или в других ссылках? В таком случае вам может понравиться что-то вроде макроса, который \citekeyя определил ниже, который действует как оболочка для получения внутренних значений для вас. Обратите внимание, что для корректности потребуется два запуска, и могут быть лучшие способы сделать это...

\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} 

Связанный контент