使用 tikzmarks 在两列中调整框铸造块之间的箭头?

使用 tikzmarks 在两列中调整框铸造块之间的箭头?

我想

  • 将两个铸造的源代码块放入两个 beamer 列中
  • 箭头指向两者之间(基于 tikzmark)
  • 并使用调整框将代码块缩小到列宽

无需调整框即可正常工作(基于可以在 minted 里面使用 tikzmark 吗?在铸造的代码上绘制覆盖图形,大部分)。请参见下面示例中的第一帧。

但是,当使用 adjustbox/varwidth 环境围绕铸造块进行缩放时,tikzmarks 似乎关闭并存储错误的位置(这很直观)。请参见下面示例中的第二帧。将第二个 tikzpicture 放在框架中的不同位置会产生不同的效果,但我尝试的所有选项都产生了正确的结果。

(旁注:这些代码示例当然是愚蠢的;只是为了使效果更明显)。

说明:第一个版本可以工作,但是不能扩展代码块。

修正箭头位置,无需调整框缩放

使用调整框后,红色箭头就会出现在各处:

使用调整框时,箭头位置错误

\documentclass[ignorenonframetext,nooutline]{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usepackage{minted}
\usepackage{adjustbox}
\usetheme[hideothersubsections]{Goettingen}

\begin{document}


\begin{frame}[fragile]{Minted columns without adjustbox}

  \begin{columns}
    \tiny
    \begin{column}{0.5\columnwidth}

\begin{minted}[frame=lines,linenos=true,autogobble,escapeinside=??]{c}
int main (void)
{
    zmq_send (sender, "Some long text to have a wide line", 5, 0); ?\tikzmark{start}?

    return 0;
}

\end{minted}

    \end{column}

    \begin{column}{0.5\columnwidth}

\begin{minted}[frame=lines,linenos=true,autogobble,escapeinside=??]{c}
int main (void)
{
// some comment  
// some more comment 

    ?\tikzmark{eend}? zmq_receive (s, buffer, 100, 0); 
}

\end{minted}

    \end{column}

    \begin{tikzpicture}[remember picture]
      \draw [overlay, ->, line width=5pt, red] (pic cs:start) -- (pic cs:eend);
    \end{tikzpicture}

  \end{columns}
\end{frame}

% ------------------------

\begin{frame}[fragile,label={sec:org93808b5}]{With adjust box}
  \begin{columns}
    \begin{column}{0.5\columnwidth}
      \begin{block}{Sender}
        \begin{adjustbox}{width=0.35\columnwidth}
          \begin{varwidth}{\columnwidth}

\begin{minted}[frame=lines,linenos=true,mathescape=true,escapeinside=??]{c}
int main (void)
{
    zmq_send (sender, "Some long text to have a wide line", 5, 0); ?\tikzmark{start1}?

    return 0;
}
\end{minted}

          \end{varwidth}
        \end{adjustbox}
      \end{block}
    \end{column}

    \begin{column}{0.5\columnwidth}
      \begin{block}{Receiver}
        \begin{adjustbox}{width=0.4\columnwidth}
          \begin{varwidth}{\columnwidth}

\begin{minted}[frame=lines,linenos=true,mathescape=true,escapeinside=??]{c}
int main (void)
{
// some comment  
// some more comment 

    ?\tikzmark{end2}? zmq_receive (s, buffer, 100, 0); 
}
\end{minted}

          \end{varwidth}
        \end{adjustbox}
      \end{block}
    \end{column}

      \begin{tikzpicture}[remember picture]
        \draw[overlay, ->, line width=5pt, red] (pic cs:start1) -- (pic cs:end1);
      \end{tikzpicture}

  \end{columns}
\end{frame}


\end{document}

答案1

缩放字体不是一个好主意,要么手动选择合适的字体大小(已经很小,所以可能没人能读懂),要么使用换行符代替缩放:

% !TeX program = txs:///arara
% arara: pdflatex: {synctex: on, interaction: nonstopmode, shell: yes}
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usepackage{minted}

\begin{document}

\begin{frame}[fragile]{Minted columns without adjustbox}
  \begin{columns}
    \tiny
    \begin{column}{0.48\columnwidth}
            \begin{minted}[frame=lines,linenos=true,autogobble,escapeinside=??,breaklines]{c}
                int main (void)
                {
                    zmq_send (sender, "Some long text to have a wide line", 5, 0); ?\tikzmark{start}?

                    return 0;
                }
            \end{minted}
    \end{column}
    \begin{column}{0.48\columnwidth}
            \begin{minted}[frame=lines,linenos=true,autogobble,escapeinside=??,breaklines]{c}
                int main (void)
                {
                // some comment  
                // some more comment 

                    ?\tikzmark{eend}? zmq_receive (s, buffer, 100, 0); 
                }
            \end{minted}
    \end{column}
    \begin{tikzpicture}[remember picture]
      \draw [overlay, ->, line width=5pt, red] (pic cs:start) -- (pic cs:eend);
    \end{tikzpicture}
  \end{columns}
\end{frame}

\end{document}

在此处输入图片描述

相关内容