我正在嘗試創建一個論文“流程圖”,以顯示關鍵思想隨時間的進展。一個非常基本的例子是這樣的:
\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}
然後我必須手動重新定義 my\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}