[Résolu] Décorer un listing avec le package listing

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[Résolu] Décorer un listing avec le package listing

Messagepar projetmbc » Lundi 08 Novembre 2010, 17:44

Bonjour,
j'aimerais faire les deux choses suivantes.
  1. Ajouter un symbole à droite d'une ligne d'un listing comme cela est utilisé dans cette page par exemple.
  2. Mettre une accolade à droite avec un texte court pour commenter quelques lignes directement.
Dernière édition par projetmbc le Mardi 09 Novembre 2010, 00:50, édité 1 fois.
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Décorer un listing avec le package listing

Messagepar pg » Mardi 09 Novembre 2010, 00:37

Voici le principe sur ton exemple.

Code: Tout sélectionner
\documentclass{article}
\usepackage{pifont}
\usepackage{listings}

\usepackage{hyperref}

\lstset{
        columns=flexible,
        basicstyle=\ttfamily,
        breaklines=true,
        keepspaces=true,
}
\makeatletter
\def\circledarabic#1{\expandafter\@circledarabic\csname c@#1\endcsname}
\def\@circledarabic#1{%
  \ifcase#1\or \ding{172}\or \ding{173}\or \ding{174}\or \ding{175}\or \ding{176}\or \ding{177}\or \ding{178}\or \ding{179}\or \ding{180}\or \ding{181}\else\@ctrerr\fi}
\makeatother

\newcounter{listingnote}
\renewcommand{\thelistingnote}{\circledarabic{listingnote}}
\newcommand{\marklistingline}[1]{%
  \refstepcounter{listingnote}#1%
  \hbox to 0pt{\hspace*{\linewidth}\thelistingnote}%
}

\newcommand{\listingaccolade}[1]{%
  \hbox to 0pt{\vbox to 0pt{\vskip-0.75em$\left\}\normalfont\begin{tabular}{@{}l@{}}#1\end{tabular}\right.$\vss}}%
}

\begin{document}

\begin{lstlisting}[escapechar=|]
|\marklistingline{\label{sys-import}}|>>> import sys
|\marklistingline{\label{sys-path}}|>>> sys.path
['',
 '/usr/lib/python31.zip',
 '/usr/lib/python3.1',
 '/usr/lib/python3.1/plat-linux2@EXTRAMACHDEPPATH@',
 '/usr/lib/python3.1/lib-dynload',
 '/usr/lib/python3.1/dist-packages',
 '/usr/local/lib/python3.1/dist-packages']
|\marklistingline{\label{sys}}|>>> sys
<module 'sys' (built-in)>
|\marklistingline{\label{sys-path-insert}}|>>> sys.path.insert(0, '/home/mark/diveintopython3/examples')
|\marklistingline{\label{sys-path-bis}}|>>> sys.path
['/home/mark/diveintopython3/examples',
 '',
 '/usr/lib/python31.zip',                            |\listingaccolade{\\\\Divers\\\\\\}|
 '/usr/lib/python3.1',
 '/usr/lib/python3.1/plat-linux2@EXTRAMACHDEPPATH@',
 '/usr/lib/python3.1/lib-dynload',
 '/usr/lib/python3.1/dist-packages',
 '/usr/local/lib/python3.1/dist-packages']
\end{lstlisting}

\ref{sys-import} Importing the sys module makes all of its functions and attributes available.

\ref{sys-path} sys.path is a list of directory names that constitute the current search path. (Yours will look different, depending on your operating system, what version of Python you’re running, and where it was originally installed.) Python will look through these directories (in this order) for a .py file whose name matches what you’re trying to import.

\ref{sys} Actually, I lied; the truth is more complicated than that, because not all modules are stored as .py files. Some are built-in modules; they are actually baked right into Python itself. Built-in modules behave just like regular modules, but their Python source code is not available, because they are not written in Python! (Like Python itself, these built-in modules are written in C.)

\ref{sys-path-insert} You can add a new directory to Python’s search path at runtime by adding the directory name to sys.path, and then Python will look in that directory as well, whenever you try to import a module. The effect lasts as long as Python is running.

\ref{sys-path-bis} By using \lstinline|sys.path.insert(0, new_path)|, you inserted a new directory as the first item of the sys.path list, and therefore at the beginning of Python’s search path. This is almost always what you want. In case of naming conflicts (for example, if Python ships with version 2 of a particular library but you want to use version 3), this ensures that your modules will be found and used instead of the modules that came with Python.

\end{document}


Quelques remarques :
  • On utilise un escapechar pour repasser de listing vers LaTeX ; il faut bien sûr le choisir en fonction du language pour qu'il ne soit pas utilisé par ailleurs dans le code.
  • Les numéros sont limités à 10 donc si tu en veux plus, il faudra les remettre à zéro au bout d'un moment. S'il y a un code par section (pour fixer les idées), il suffirait de remplacer \newcounter{listingnote} par \newcounter{listingnote}[section] pour que ce soit automatique à chaque changement de section.
  • Pour les accolades, j'ai choisi de mettre le texte dans un tableau, car c'est ce qui est le plus souple (on ne peut pas savoir à l'avance la largeur des lignes), mais par contre il faut gérer le passage à la ligne à main. Si on préfère des minipages, il suffit de modifier la commande.
pg
Modérateur
 
Messages: 2588
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Décorer un listing avec le package listing

Messagepar projetmbc » Mardi 09 Novembre 2010, 01:00

Bonsoir,
c'est génial. Je vais pouvoir dormir tranquille... :mrgreen:

pg a écrit:On utilise un escapechar pour repasser de listing vers LaTeX ; il faut bien sûr le choisir en fonction du language pour qu'il ne soit pas utilisé par ailleurs dans le code.

J'ai résolu le problème en utilisant un caractère braille : .

pg a écrit:Les numéros sont limités à 10 donc si tu en veux plus, il faudra les remettre à zéro au bout d'un moment.

C'est à mon avis plus que suffisant. Question : cette limitation est juste due à la police ding utilisée pour indiquer les numéros.

pg a écrit:S'il y a un code par section (pour fixer les idées), il suffirait de remplacer \newcounter{listingnote} par \newcounter{listingnote}[section] pour que ce soit automatique à chaque changement de section.

Nickel.

pg a écrit:Pour les accolades, j'ai choisi de mettre le texte dans un tableau, car c'est ce qui est le plus souple (on ne peut pas savoir à l'avance la largeur des lignes), mais par contre il faut gérer le passage à la ligne à main. Si on préfère des minipages, il suffit de modifier la commande.

Ce genre de choses est plus anecdotique mais comme toujours on s'en passe quand on ne l'a pas et une fois que cela existe, on finit par plus ne pouvoir s'en passer.

PS : quand est-ce que je t'envoie des chocolats ? Je suis sérieux car tu me permets d'avancer très sereinement dans mon projet Python (car le codage Python occupe le peu de temps loisir que j'ai cette année, du coup je ne peut pas faire autant de LaTeX que je le souhaiterais, d'autant plus que je dois aussi bosser sur des outils en JQuery pour mes sorties HTML).
projetmbc
Péta-utilisateur
 
Messages: 1895
Inscription: Samedi 29 Décembre 2007, 00:58
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Ahrefs [Bot], DotBot [Crawler], Proximic [Spider] et 30 invités