列表 - 隐藏代码中的范围标签和后缀/前缀

列表 - 隐藏代码中的范围标签和后缀/前缀

我正在使用列表生成一些代码框,并使用带后缀和前缀的范围标签进行摘录。我可以通过转义到 LaTeX 并使用 来隐藏完整代码中的开始标记\phantom,但当我尝试使用内部的结束标记转义到 LaTeX 时,它不起作用。

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{cleveref}

\lstset{
    language=Python,
    basicstyle=\ttfamily\small,
    aboveskip={1.0\baselineskip},
    belowskip={1.0\baselineskip},
    frame=tblr,
    rulecolor=\color{gray},
    keywordstyle=\color[rgb]{0.627,0.126,0.941},
    commentstyle=\color[rgb]{0.133,0.545,0.133},
    stringstyle=\color[rgb]{01,0,0},
    numbers=left,
    numberstyle=\footnotesize\color{gray},
    captionpos=t,
    escapeinside={\#`}{`},
}


\begin{document}

\section{Examples}

\subsection{Excerpt of Code}
\lstinputlisting[includerangemarker=false,
rangeprefix=:~,  
rangesuffix=~:,
linerange=beg:def-end:def,
]{"ex.py"}


\subsection{Full Code}
\lstinputlisting[
]{"ex.py"}


\end{document}

使用下面的 Python 代码

import numpy as np

x = np.linspace(0,10,num=100)
#`\phantom{:~beg:def~:}`
def y(x, a=1, b=1, c=1):
    return a*x**2 + b*x + c
#:~end:def~:

print(y(x)) 

print('Finished')

但是当我将第 7 行改为

#`\phantom{:~end:def~:}`

标签 end:def 的功能停止工作,代码摘录显示其余代码,但从 beg:def 开始。

答案1

首先,你应该确保范围分隔符跨越整行,否则范围检测可能不正确。所以如果你的所有范围注释都看起来像

#`:~<marker>~:`

你应该定义

rangeprefix = \#`:~,
rangesuffix = ~:`


为了隐藏完整代码列表中的标记注释,我看到两个选项。

如果您只想隐藏标记注释但保留列表中的行,您可以定义一个新的分隔符,以白色(或背景色)呈现注释:

moredelim = [is][\color{white}]{\#`:~}{~:`}

如果要完全删除相应的行,可以定义一个新的、不可见的注释类型,以行尾字符结束^^M,从而从输出中删除整行:

morecomment = [is]{\#`:~}{\^^M}

请注意,后者listings实际上看不到该行,这会对行号产生影响。

完整示例:

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

\usepackage{filecontents}
\begin{filecontents*}{\jobname.py}
import numpy as np

x = np.linspace(0,10,num=100)
#`:~beg:def~:`
def y(x, a=1, b=1, c=1):
    return a*x**2 + b*x + c
#`:~end:def~:`

print(y(x)) 

print('Finished')
\end{filecontents*}

\lstset{
    language=Python,
    basicstyle=\ttfamily\small,
    aboveskip={1.0\baselineskip},
    belowskip={1.0\baselineskip},
    frame=tblr,
    rulecolor=\color{gray},
    keywordstyle=\color[rgb]{0.627,0.126,0.941},
    commentstyle=\color[rgb]{0.133,0.545,0.133},
    stringstyle=\color[rgb]{01,0,0},
    numbers=left,
    numberstyle=\footnotesize\color{gray},
    captionpos=t,
%    escapeinside={\#`}{`},
}

\begin{document}

\section{Examples}

\subsection{Excerpt of Code}
\lstinputlisting[
    includerangemarker=false,
    rangeprefix=\#`:~,
    rangesuffix=~:`,
    linerange=beg:def-end:def,
]{\jobname.py}

\subsection{Full Code, delimiters hidden}
\lstinputlisting[
    moredelim={[is][\color{white}]{\#`:~}{~:`}}
]{\jobname.py}

\subsection{Full Code, delimiter lines removed}
\lstinputlisting[
    morecomment={[is]{\#`:~}{\^^M}}
]{\jobname.py}

\end{document}

输出

在此处输入图片描述

相关内容