我有一个自定义样式,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
设置之前的第一次运行时出现了错误。这个问题现在已经修复。)