适用于 lstinputlisting 但非 lstlisting 的框架

适用于 lstinputlisting 但非 lstlisting 的框架

我正在使用列表来处理包含 TeX 文件中的代码示例以及从外部文件输入的代码示例的文档。我希望后者上方和下方有水平线,但前者不行,但使用我当前的设置,两者都有水平线。我的序言有

 \lstset{
         basicstyle=\footnotesize\ttfamily,
         escapechar=¢,
         language=python,
         frame=lines
 }

我知道我可以覆盖框架,lstlisting\begin{lstlisting}[frame=none]有没有办法可以自动完成而不必这样做?

我有大量清单,因此如果可能的话,我宁愿更改序言,而不是更改主要文档文本。

下面是目前其工作原理的一个例子:

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{code.py}
for j in range(100):
    print(j)
    print(j**3)
\end{filecontents*}

\usepackage{listings}
\lstset{
         basicstyle=\footnotesize\ttfamily,
         escapechar=¢,
         language=python,
         frame=lines
 }

\begin{document}
An inline code example:
\begin{lstlisting}
for i in range(10):
    print(i**2)
\end{lstlisting}

Some code inputted from elsewhere:
\lstinputlisting[caption=code example]{code.py}

\end{document}

正如您所看到的,我在两个代码清单周围都得到了几行,但我不希望它们出现在第一个代码清单周围。

答案1

重新定义\lstinputlisting为始终使用frame=lines

在此处输入图片描述

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{code.py}
for j in range(100):
    print(j)
    print(j**3)
\end{filecontents*}

\usepackage{listings}
\lstset{
   basicstyle=\footnotesize\ttfamily,
   escapechar=¢,
   language=python
}
\let\oldlstinputlisting\lstinputlisting
% \lstinputlisting always have frame=lines
\renewcommand{\lstinputlisting}[2][]{\oldlstinputlisting[frame=lines,#1]{#2}}

\begin{document}
An inline code example:
\begin{lstlisting}
for i in range(10):
    print(i**2)
\end{lstlisting}

Some code inputted from elsewhere:
\lstinputlisting[caption=code example]{code.py}

\end{document}

答案2

可以\lstnewenvironment用来定义替代选项,但是您需要使用新环境而不是一个lstlisting

在此处输入图片描述

\documentclass{article}
\begin{filecontents*}{code.py}
for i in range(10):
    print(i**2)
\end{filecontents*}
 \usepackage{listings}
\lstset{
         basicstyle=\footnotesize\ttfamily,
         escapechar=¢,
         language=python,
         frame=lines
 }
\lstnewenvironment{unlined}
{\lstset{frame=none}}
{} % http://mirrors.ctan.org/macros/latex/contrib/listings/listings.pdf , section 4.16

\begin{document}
An inline code example:
\begin{unlined}
for i in range(10):
    print(i**2)
\end{unlined}

Some code inputted from elsewhere:
\lstinputlisting[caption=code example]{code.py}

\end{document}

相关内容