我正在尝试创建一份论文“流程图”,以显示关键思想随时间的发展。一个非常基本的例子是:
\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
不会改变内部结构来实现其目标吗?
因此,Ulrike 建议你尝试寻找另一种方式来实现你想要的效果,这很好,但如果你只想更改 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}