引用数可以存储为变量,然后在我的 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不会改变内部结构来实现其目标吗?

因此,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} 

相关内容