我正在使用列表生成一些代码框,并使用带后缀和前缀的范围标签进行摘录。我可以通过转义到 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}
输出