引文號可以儲存為變量,然後在我的 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} 

然後我必須手動重新定義 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} 

相關內容