我在我的出版物中使用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}