minted:隐藏代码中的注释?

minted:隐藏代码中的注释?

有没有办法让 minted 完全隐藏代码注释?这与如何删除所有(行和块)注释的列表而不留空格?

但这个问题是关于 listings 包的。

答案1

以下代码创建了一个新环境,mintednc它将完全删除注释。您可以将其添加到序言中。我已经用 C 和 Python 测试过它。可能需要进行一些调整才能处理其他语言。

此代码通过创建自定义版本来工作\minted@pygmentize。在此自定义版本中,突出显示的 Pygments 输出通过\write18Python 命令打开,并且任何以\PY{c}\PY{c+cm}或开头的行都\PY{c+c1}将被丢弃。这些是带有指示注释的参数的 Pygments 突出显示命令。这种方法完全消除了以注释开头的任何行。但代码后面的内联注释将保持不变。

编辑以回答评论中的问题:添加对的支持\inputminted只需创建一个\inputmintednc使用自定义的包装器命令()\minted@pygmentize。我已将其添加到代码末尾。

根据评论中的错误信息进行编辑:您似乎正在使用 的开发版本minted。该补丁仅适用于minted1.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

相关内容