我有一段代码片段,我想用箭头、框和气泡来注释指向代码的各个部分。
minted
现在,我已经在环境中、在里面minipage
、在里面获得了代码tikzpicture
。
我想知道,是否可以在小页面顶部绘图,以便我可以用箭头指向小页面内代码的各个部分?
我拥有的:
\documentclass{article}
\usepackage{tikz}
\usepackage{minted}
\begin{document}
\tikzstyle{mybox} = [draw=blue, fill=green!20, very thick,
rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
%
\begin{tikzpicture}[transform shape, baseline=-3.5cm]
\node [mybox] (box) {%
\begin{minipage}[t!]{0.5\linewidth}
Foo
\end{minipage}
\begin{minipage}[t!]{0.5\linewidth}
\begin{minted}{haskell}
let
map = \f -> \l -> case l of
[] -> []
(a :: b) -> (f a) :: (map f b)
in case map (\x->x) [1,2] of
(h :: t) -> (h,t)
\end{minted}
\end{minipage}
};
\end{tikzpicture}
%
\end{document}
我想要的是:
答案1
如果您可以更改为listings
,使用tikzmark
,tikzmarklistings
库和tcolorbox's
comment and listing
选项,您可以执行与您想要的操作类似的操作。这只是一个开始的示例。您将需要自定义tcolorbox
和列表,但也要努力定义如何comment
满足您的需求。
以下代码显示了如何执行此操作。tcolorbox
提供了一个listing and comment
选项,允许在列表旁边包含任何文本。mybox
已声明一个参数,可用于定义您想要的注释。
因为\usetikzmarlibrary{listings}
已加载,所以tikzmarks
每个列表行都定义了几个。您需要用 命名每个代码片段name=...
,然后pic cs:line-name-...
可用于指向箭头。在撰写本文时,我认为代码名称应该是另一个参数,但是……我告诉过你,这只是一个开始的例子 ;-)
\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage[most]{tcolorbox}
\usetikzlibrary{tikzmark}
\usetikzmarklibrary{listings}
\usepackage{lipsum}
\newtcblisting{mybox}[1]{
notitle,
colback=green!30,
colframe=blue,
listing only,
listing options={language=haskell, basicstyle=\ttfamily, name=code},
comment side listing,
lefthand width=.24\linewidth,
#1
}
\begin{document}
\lipsum[1]
\begin{mybox}{comment={\begin{tabular}{l}
Explanation\tikzmark{a}\tikz[remember picture,overlay]{\draw (pic cs: a)--(pic cs:line-code-1-start);}\\
\rule{0pt}{1cm}
More Explanation\tikzmark{b}
\end{tabular}
\tikz[remember picture,overlay]{
\draw[->,red] (pic cs:b)--(pic cs:line-code-6-first);}
}}
let
map = \f -> \l -> case l of
[] -> []
(a :: b) -> (f a) :: (map f b)
in case map (\x->x) [1,2] of
(h :: t) -> (h,t)
\end{mybox}
\end{document}
答案2
这是我所能做到的。我只能在草稿模式下运行 minted,无法escapeinside
为任何角色工作。
\documentclass[draft]{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark,calc,shapes.geometric}
\usepackage{minted}
\begin{document}
\noindent\begin{tikzpicture}[remember picture,baseline=(n1.north)]
\node[minimum width=0.5\textwidth,minimum height=3cm] (box) {};
\node[right,green] at (box.west) {Foo:};
\node[draw,ellipse] (n1) at ($(box.south)!.667!(box.north)$) {Explanation};
\node[draw] (n2) at ($(box.south)!.333!(box.north)$) {More explanation};
\end{tikzpicture}%
\begin{minipage}[t]{0.5\linewidth}
\begin{minted}[escapeinside=||] {haskell}
let
|\tikzmark{p1}|map = \f -> \l -> case l of
[] -> []
(a :: b) -> (f a) :: (map f b)
in case map (\x->x) [1,2] of
|\tikzmark{p2}|(h :: t) -> (h,t)
\end{minted}
\end{minipage}
\begin{tikzpicture}[remember picture,overlay]
\draw[->] (n1.east) -- (pic cs:p1);
\draw[->] (n2.east) -- (pic cs:p2);
\end{tikzpicture}
\end{document}