인용 번호를 변수로 저장한 다음 내 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그런 다음 my 및 \newpaper변수를 직접 다시 정의해야 합니다 . 노드의 이름을 동일한 변수로 지정하는 것도 중요합니다. 이렇게 하면 변수의 값에 관계없이 도면이 올바르게 표시됩니다. 내 실제 흐름도에는 30개가 넘는 논문이 있고, 실제 참고문헌에는 50개가 넘습니다. 당연히 이 작업을 손으로 하기가 번거로워지므로 \cite{}참조 번호가 "되어야 하는 것"이 ​​무엇인지 어떻게든 사용하고 추출할 수 있는지 궁금합니다. 그에 따라 노드에 이름을 지정하거나 번호를 매기면 참조를 추가하거나 삭제하면 동적으로 업데이트됩니다(내 참조 중 일부는 순서도에 표시되지 않습니다). 추가해 보았습니다

\makeatletter
\renewcommand*{\@biblabel}[1]{#1}
\makeatother

서문에서 다음을 정의합니다.

\newcommand{\oldpaper}{\cite{oldpaper}}

변수가 \oldpaper현재 인용 번호와 동일한 값을 갖게 되지만 \cite{oldpaper}전혀 작동하지 않았습니다. 오류 메시지는 다음과 같습니다.

\XC@definec@lor의 인수에는 추가 }가 있습니다.

이것은 내 TeX 지식을 넘어서는 것이므로 BiBTeX에 대해 읽고 인터넷 검색에 몇 시간을 보냈지만 아무 소용이 없습니다. 이 문제를 해결하는 방법을 아는 사람이 있나요? 미리 감사드리며 제 질문이 명확해지기를 바랍니다.

답변1

노드 이름으로 숫자를 원하는 이유는 무엇입니까? 간단하게 턱받이를 사용할 수 있습니다.

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

관련 정보