封装在 vbox 中

封装在 vbox 中

我在我的出版物中使用minted来嵌入我的源代码示例并进行适当的突出显示。不幸的是,它们受保密协议 (NDA) 保护,因此我必须在将论文发布到互联网上之前将它们清空。我尝试了这个censor包,更具体地说\censorbox,但当我在 minted 环境中使用它时,它会破坏我的排版。

有人可以给我一个简单的例子,说明如何从 pdf 中删除我的源代码,但保留布局(用空白或黑线替换)吗?

begin{listing}[H]
\censorbox{
    \begin{minted}{cpp}
    // some CPP code ...
    \end{minted}
}
\caption[Caption]{Listing Caption}
\label{lst:code}
\end{listing}

答案1

很难将minted环境本身作为 的参数\censorbox,因为它包含逐字材料。在将其作为参数传递时,catcode 是固定的,并且逐字性基本上被破坏了。有解决方法,但我将采用另一种方法,即将环境的输出保存minted在框中,然后使用该框。优点是框始终包含完全排版的材料,因此不必处理不可变的 catcode。

封装在 vbox 中

受到这个答案的启发(马可·丹尼尔,2013年) 我只是将minted环境封装在一个名为的 vbox 中\mintedbox。然后可以将此 vbox 与 一起使用\box\mintedbox,它也可以在 内部工作\censorbox

\documentclass{article}
\usepackage{minted,etoolbox,censor}
\newbox\mintedbox
\BeforeBeginEnvironment{minted}{\setbox\mintedbox=\vbox\bgroup}%
\AfterEndEnvironment{minted}{\egroup}%
\begin{document}
\begin{listing}[H]
  \begin{minted}{cpp}
    #include <iostream>

    // some CPP code ...
    int main()
    {
      std::cout << "Hello World!" << std::cout;
      return 0;
    }
  \end{minted}
  \censorbox{\box\mintedbox}
\caption[Caption]{Listing Caption}
\label{lst:code}
\end{listing}
\end{document}

如果您不喜欢这种语法,您可以将其作为环境。

\newenvironment{censorenv}%
  {\setbox0=\vbox\bgroup}%
  {\egroup\censorbox{\box0}}
\begin{censorenv}
  \begin{minted}{cpp}
    // some CPP code ...
  \end{minted}
\end{censorenv}

受到审查

在此处输入图片描述

未经审查

在此处输入图片描述

黑客攻击 fancyvrb

这是一个非常 hackish 的解决方案。我复制了 的定义SaveVerbatim并将其修改为始终保存到名为 的框中minted。然后我重新声明Verbatim改为调用 修改mintedSaveVerbatim后的。现在,当您使用 时,\begin{minted}...\end{minted}内容不会被打印,而是保存到名为 的框中minted。然后您可以使用 放置此框\BUseVerbatim{minted}。这个也将在 中工作\censorbox

\documentclass{article}
\usepackage{minted,censor}
\makeatletter
\def\mintedSaveVerbatim{\FV@Environment{}{mintedSaveVerbatim}}
\def\FVB@mintedSaveVerbatim{%
  \@bsphack
  \begingroup
    \FV@UseKeyValues
    \def\SaveVerbatim@Name{minted}%
    \gdef\FV@TheVerbatim{}%
    \def\FV@ProcessLine##1{%
      \expandafter\gdef\expandafter\FV@TheVerbatim\expandafter{%
        \FV@TheVerbatim\FV@ProcessLine{##1}}}%
    \gdef\FV@TheVerbatim{}%
    \FV@Scan}
\def\FVE@mintedSaveVerbatim{%
  \expandafter\global\expandafter\let
  \csname FV@SV@\SaveVerbatim@Name\endcsname\FV@TheVerbatim
  \endgroup\@esphack}
\RecustomVerbatimEnvironment{Verbatim}{mintedSaveVerbatim}{}
\begin{document}
\begin{listing}[H]
  \begin{minted}{cpp}
    #include <iostream>

    // some CPP code ...
    int main()
    {
      std::cout << "Hello World!" << std::cout;
      return 0;
    }
  \end{minted}
  \censorbox{\BUseVerbatim{minted}}
\caption[Caption]{Listing Caption}
\label{lst:code}
\end{listing}
\end{document}

受到审查

在此处输入图片描述

未经审查

在此处输入图片描述

相关内容