我如何从 lstnewenvironment 中绘制现有的 tikzpicture?

我如何从 lstnewenvironment 中绘制现有的 tikzpicture?

tikzpicture如果我将环境移到 的 after 命令中,下面的示例可以正常工作lstnewenvironment。但是,如果我想在现有的 中绘制tikzpicture,则不会显示节点内容。如果我添加更多代码行,它会垂直增长,但它们不可见:

\documentclass{beamer}

\usepackage{listings}
\usepackage{tikz}

\makeatletter
\lstnewenvironment{code}{%
    \lstset{%
        basicstyle=\ttfamily\footnotesize,
    }%
    \setbox\@tempboxa=\hbox\bgroup\color@setgroup
}%
{%
    \color@endgroup\egroup
        \node [fill=green]
            {\box\@tempboxa};
}

\begin{document}

\begin{frame}[fragile]

\begin{tikzpicture}
    \begin{code}
Some Code
    \end{code}
\end{tikzpicture}

\end{frame}

\end{document}

我该如何修复这个问题,以便正确显示框,但又可以在同一个 tikzpicture 内创建多个代码框?

答案1

您不需要临时框(而且您很幸运\node在执行 之前没有覆盖它\box\@tempboxa)。您可以让环境主体直接使用环境起始代码 和结束代码填充\node内容。因为它是和 不是 TeX 的原语,所以我认为和不是必需的,尽管它们可能不会造成危害。最后一件事:不要忘记!\node[fill=green] \bgroup\egroup\node\hbox\color@setgroup\color@endgroup\makeatother

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

\makeatletter
\lstnewenvironment{code}{%
    \lstset{basicstyle=\ttfamily\footnotesize}%
    \node[fill=green] \bgroup
}%
{%
    \egroup ;%
}
\makeatother

\begin{document}

\begin{frame}[fragile]

\begin{tikzpicture}
    \begin{code}
Some Code ($%@}{#\~&!)
    \end{code}
\end{tikzpicture}

\end{frame}

\end{document}

在此处输入图片描述

相关内容