listings 包:如果代码只有一行,则不编号

listings 包:如果代码只有一行,则不编号

我有一个自定义样式,lstlisting左侧有数字,每行设置数字步长。我想知道如果列表只有一行,列表如何显示而没有数字。

我的配置如下:

\lstset{
breaklines=true,
captionpos=b, % sets the caption-position to bottom
basicstyle=\ttfamily\footnotesize,
commentstyle=\color{verdeComentario},   
numbers=left, % número de línea a la izquierda
stepnumber=1, % salto de cada línea
tabsize=3,
numberstyle=\tiny,
xleftmargin=15pt,
xrightmargin=15pt,
framesep=5pt,
frame=tb,
framerule=0.2pt,
backgroundcolor=\color{grisDebil},
lineskip=-1pt,
tabsize=3,
escapeinside={@}{@},
aboveskip=20pt,
belowskip=20pt,
}

% -----------------------------
%     Maude
% -----------------------------

\lstdefinelanguage{maude}
{
    alsoletter={\:},
    morecomment=[l]{---},
    morecomment=[l]{***},
    keywords={in, load, pr, protecting, sort, sorts, subsort, subsorts, including, class, msg, msgs, endfm, fmod, is, mod, endm, omod, endom},
    keywords=[2]{eq,  mb, ceq, if, rl, crl, else, then, fi},
    keywords=[3]{ctor, assoc, comm, gather, id\:},
    keywords=[4]{op, ops, var, vars}
}

\lstdefinestyle{maude}{
    language=maude,
    keywordstyle=\bfseries\color{rojoReservado},
    keywordstyle=[2]\bfseries\color{verdeReservado},
    keywordstyle=[3]\bfseries\color{turquesaReservado},
    keywordstyle=[4]\bfseries\color{moradoReservado},
}

我可以在每个列表中仅用一行选项进行设置numbers=none,但我刚刚写了一个很长的文档,如果我知道如何自动完成此操作,我将不胜感激。

答案1

以下是我使用以下方法快速解决的问题Heiko 对有关列表中行数的回答,但我必须删除才能\protect使其工作。您的配置都不相关,所以我忽略了它。

Heiko 的代码使用引用系统来保存列表中的行数(因此第一次运行时不知道此信息,并且在更改或添加列表后第一次运行时不正确),我刚刚在钩子中添加了代码,PreSet如果listings列表中只有一行则禁用数字,否则在左侧设置编号。这仍然可以通过将选项传递给单个列表来覆盖,如最后两个示例所示:

\documentclass[a4paper]{article}
\usepackage{listings}
\usepackage{zref-base}

\makeatletter
\newcounter{mylstlisting}
\newcounter{mylstlines}
\lst@AddToHook{PreSet}{%
  \stepcounter{mylstlisting}%
  \ifnum\mylstlines=1\relax
    \lstset{numbers=none}
  \else
    \lstset{numbers=left}
  \fi
  \setcounter{mylstlines}{0}%
}
\lst@AddToHook{EveryPar}{%
  \stepcounter{mylstlines}%
}
\lst@AddToHook{ExitVars}{%
  \begingroup
    \zref@wrapper@immediate{%
      \zref@setcurrent{default}{\the\value{mylstlines}}%
      \zref@labelbyprops{mylstlines\the\value{mylstlisting}}{default}%
    }%
  \endgroup
}

% \mylstlines print number of lines inside listing caption
\newcommand*{\mylstlines}{%
  \zref@extractdefault{mylstlines\the\value{mylstlisting}}{default}{0}%
}
\makeatother

% cosmetics
\usepackage[T1]{fontenc}
\usepackage[variablett]{lmodern}
\lstset{basicstyle=\ttfamily, columns=fullflexible,
    numbers=left, stepnumber=1}

\begin{document}
  \lstlistoflistings

  \section*{Main}
  \begin{lstlisting}[
    caption={Example with \mylstlines\ lines.},
  ]
  Hello
  world
  \end{lstlisting}

  \hrule

  \begin{lstlisting}[
    caption={Example with \mylstlines\ lines.},
  ]
  Hello
  \end{lstlisting}

  \hrule

  \begin{lstlisting}[
    caption={Example with \mylstlines\ lines. Can still override numbering.},numbers=none
  ]
  Hello
  world
  \end{lstlisting}

  \hrule

  \begin{lstlisting}[
    caption={Example with \mylstlines\ lines. Can still override numbering.},numbers=left
  ]
  Hello
  \end{lstlisting}


\end{document}

截屏

(感谢 Peter Grill 指出,这个答案的先前版本在文件aux设置之前的第一次运行时出现了错误。这个问题现在已经修复。)

相关内容