有没有办法让 minted 完全隐藏代码注释?这与如何删除所有(行和块)注释的列表而不留空格?
但这个问题是关于 listings 包的。
答案1
以下代码创建了一个新环境,mintednc
它将完全删除注释。您可以将其添加到序言中。我已经用 C 和 Python 测试过它。可能需要进行一些调整才能处理其他语言。
此代码通过创建自定义版本来工作\minted@pygmentize
。在此自定义版本中,突出显示的 Pygments 输出通过\write18
Python 命令打开,并且任何以\PY{c}
、\PY{c+cm}
或开头的行都\PY{c+c1}
将被丢弃。这些是带有指示注释的参数的 Pygments 突出显示命令。这种方法完全消除了以注释开头的任何行。但代码后面的内联注释将保持不变。
编辑以回答评论中的问题:添加对的支持\inputminted
只需创建一个\inputmintednc
使用自定义的包装器命令()\minted@pygmentize
。我已将其添加到代码末尾。
根据评论中的错误信息进行编辑:您似乎正在使用 的开发版本minted
。该补丁仅适用于minted
1.7。我添加了可与开发版本配合使用的代码(至少目前如此)。
代码minted 1.7
(在当前的 TeX 发行版中)
\makeatletter
\newcommand{\minted@pygmentize@stripcomments}[2][\jobname.pyg]{
\def\minted@cmd{pygmentize -l #2 -f latex -F tokenmerge
\minted@opt{gobble} \minted@opt{texcl} \minted@opt{mathescape}
\minted@opt{startinline} \minted@opt{funcnamehighlighting}
\minted@opt{linenos} -P "verboptions=\minted@opt{extra}"
-o \jobname.out.pyg #1}
\immediate\write18{\minted@cmd}
% For debugging, uncomment:
%\immediate\typeout{\minted@cmd}
\ifthenelse{\equal{\minted@opt@bgcolor}{}}
{}
{\begin{minted@colorbg}{\minted@opt@bgcolor}}
% add command to strip comments
\immediate\write18{\detokenize{python -c "f = open(\"}\jobname\detokenize{.out.pyg\");
txt = f.readlines(); f.close();
txt = [line for line in txt if not line.lstrip().startswith(\"\\PY{c}\") and not line.lstrip().startswith(\"\\PY{c+c1}\") and not line.lstrip().startswith(\"\\PY{c+cm}\")];
f = open(\"}\jobname\detokenize{.out.pyg\", \"w\");
f.write(\"\".join(txt)); f.close();"}}
% end
\input{\jobname.out.pyg}
\ifthenelse{\equal{\minted@opt@bgcolor}{}}
{}
{\end{minted@colorbg}}
\DeleteFile{\jobname.out.pyg}}
\newenvironment{mintednc}[2][]{%
\VerbatimEnvironment
\let\minted@pygmentize\minted@pygmentize@stripcomments
\begin{minted}[#1]{#2}}{\end{minted}}
\newcommand{\inputmintednc}[3][]{%
\begingroup
\let\minted@pygmentize\minted@pygmentize@stripcomments
\inputminted[#1]{#2}{#3}%
\endgroup}
\makeatother
当前代码开发版本的minted
\makeatletter
\newcommand{\minted@inputpyg@stripcomments}{%
\ifthenelse{\equal{\minted@optcmd@bgcolor}{}}%
{}%
{\begin{minted@colorbg}{\minted@optcmd@bgcolor}}%
% add command to strip comments
\immediate\write18{\detokenize{python -c "from io import open;
import re;
pattern = re.compile(r\"\\PYG([a-z]+)\");
f = open(\"}\minted@outputdir\minted@infile\detokenize{\", encoding=\"}\minted@encoding\detokenize{\");
txt = f.read(); f.close();
p = pattern.search(txt).groups()[0];
p1 = \"\\PYG\"+p+\"{c}\";
p2 = \"\\PYG\"+p+\"{c+c1}\";
p3 = \"\\PYG\"+p+\"{c+cm}\";
txt = [line for line in txt.splitlines(True) if not line.lstrip().startswith(p1) and not line.lstrip().startswith(p2) and not line.lstrip().startswith(p3)];
f = open(\"}\jobname\detokenize{.out.pyg\", \"w\", encoding=\"}\minted@encoding\detokenize{\");
f.write(\"\".join(txt)); f.close();"}}
% end
\input{\jobname.out.pyg}%
\ifthenelse{\equal{\minted@optcmd@bgcolor}{}}%
{}%
{\end{minted@colorbg}}%
}
\newenvironment{mintednc}[2][]{%
\VerbatimEnvironment
\let\minted@inputpyg\minted@inputpyg@stripcomments
\begin{minted}[#1]{#2}}{\end{minted}}
\newcommand{\inputmintednc}[3][]{%
\begingroup
\let\minted@inputpyg\minted@inputpyg@stripcomments
\inputminted[#1]{#2}{#3}%
\endgroup}
\makeatother