我在想如何minted
为beamer
幻灯片构建特定的环境。我可以选择使用叠加层并将代码拆分为多个块(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}