使用 newcommand 在 tikz 节点中列出和逐字逐句的环境

使用 newcommand 在 tikz 节点中列出和逐字逐句的环境

我见过许多关于这个问题的答案,但似乎都没有解决问题。

我希望能够将代码块放入已定义的 中tikzpicture。因此,我尝试制作一个命令来替换\node{};命令内部的逐字类环境,但遇到了已知问题。

我这里有一个完整的示例。它无法使用 构建pdflatex。请注意,蓝色\node可以运行,但\rednode会失败。

\documentclass{beamer}
\usepackage{tikz}
\usepackage{listings}

\newcommand{\rednode}[1]{
   \node[draw=red]{#1};
}

\begin{document}

\begin{frame}[fragile]

\begin{tikzpicture}

   \node[draw=blue]{
\begin{lstlisting}
int main()
{
    printf("Hello World\n");
} 
\end{lstlisting}
   };

   \rednode{
\begin{lstlisting}
int main()
{
    printf("Hello World\n");
} 
\end{lstlisting}
   }

\end{tikzpicture}

\end{frame}

\end{document}

探索的解决方案涉及cprotect包、tabular环境和minipage环境。

答案1

在论证中使用列表之前,请先将其框起来\node

\documentclass{beamer}
\usepackage{tikz}
\usepackage{listings}

\newcommand{\rednode}[1]{
   \node[draw=red]{#1};
}

\newsavebox\mybox

\begin{document}

\begin{lrbox}{\mybox}
\begin{lstlisting}
int main()
{
    printf("Hello World\n");
} 
\end{lstlisting}
\end{lrbox}

\begin{frame}[fragile]
\begin{tikzpicture}
\node[draw=blue]{};
\rednode{\usebox\mybox}: 
\end{tikzpicture}
\end{frame}

\end{document}

结果:

在此处输入图片描述

采用这种方法,您就不需要选项fragileframe;我留下它只是以防您想添加一些其他以前未装箱的逐字材料。

答案2

好吧,在这个简单的情况下,cprotect 确实有效。OP 可能没有正确使用它。

\documentclass{beamer}
\usepackage{tikz}
\usepackage{listings}
\usepackage{cprotect}

\newcommand{\rednode}[1]{
   \node[draw=red]{#1};
}

\begin{document}

\begin{frame}[fragile]

\begin{tikzpicture}

   \node[draw=blue]{
\begin{lstlisting}
int main()
{
    printf("Hello World\n");
} 
\end{lstlisting}
   };

   \cprotect\rednode{
\begin{lstlisting}
int main()
{
    printf("Hello World\n");
} 
\end{lstlisting}
   }

\end{tikzpicture}

\end{frame}

\end{document}

或者使用\cMakeRobust,如包文档中所述cprotect

\documentclass{beamer}
\usepackage{tikz}
\usepackage{listings}
\usepackage{cprotect}

\newcommand{\rednode}[1]{
   \node[draw=red]{#1};
}
\cMakeRobust{\rednode}

\begin{document}

\begin{frame}[fragile]

\begin{tikzpicture}

   \node[draw=blue]{
\begin{lstlisting}
int main()
{
    printf("Hello World\n");
} 
\end{lstlisting}
   };

   \rednode{
\begin{lstlisting}
int main()
{
    printf("Hello World\n");
} 
\end{lstlisting}
   }

\end{tikzpicture}

\end{frame}

\end{document}

相关内容