Я пытаюсь создать "схему потока" статей, которая показывает развитие ключевых идей с течением времени. Вот очень простой пример:
\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}