- Questo topic ha 7 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 14 anni, 4 mesi fa da
Lorenzo.
-
CreatoreTopic
-
15 Gennaio 2012 alle 9:50 #68684::
Uso il pacchetto listings per inserire codice in documenti LaTeX. Ho creato i nuovi ambienti “algoritmo” e “listato” seguendo delle indicazioni trovate in rete:`\newcounter{oldlstlisting}
\newcounter{algoritmo}[chapter]
\newcounter{listato}[chapter]\lstnewenvironment{algoritmo}[1][]{
\setcounter{oldlstlisting}{\value{lstlisting}}
\setcounter{lstlisting}{\value{algoritmo}}
\renewcommand*{\lstlistingname}{Algoritmo}
\lstset{#1}
}{
\stepcounter{algoritmo}
\setcounter{lstlisting}{\value{oldlstlisting}}
}
\lstnewenvironment{listato}[1][]{
\setcounter{oldlstlisting}{\value{lstlisting}}
\setcounter{lstlisting}{\value{listato}}
\renewcommand*{\lstlistingname}{Listato}
\lstset{#1}
}{
\stepcounter{listato}
\setcounter{lstlisting}{\value{oldlstlisting}}
}`Con il comando \lstlistoflistings ottengo l’elenco degli algoritmi e dei listati (con un avvertimento relativo all’uso dello stesso identificatore), ma quello che vorrei è avere due elenchi: uno per gli algoritmi e uno per i listati. È possibile? Nel manuale di listings non ho trovato nulla a tale proposito, se qualcuno ha dei suggerimenti…
Grazie e ciao.
Claudio
-
CreatoreTopic
-
AutoreRisposte
-
-
16 Gennaio 2012 alle 21:08 #68685::
Se tu aggiungessi qualche informazione in più, sarebbe meglio. 🙂Do per scontato che non usi ClassicThesis e derivati. Una possibile soluzione è questa:
`\documentclass[10pt,a4paper]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{listings,hyperref}
\usepackage{etoolbox} % ci serve per \patchcmd, vedi sotto\lstset{basicstyle=\small\ttfamily,columns=fullflexible}
\renewcommand*{\lstlistingname}{Listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\newcommand*{\lstalgorithmname}{Algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}\makeatletter
% Definiamo il contatore da usare per gli algoritmi, in maniera
% equivalente a quello che fa listings.
% Quello predefinito di listings (cioè lstlisting) viene lasciato per
% i listati.
\AtBeginDocument{
\lst@ifnumberbychapter
\newcounter{lstalgorithm}[chapter]
\gdef\thelstalgorithm
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstalgorithm}
\else
\newcounter{lstalgorithm}
\gdef\thelstalgorithm{\@arabic\c@lstalgorithm}
\fi}
% Quando viene scritto un algoritmo, specifichiamo di salvarlo nel
% file loa (anziché lol, dove lasciamo i listati) e di usare il
% contatore lstalgorithm (invece di lstlisting).
\let\lst@MakeCaptionForAlg\lst@MakeCaption
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
% Il blocco che segue è duplicato di quello precedente: è giusto così! 🙂
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
\patchcmd\lst@MakeCaptionForAlg
{lstlisting}
{lstalgorithm}
{}{\errmessage{patch failed}}
% Se è stato caricato tocloft possiamo usare il comando che offre…
\@ifpackageloaded{tocloft}{
\newlistof{algorithms}{loa}{\lstlistalgorithmname}
}{
% …altrimenti facciamo a mano.
\newcommand*\listofalgorithms{\bgroup
\let\contentsname\lstlistalgorithmname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{loa}}%
\tableofcontents \egroup}
}% Per comodità (e analogia con figure e tabelle) chiamiamo i comandi
% \listoflistings e \listofalgorithms.
\let\listoflistings\lstlistoflistings
% Impostiamo per li algoritmi la stessa formattazione dei listati:
\let\l@lstalgorithm\l@lstlisting\lstnewenvironment{algoritmo}[1][]{
\let\lst@MakeCaption\lst@MakeCaptionForAlg
% Giusto per evitare l'avviso sulle etichette duplicate:
\renewcommand*\thelstnumber{a\@arabic\c@lstnumber}
\let\lstlistingname\lstalgorithmname
\lstset{#1}
}{}\lstnewenvironment{listato}[1][]{\lstset{#1}}{}
\makeatother\begin{document}
\begingroup
\let\clearpage\relax
\listoflistings
\bigskip
\listofalgorithms
\endgroup\vfill
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}\begin{algoritmo}
\newcommand*{\lstalgorithmname}{Algoritmo}
\end{algoritmo}\begin{listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\end{listato}\begin{algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\end{algoritmo}
\end{document}`Potrebbero esser fatte piccole variazioni sapendo se carichi tocloft o no (cioè se devi caricare titletoc). Andrebbero fatti cambiamenti ben più sostanziosi se invece usi ClassicThesis o simili…
Ciao,
Antonio
-
17 Gennaio 2012 alle 16:34 #68686
-
17 Gennaio 2012 alle 18:10 #68687::
Ciao Antonio.Inserendo il tuo codice in un mio documento ho notato che qualcosa non funziona con il contatore per gli algoritmi. Ho modificato il tuo codice d’esempio come segue per evidenziare il problema (in pratica: l’algoritmo 1.1. viene etichettato con 1.2).
`\documentclass[10pt,a4paper]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}\usepackage{listings,hyperref}
\usepackage{etoolbox} % ci serve per \patchcmd, vedi sotto\lstset{basicstyle=\small\ttfamily,columns=fullflexible}
\renewcommand*{\lstlistingname}{Listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\newcommand*{\lstalgorithmname}{Algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}\makeatletter
% Definiamo il contatore da usare per gli algoritmi, in maniera
% equivalente a quello che fa listings.
% Quello predefinito di listings (cioè lstlisting) viene lasciato per
% i listati.
\AtBeginDocument{
\lst@ifnumberbychapter
\newcounter{lstalgorithm}[chapter]
\gdef\thelstalgorithm
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstalgorithm}
\else
\newcounter{lstalgorithm}
\gdef\thelstalgorithm{\@arabic\c@lstalgorithm}
\fi}
% Quando viene scritto un algoritmo, specifichiamo di salvarlo nel
% file loa (anziché lol, dove lasciamo i listati) e di usare il
% contatore lstalgorithm (invece di lstlisting).
\let\lst@MakeCaptionForAlg\lst@MakeCaption
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
% Il blocco che segue è duplicato di quello precedente: è giusto così! 🙂
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
\patchcmd\lst@MakeCaptionForAlg
{lstlisting}
{lstalgorithm}
{}{\errmessage{patch failed}}
% Se è stato caricato tocloft possiamo usare il comando che offre…
\@ifpackageloaded{tocloft}{
\newlistof{algorithms}{loa}{\lstlistalgorithmname}
}{
% …altrimenti facciamo a mano.
\newcommand*\listofalgorithms{\bgroup
\let\contentsname\lstlistalgorithmname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{loa}}%
\tableofcontents \egroup}
}% Per comodità (e analogia con figure e tabelle) chiamiamo i comandi
% \listoflistings e \listofalgorithms.
\let\listoflistings\lstlistoflistings
% Impostiamo per li algoritmi la stessa formattazione dei listati:
\let\l@lstalgorithm\l@lstlisting\lstnewenvironment{algoritmo}[1][]{
\let\lst@MakeCaption\lst@MakeCaptionForAlg
% Giusto per evitare l'avviso sulle etichette duplicate:
\renewcommand*\thelstnumber{a\@arabic\c@lstnumber}
\let\lstlistingname\lstalgorithmname
\lstset{#1}
}{}\lstnewenvironment{listato}[1][]{\lstset{#1}}{}
\makeatother% Correzione per fare in modo che nella lista dei listati, i listati di capitoli
% diversi vengano separati da uno spazio supplementare
\makeatletter
\let\my@chapter\@chapter
\renewcommand*{\@chapter}{%
\addtocontents{lol}{\protect\addvspace{10pt}}%
\addtocontents{loa}{\protect\addvspace{10pt}}%
\my@chapter}
\makeatother\begin{document}
\begingroup
\let\clearpage\relax
\listoflistings
\bigskip
\listofalgorithms
\endgroup\vfill
\chapter{UN0}
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}\begin{algoritmo}
\newcommand*{\lstalgorithmname}{Algoritmo}
\end{algoritmo}\begin{listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\end{listato}\begin{algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\end{algoritmo}\chapter{DUE}
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}\begin{algoritmo}
\newcommand*{\lstalgorithmname}{Algoritmo}
\end{algoritmo}\begin{listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\end{listato}\begin{algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\end{algoritmo}\end{document}`
Malgrado i tuoi apprezzati commenti al codice, non ho sufficienti conoscenze per capire tutto. Se hai ancora del tempo da dedicare al mio problema…
Grazie e ciao.
Claudio
-
17 Gennaio 2012 alle 20:31 #68688::
Vero, mancava una cosa nel mio codice!`\documentclass[10pt,a4paper]{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}\usepackage{listings,hyperref}
\usepackage{etoolbox} % ci serve per \patchcmd, vedi sotto\lstset{basicstyle=\small\ttfamily,columns=fullflexible}
\renewcommand*{\lstlistingname}{Listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\newcommand*{\lstalgorithmname}{Algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}\makeatletter
% Definiamo il contatore da usare per gli algoritmi, in maniera
% equivalente a quello che fa listings.
% Quello predefinito di listings (cioè lstlisting) viene lasciato per
% i listati.
\AtBeginDocument{
\lst@ifnumberbychapter
\newcounter{lstalgorithm}[chapter]
\gdef\thelstalgorithm
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstalgorithm}
\else
\newcounter{lstalgorithm}
\gdef\thelstalgorithm{\@arabic\c@lstalgorithm}
\fi}% Quando viene scritto un algoritmo, specifichiamo di salvarlo nel
% file loa (anziché lol, dove lasciamo i listati) e di usare il
% contatore lstalgorithm (invece di lstlisting).
\let\lst@MakeCaptionForAlg\lst@MakeCaption
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
% Il blocco che segue è duplicato di quello precedente: è giusto così! 🙂
\patchcmd\lst@MakeCaptionForAlg
{\addcontentsline{lol}{lstlisting}}
{\addcontentsline{loa}{lstalgorithm}}
{}{\errmessage{patch failed}}
\patchcmd\lst@MakeCaptionForAlg
{lstlisting}
{lstalgorithm}
{}{\errmessage{patch failed}}% Creiamo il comando per stampare l'elenco degli algoritmi:
\newcommand*\listofalgorithms{\bgroup
\let\contentsname\lstlistalgorithmname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{loa}}%
\tableofcontents \egroup}% Per comodità (e analogia con figure e tabelle) chiamiamo i comandi
% \listoflistings e \listofalgorithms.
\let\listoflistings\lstlistoflistings% Impostiamo per li algoritmi la stessa formattazione dei listati:
\let\l@lstalgorithm\l@lstlisting\lstnewenvironment{algoritmo}[1][]{
\let\lst@MakeCaption\lst@MakeCaptionForAlg
% Giusto per evitare l'avviso sulle etichette duplicate:
\renewcommand*\thelstnumber{a\@arabic\c@lstnumber}%
\let\lstlistingname\lstalgorithmname
\let\c@lstlisting\c@lstalgorithm
\lstset{#1}%
}{}\lstnewenvironment{listato}[1][]{\lstset{#1}}{}
\makeatother% Correzione per fare in modo che nella lista dei listati, i listati di capitoli
% diversi vengano separati da uno spazio supplementare
\makeatletter
\let\my@chapter\@chapter
\renewcommand*{\@chapter}{%
\addtocontents{lol}{\protect\addvspace{10pt}}%
\addtocontents{loa}{\protect\addvspace{10pt}}%
\my@chapter}
\makeatother\begin{document}
\begingroup
\let\clearpage\relax
\listoflistings
\bigskip
\listofalgorithms
\endgroup\vfill
\chapter{UN0}
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}\begin{algoritmo}
\newcommand*{\lstalgorithmname}{Algoritmo}
\end{algoritmo}\begin{listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\end{listato}\begin{algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\end{algoritmo}\chapter{DUE}
\begin{listato}
\renewcommand*{\lstlistingname}{Listato}
\end{listato}\begin{algoritmo}
\newcommand*{\lstalgorithmname}{Algoritmo}
\end{algoritmo}\begin{listato}
\renewcommand*{\lstlistlistingname}{Elenco dei listati}
\end{listato}\begin{algoritmo}
\newcommand*{\lstlistalgorithmname}{Elenco degli algoritmi}
\end{algoritmo}\end{document}`
Sostanzialmente ho aggiunto
`\let\c@lstlisting\c@lstalgorithm`
dentro \lstnewenvironment{algoritmo} e ho risolto subito il test \@ifpackageloaded{tocloft}, sapendo che usi titletoc.Ciao,
Antonio
-
18 Gennaio 2012 alle 7:45 #68689::
Grazie Antonio.Ora la numerazione è corretta. Segnalo solo che, numerando le righe di codice (passando numbers=left come opzione a \lstset), per gli algoritmi la numerazione delle righe è del tipo a1, a2, …
Ho commentato la riga\renewcommand*\thelstnumber{a\@arabic\c@lstnumber}
e la cosa va a posto. Ottengo degli avvisi (come indicato da te nel commento che precede la riga incriminata), ma sapendone la causa la cosa non mi disturba.
Mille grazie e buona giornata.
Claudio
-
22 Gennaio 2012 alle 21:42 #68690::
mcl1962″ post=67873Grazie Antonio.
Ora la numerazione è corretta. Segnalo solo che, numerando le righe di codice (passando numbers=left come opzione a \lstset), per gli algoritmi la numerazione delle righe è del tipo a1, a2, …
Ho commentato la riga\renewcommand*\thelstnumber{a\@arabic\c@lstnumber}
e la cosa va a posto. Ottengo degli avvisi (come indicato da te nel commento che precede la riga incriminata), ma sapendone la causa la cosa non mi disturba.
Mille grazie e buona giornata.
Claudio
Ciao Claudio.
Rispondo tardi, ma ultimamente non ho molto tempo da dedicare al forum.
Per eliminare quell’avviso bisognerebbe ridefinire \theHlstnumber, che è il comando che hyperref usa per generare le “àncore” per i numeri di riga (quelle incriminate). Ci sarebbe da capire il modo più corretto di farlo, per mantenere coerenti eventuali etichette e relativi collegamenti.
Il codice di listings mi sembra piuttosto complicato. Purtroppo non credo esista una soluzione valida in generale per fare quello che tu chiedi in questa discussione. Mi rendo conto che la mia è una soluzione parziale, ma (ripeto) servirebbe il tempo …e un guru! 😉
Ti saluto,
Antonio
-
19 Aprile 2012 alle 15:32 #68691
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.