如何在 tikz 中绘制小​​页面?

如何在 tikz 中绘制小​​页面?

我有一段代码片段,我想用箭头、框和气泡来注释指向代码的各个部分。

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,使用tikzmarktikzmarklistings库和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}

相关内容