Ich verwende \cref
den Befehl von cleveref zum Referenzieren und \lstnewenvironment
zum Erstellen eines neuen Listentyps. Mein Dokument enthält mehrere Listentypen, jeder mit einem eigenen Zähler.
Allerdings besteht cleveref darauf, alle Listing-Typen aufzurufen listing
, trotz meiner Definition von a \crefname
für die benutzerdefinierten Listing-Typen.
Wie kann ich mit der richtigen Bezeichnung auf einen benutzerdefinierten Eintrag verweisen?
Minimales funktionierendes Beispiel:
\documentclass{article}
\usepackage{listings,cleveref}
% Define listing type for queries
\newcounter{query}
\makeatletter
\lstnewenvironment{query}[1][]
{%
\lstset{#1}%
\renewcommand\lstlistingname{Query}%
\let\c@lstlisting=\c@query%
\let\thelstlisting=\thequery%
}
{}
\makeatother
% Set up reference label
\crefname{query}{query}{queries}
\begin{document}
\begin{lstlisting}[label=lst:MyListing,caption=My listing]
# Hello world
\end{lstlisting}
\begin{query}[label=qry:MyQuery,caption=My query]
SELECT * FROM MyTable;
\end{query}
Reference to \cref{lst:MyListing} and \cref{qry:MyQuery}.
\end{document}
Antwort1
Sie können listings
die Verwendung des richtigen Zählers anstelle des Standardzählers erzwingen lstlisting
:
\documentclass{article}
\usepackage{etoolbox,listings,cleveref}
% Define listing type for queries
\newcounter{query}
\makeatletter
\lstnewenvironment{query}[1][]
{%
% make \lst@MakeCaption use query instead of lstlisting
\patchcmd{\lst@MakeCaption}{{lstlisting}}{{query}}{}{}%
\lstset{basicstyle=\ttfamily,columns=fullflexible,#1}%
\renewcommand\lstlistingname{Query}%
\let\thelstlisting=\thequery
}
{}
\makeatother
% Set up reference label
\crefname{query}{query}{queries}
\begin{document}
\begin{lstlisting}[label=lst:MyListing,caption=My listing]
# Hello world
\end{lstlisting}
\begin{query}[label=qry:MyQuery,caption=My query]
SELECT * FROM MyTable;
\end{query}
\begin{lstlisting}[label=lst:MyListing2,caption=My listing]
# Hello world
\end{lstlisting}
\begin{query}[label=qry:MyQuery2,caption=My query]
SELECT * FROM MyTable;
\end{query}
Reference to \cref{lst:MyListing} and \cref{qry:MyQuery}.
Reference to \cref{lst:MyListing2} and \cref{qry:MyQuery2}.
\end{document}
Fix für die Zusammenarbeit mithyperref
\documentclass{article}
\usepackage{etoolbox,listings,hyperref,bookmark,cleveref}
% Define listing type for queries
\newcounter{query}
\makeatletter
\patchcmd{\lst@MakeCaption}{{lstlisting}}{{\verborgh@counter}}{}{}%
\def\verborgh@counter{lstlisting}
\def\verborgh@prefix{L}
\AtBeginDocument{%
\patchcmd{\theHlstnumber}{\thelstnumber}{\verborgh@prefix\thelstnumber}{}{}%
}
\lstnewenvironment{query}[1][]
{%
% make \lst@MakeCaption use query instead of lstlisting
\def\verborgh@counter{query}%
\def\verborgh@prefix{Q}%
\lstset{basicstyle=\ttfamily,columns=fullflexible,#1}%
\renewcommand\lstlistingname{Query}%
}
{}
\makeatother
% Set up reference label
\crefname{query}{query}{queries}
\begin{document}
\begin{lstlisting}[label=lst:MyListing,caption=My listing]
# Hello world
\end{lstlisting}
\begin{query}[label=qry:MyQuery,caption=My query]
SELECT * FROM MyTable;
\end{query}
\begin{lstlisting}[label=lst:MyListing2,caption=My listing]
# Hello world
\end{lstlisting}
\begin{query}[label=qry:MyQuery2,caption=My query]
SELECT * FROM MyTable;
\end{query}
Reference to \cref{lst:MyListing} and \cref{qry:MyQuery}.
Reference to \cref{lst:MyListing2} and \cref{qry:MyQuery2}.
\end{document}