如何在包装铸造环境时分配节点名称?

如何在包装铸造环境时分配节点名称?

我在想如何mintedbeamer幻灯片构建特定的环境。我可以选择使用叠加层并将代码拆分为多个块(Beamer 与 Minted:覆盖)或者只是在顶部绘制一些框架。我觉得第二种方法应该更好一些,尽管它需要一些绝对坐标来进行选择以大致匹配代码。

我读了 使用命令将铸币包装在 Tikz 盒子中并且它工作得很好,但是我希望能够用一些唯一的名称来引用每个节点。例如,下面允许我稍后引用单个铸造块作为A

\renewenvironment{minted@colorbg}[1]{%
  \noindent
  \begin{lrbox}{\minted@bgbox}
  \begin{minipage}{.8\linewidth}}
 {\end{minipage}
  \end{lrbox}%
  \tikz\node[text width=\linewidth,] (a) %mintedbox,
         {\usebox{\minted@bgbox}};
 }

%\newmint[jscode]{javascript}{}

\tikzstyle{every picture}+=[remember picture]

所以我可以稍后再做类似的事情

\begin{tikzpicture}[overlay]
        \draw (a.north west) rectangle ++(2cm,-1cm);
\end{tikzpicture}

我希望它不那么硬编码。是否可以通过某种方式重新定义或类似方式将名称传递到该\renewenvironment定义中?minted

如果有更好的替代方案来指出幻灯片minted上的特定环境片段beamer,我会感兴趣。

答案1

在下面的例子中,我定义了一个新的计数器。这样就可以使每个节点都具有唯一性。可以通过设置以下命令来打印节点编号:

\showmintedcountertrue

在这种情况下,节点名称将被打印在右边距。

% !TEX program  = pdflatex -- shell-escape
\documentclass[12pt]{beamer}
\usepackage[]{minted}

\usepackage{tikz}
\makeatletter
\newcounter{mymintedcounter}
\newif\ifshowmintedcounter
\edef\minted@resetoptions{\minted@resetoptions\def\minted@opt@bgcolor{foo}}
\renewenvironment{minted@colorbg}[1]{%
  \noindent\stepcounter{mymintedcounter}%
  \begin{lrbox}{\minted@bgbox}
  \begin{minipage}{.8\linewidth}}
 {\end{minipage}
  \end{lrbox}%
  \tikz\node[text width=\linewidth] (a-\themymintedcounter) 
         {\usebox{\minted@bgbox}%
           \ifshowmintedcounter\hfill\rlap{\quad\themymintedcounter}\fi
         };
 }
\makeatletter

\tikzstyle{every picture}+=[remember picture]


%\showmintedcounterfalse
\showmintedcountertrue

\begin{document}
\begin{frame}[fragile]
\begin{minted}[]{javascript}
a=b;
\end{minted}
\begin{tikzpicture}[overlay]
        \draw (a-\themymintedcounter.north west) rectangle ++(2cm,-1cm);
\end{tikzpicture}
\end{frame}
\end{document}

相关内容