我见过许多关于这个问题的答案,但似乎都没有解决问题。
我希望能够将代码块放入已定义的 中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}
结果:
采用这种方法,您就不需要选项fragile
了frame
;我留下它只是以防您想添加一些其他以前未装箱的逐字材料。
答案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}