引用番号を変数として保存し、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以下に定義したマクロのようなものを使用するとよいかもしれません。このマクロは、内部値を取得するためのラッパーとして機能します。正しく実行するには 2 回の実行が必要であり、これを実行するにはもっと良い方法があるかもしれません...

\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} 

関連情報