• Il peut arriver que des fichiers ayant des fins de ligne CRLF traînent dans un projet à cause d'un développeur windowsien ou adepte de la pomme qui a mal réglé son IDE. (troll inside ?) Je vais vous présenter une petite astuce pour trouver ces fichiers et les corriger.

    Pour rappel, on utilise généralement les fins de lignes LF sous Linux, CR sous Mac, et CRLF sous Windows. Dans la plupart des langages de programmation, CR est représenté par \r, et LF par \n. Là, le but est d'enlever les CR.

    Placez-vous dans le dossier à vérifier, puis entrez la commande :

    grep -rlIP '\r\n' ./
    [code=bash]grep -rlIP '\r\n' ./[/code]

    Vous obtiendrez la liste des fichiers en CRLF.
    Pour bien comprendre, détaillons les options utilisées :

    • r : cherche récursivement dans les dossiers
    • l : affiche uniquement le nom de fichier (on s'arrête à la première occurrence dans chaque fichier
    • I : ignore les fichiers binaires (images...etc)
    • P : expression régulière Perl

    Pour supprimer les CR, et n'avoir donc plus que des LF dans ces fichiers, on va utiliser sed

    grep -rlIP '\r\n' ./ | xargs sed -i -r 's/\r//g'
    [code=bash]grep -rlIP '\r\n' ./ | xargs sed -i -r 's/\r//g'[/code]

    Attention, n'oubliez pas d'exclure les dossiers / fichier que vous ne voulez pas traiter avec grep -v. Par exemple pour exclure les fichiers de Git :

    grep -rlIP '\r\n' ./ | grep -v .git | xargs sed -i -r 's/\r//g'
    [code=bash]grep -rlIP '\r\n' ./ | grep -v .git | xargs sed -i -r 's/\r//g'[/code]
     


    4 commentaires
  • Depuis un an, j'utilise un portable Dell XPS Studio avec un deuxième écran (Asus 26"). Ma carte graphique est une Nvidia GeForce 9400M G.

    Mon problème, c'est que j'emporte souvent mon laptop en dehors de chez moi, et j'ai donc besoin de pouvoir passer facilement entre une configuration à 2 écrans (dual screen) et une configuration à 1 écran. Jusqu'à maintenant, j'avais deux fichiers /etc/X11/xorg.conf, et je m'étais fait un raccourci pour switcher entre les deux et redémarrer le serveur X. Mais ce n'est vraiment pas pratique, car redémarrer le serveur X signifie tuer tous les programmes ouverts et recommencer une nouvelle session, ce qui en plus prend du temps...

    Aujourd'hui, je suis passé à la dernière version d'Ubuntu Lucid Lynx en réinstallant tout (sauf ma partition /home), et pour partir sur de bonnes bases, j'ai enfin décidé de prendre le temps de trouver une solution à mon problème de dual screen.

    Et au bout de plusieurs heures de recherche (-_-), j'en enfin trouvé une solution très simple.
    Attention ! Je ne sais pas si elle fonctionne avec autre chose qu'une carte Nvidia et son driver propriétaire.

    Réglez votre /etc/X11/xorg.conf pour le dual screen, puis trouvez la ligne du Option "metamodes". Cette ligne contient le positionnement des deux écrans. Au lieu de n'y mettre que la configuration du positionnement pour deux écrans, mettez également celle pour un seul écran, en séparant les deux par un point-virgule (;).

    Un exemple vaut mieux qu'un long discours, donc dans mon cas, c'était comme ça :
    La ligne à modifier dans le /etc/X11/xorg.conf en dual screen :

    Option "metamodes" "DFP-0: nvidia-auto-select +0+507, DFP-1: nvidia-auto-select +1280+0"
    [code=xorg_conf]Option "metamodes" "DFP-0: nvidia-auto-select +0+507, DFP-1: nvidia-auto-select +1280+0"[/code]
     

    La ligne correspondante dans le xorg.conf pour un seul écran :
    Option "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: NULL"
    [code=xorg_conf]Option "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: NULL"[/code]
     

    Et à la fin, on veut ça :
    Option "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: NULL; DFP-0: nvidia-auto-select +0+507, DFP-1: nvidia-auto-select +1280+0"
    [code=xorg_conf]Option "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: NULL; DFP-0: nvidia-auto-select +0+507, DFP-1: nvidia-auto-select +1280+0"[/code]


    Redémarrez ensuite le serveur X (c'est la dernière fois que vous aurez à le faire), en appuyant sur AltGr+Impr+K.

    Puis installez le paquet "xrandr" s'il n'est pas encore installé :
    sudo aptitude install xrandr
    [code=bash]sudo aptitude install xrandr[/code]


    Et maintenant, pour passer d'une configuration à une autre :
    # Mode 1 écran
    xrandr -s 0
    # Mode 2 écrans
    xrandr -s 1
    [code=bash]# Mode 1 écran
    xrandr -s 0
    # Mode 2 écrans
    xrandr -s 1[/code]


    Vous pouvez ensuite vous créer des raccourcis pour ces deux commandes, les scripter...etc.

    Si vous avez une remarque, une astuce différente ou si vous savez comme faire la même chose avec une autre carte graphique, n'hésitez pas à commenter cet article ;-)


    4 commentaires
  • Quand on travaille sur un projet avec plusieurs personnes et qu'on utilise SVN, il peut être utile d'être averti en temps réel des commits qu'envoient les autres collaborateurs.

    Je me suis inspiré de l'idée de Metrokid et du script de Christophe-Marie pour faire un petit script de notification par Cron.

    Nous aurons besoin de la commande notify-send disponible dans le paquet libnotify-bin. Si vous ne l'avez pas, installez le :

    $ sudo aptitude  install libnotify-bin
    [code=bash]$ sudo aptitude  install libnotify-bin[/code]

    Et voilà notre petit script, que nous nommerons .svn-monitor.sh et que nous placerons dans le dossier home de l'utilisateur courant ($HOME) :

    #!/bin/bash
     
     # Pour que cron sache sur quel moniteur afficher la notification
     DISPLAY=:0.0
     
     # Fichier dans lequel on stocke la date de dernière révision testée
     LOGFILE=$HOME/.svn-monitor
     # URL du dépôt SVN
     SVNPATH=http://url-du-depot
     # Nom d'utilisateur dont les révisions ne seront pas affichées
     USERNAME=Skreo
     # Icône utilisée dans la fenêtre de notification
     ICON='/usr/share/icons/gnome/32x32/status/dialog-information.png'
     # Durée d'affichage de la fenêtre de notification
     DURATION=5000
     
     # Révision à vérifier
     if test -f $LOGFILE ; then
        REV=$(( `cat $LOGFILE` +1 ))
     else
        REV=HEAD
     fi
     
     # Récupération du log de la dernière révision
     TEXT=`svn log $SVNPATH -r $REV:HEAD | sed -r "s/^-+$/---/" | sed -r "s/^r([0-9]+) \| ([^ ]+) \| [^(]*\(([^)]+)\).*$/rév \1 par \2 le \3/"`
     
     # Si on obtient un résultat, on l'affiche
     if test "$TEXT" != "" ; then
     
        # Détermination de la dernière révision
        LASTREV=`echo -e "$TEXT" | sed -r "s/^(.*rév ([0-9]+) .*|.*)$/\2/" | awk NF | sort -nr | head -1`
     
        # Suppression de l'affichage des révisions faîtes par $USERNAME
        TEXT=`echo "$TEXT" | sed -r "s/$USERNAME/-/g"`
        TEXT=`echo "$TEXT" | sed -r ':a;N;$!ba;s/---\nrév [0-9]+ par - .*\n---/---/g'`
     
        # Suppression de la première et de la dernière ligne, et suppression des lignes vides
        TEXT=`echo "$TEXT" | sed '1d' | sed '$d' | awk NF`
     
        # Affichage de la notification
        notify-send -t $DURATION -i "$ICON" "SVN" "$TEXT"
     
        # Et on l'enregistre dans le fichier
        echo $LASTREV > $LOGFILE
     fi
    [code=bash]#!/bin/bash

    # Pour que cron sache sur quel moniteur afficher la notification
    DISPLAY=:0.0

    # Fichier dans lequel on stocke la date de dernière révision testée
    LOGFILE=$HOME/.svn-monitor
    # URL du dépôt SVN
    SVNPATH=http://url-du-depot
    # Nom d'utilisateur dont les révisions ne seront pas affichées
    USERNAME=Skreo
    # Icône utilisée dans la fenêtre de notification
    ICON='/usr/share/icons/gnome/32x32/status/dialog-information.png'
    # Durée d'affichage de la fenêtre de notification
    DURATION=5000

    # Révision à vérifier
    if test -f $LOGFILE ; then
        REV=$(( `cat $LOGFILE` +1 ))
    else
        REV=HEAD
    fi

    # Récupération du log de la dernière révision
    TEXT=`svn log $SVNPATH -r $REV:HEAD | sed -r "s/^-+$/---/" | sed -r "s/^r([0-9]+) \| ([^ ]+) \| [^(]*\(([^)]+)\).*$/rév \1 par \2 le \3/"`

    # Si on obtient un résultat, on l'affiche
    if test "$TEXT" != "" ; then

        # Détermination de la dernière révision
        LASTREV=`echo -e "$TEXT" | sed -r "s/^(.*rév ([0-9]+) .*|.*)$/\2/" | awk NF | sort -nr | head -1`

        # Suppression de l'affichage des révisions faîtes par $USERNAME
        TEXT=`echo "$TEXT" | sed -r "s/$USERNAME/-/g"`
        TEXT=`echo "$TEXT" | sed -r ':a;N;$!ba;s/---\nrév [0-9]+ par - .*\n---/---/g'`

        # Suppression de la première et de la dernière ligne, et suppression des lignes vides
        TEXT=`echo "$TEXT" | sed '1d' | sed '$d' | awk NF`

        # Affichage de la notification
        notify-send -t $DURATION -i "$ICON" "SVN" "$TEXT"

        # Et on l'enregistre dans le fichier
        echo $LASTREV > $LOGFILE
    fi[/code]

    Il ne reste ensuite plus qu'à l'exécuter par cron toutes les 5 minutes par exemple.
    Pour modifier les tâches cron :

    $ crontab -e
    [code=bash]$ crontab -e[/code]

    Lignes à ajouter dans le cron :

    DISPLAY=:0.0
    LANG=fr_FR.UTF-8
    */5 * * * *     sh $HOME/.svn-monitor.sh
    [code=bash]
    DISPLAY=:0.0
    LANG=fr_FR.UTF-8
    */5 * * * *     sh $HOME/.svn-monitor.sh
    [/code]


    7 commentaires
  • Ayant fait l'acquisition d'un magnifique joujou, un Dell XPS Studio, j'ai décidé de ne pas migrer mon ancienne partition /home, mais plutôt de refaire une installation propre de Ubuntu Jaunty Jackalope, et de changer certaine habitudes dans les logiciels que j'utilise.

    Pidgin, messagerie instantanéeAinsi j'ai commencé par abandonner Kopete (Instant Messenger) et Amarok (Music player) qui sont devenus lourds et peu ergonomiques avec l'arrivée de la nouvelle version de KDE, du moins c'est mon avis. Comme quoi, il n'y a que les cons qui ne changent pas d'avis ! (Cf. un de mes commentaires sur un article précédent)

    J'ai donc remplacé Kopete par Pidgin qui est parfaitement intégré à Gnome, complet, et qui supporte un très grand nombre de protocoles. Je l'utilise donc avec mes comptes MSN, Jabber, et Facebook. Car Pidgin supporte même Facebook, avec un plugin disponible ici !

    Exaile, lecteur de musiqueA la place d'Amarok, j'ai installé Exaile, son équivalent pour Gnome, certes un peu moins ergonomique que la version 1.4 d'Amarok, mais aussi efficace et avec sûrement autant de fonctionnalités.

    Deluge, client torrentEnsuite, je n'ai cette fois pas installé Azureus (Client Torrent), très efficace mais aussi très lourd (sûrement car c'est une application Java). À la place, j'ai préféré Deluge, un client léger, parfaitement intégré à Gnome, et offrant une rapidité impressionnante.

    Les logiciels que j'utilise maintenant principalement et qui me conviennent parfaitement sont donc :

    • Exaile : Lecteur de musique
    • Pidgin : Messagerie instantanée
    • Deluge : Client Torrent
    • Geany : Editeur de code
    • Firefox 3.5 : Navigateur web peu connu
    • Zim : Gestionnaire de notes
    • Nautilus : Gestionnaire de fichiers par défaut de Gnome
    • VLC : Lecteur vidéo

    29 commentaires
  • J'ai fait mes premières factures récemment, et j'ai été complètement incapable de trouver la moindre application gratuite/libre permettant d'éditer facilement et rapidement une belle facture.

    Donc comme je suis un peu kamikaze, j'ai passé des heures à m'améliorer en LaTeX en mettant au point un petit système pour éditer des jolies factures.

    Pour ceux qui ne connaissent pas ou peu LaTeX, il existe de très bonnes FAQ, notamment :


    Voici le code LaTeX de ma facture :

    \documentclass[french,11pt]{article}
    \usepackage{babel}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[a4paper]{geometry}
    \usepackage{units}
    \usepackage{bera}
    \usepackage{graphicx}
    \usepackage{fancyhdr}
    \usepackage{fp}

    \def\TVA{19.6}    % Taux de la TVA

    \def\TotalHT{0}
    \def\TotalTVA{0}

    \newcommand{\AjouterProduit}[3]{%    Arguments : Désignation, quantité, prix unitaire HT
        \FPround{\prix}{#3}{2}
        \FPeval{\montant}{#2 * #3}
        \FPround{\montant}{\montant}{2}
        \FPadd{\TotalHT}{\TotalHT}{\montant}
       
        \eaddto\ListeProduits{#1    &    \prix    &    #2    &    \montant    \cr}
    }

    \newcommand{\AfficheResultat}{%
        \ListeProduits
       
        \FPeval{\TotalTVA}{\TotalHT * \TVA / 100}
        \FPadd{\TotalTTC}{\TotalHT}{\TotalTVA}
        \FPround{\TotalHT}{\TotalHT}{2}
        \FPround{\TotalTVA}{\TotalTVA}{2}
        \FPround{\TotalTTC}{\TotalTTC}{2}
        \global\let\TotalHT\TotalHT
        \global\let\TotalTVA\TotalTVA
        \global\let\TotalTTC\TotalTTC
       
        \cr \hline
        Total HT            & & &    \TotalHT    \cr
        TVA \TVA~\%         & & &    \TotalTVA    \cr
        \hline \hline
        \textbf{Total TTC}    & & &    \TotalTTC
    }

    \newcommand*\eaddto[2]{% version développée de \addto
       \edef\tmp{#2}%
       \expandafter\addto
       \expandafter#1%
       \expandafter{\tmp}%
    }

    \newcommand{\ListeProduits}{}




    %%%%%%%%%%%%%%%%%%%%% A MODIFIER DANS LA FACTURE %%%%%%%%%%%%%%%%%%%%%

    \def\FactureNum            {1}    % Numéro de facture
    \def\FactureAcquittee    {non}        % Facture acquittée : oui/non
    \def\FactureLieu    {Paris}    % Lieu de l'édition de la facture
    \def\FactureObjet    {facture pour te faire payer}    % Objet du document
    % Description de la facture
    \def\FactureDescr    {%
    Cette facture concerne la réalisation du site web machin-truc.com, son hébergement, et la location du nom de domaine
    }

    % Infos Client
    \def\ClientNom{M. Dupont}    % Nom du client
    \def\ClientAdresse{%                    % Adresse du client
        12, rue de la Geekerie \\
        75000 Paris
    }

    % Liste des produits facturés : Désignation, quantité, prix unitaire HT
    \AjouterProduit    {Réalisation du site}        {1}        {1600}
    \AjouterProduit    {Hébergement -- 1 mois}        {3}        {10}
    \AjouterProduit    {Nom de domaine -- 1 an}    {1}        {8}

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




    \geometry{verbose,tmargin=4em,bmargin=8em,lmargin=6em,rmargin=6em}
    \setlength{\parindent}{0pt}
    \setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}

    \thispagestyle{fancy}
    \pagestyle{fancy}
    \setlength{\parindent}{0pt}

    \renewcommand{\headrulewidth}{0pt}
    \cfoot{
        Ma Société SARL au capital de 3000 € ~--~ 34, rue du Brainfuck - 75000 Paris\newline
        \small{
            Telephone : +33(0)6 12 34 56 78 ~--~ Site web : www.ma-societe.com ~--~ E-mail : contact@ma-societe.com\newline
            RCS Paris 512 569 485 ~--~ Code APE 6201Z ~--~ Numéro TVA : FR 56-512-569-485
       
    }
    }



    \begin{document}

    % Logo de la société
    \includegraphics{logo.jpg}

    % Nom et adresse de la société
    Ma Société SARL \\
    34, rue du Brainfuck \\
    75000 Paris

    Facture n°\FactureNum


    {\addtolength{\leftskip}{10.5cm} %in ERT
        \textbf{\ClientNom}    \\
        \ClientAdresse        \\

    } %in ERT


    \hspace*{10.5cm}
    \FactureLieu, le \today

    ~\\~\\

    \textbf{Objet : \FactureObjet \\}

    \textnormal{\FactureDescr}

    ~\\

    \begin{center}
        \begin{tabular}{lrrr}
            \textbf{Désignation ~~~~~~}    & \textbf{Prix unitaire}    & \textbf{Quantité}    & \textbf{Montant (EUR)}    \\
            \hline
            \AfficheResultat{}
        \end{tabular
    }
    \end{center}

    ~\\

    \ifthenelse{\equal{\FactureAcquittee}{oui}}{
        Facture acquittée.
    }{

        À régler par chèque ou par virement bancaire :

        \begin{center
    }
            \begin{tabular}{|c c c c|}
                \hline     \textbf{Code banque}    & \textbf{Code guichet}    & \textbf{N° de Compte}        & \textbf{Clé RIB}    \\
                        59763                    & 00726                     & 41652387462                & 98                \\
                \hline     \textbf{IBAN N°}        & \multicolumn{3}{|l|}{ FR59 4859 4628 7921 0289 8106 846 }         \\
                \hline     \textbf{Code BIC}        & \multicolumn{3}{|l|}{ AGRIFPRP792 }         \\
                \hline
            \end{tabular}
        \end{center}

    }

    \end{document}
    [code=latex]\documentclass[french,11pt]{article}
    \usepackage{babel}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[a4paper]{geometry}
    \usepackage{units}
    \usepackage{bera}
    \usepackage{graphicx}
    \usepackage{fancyhdr}
    \usepackage{fp}

    \def\TVA{19.6}    % Taux de la TVA

    \def\TotalHT{0}
    \def\TotalTVA{0}

    \newcommand{\AjouterProduit}[3]{%    Arguments : Désignation, quantité, prix unitaire HT
        \FPround{\prix}{#3}{2}
        \FPeval{\montant}{#2 * #3}
        \FPround{\montant}{\montant}{2}
        \FPadd{\TotalHT}{\TotalHT}{\montant}
       
        \eaddto\ListeProduits{#1    &    \prix    &    #2    &    \montant    \cr}
    }

    \newcommand{\AfficheResultat}{%
        \ListeProduits
       
        \FPeval{\TotalTVA}{\TotalHT * \TVA / 100}
        \FPadd{\TotalTTC}{\TotalHT}{\TotalTVA}
        \FPround{\TotalHT}{\TotalHT}{2}
        \FPround{\TotalTVA}{\TotalTVA}{2}
        \FPround{\TotalTTC}{\TotalTTC}{2}
        \global\let\TotalHT\TotalHT
        \global\let\TotalTVA\TotalTVA
        \global\let\TotalTTC\TotalTTC
       
        \cr \hline
        Total HT            & & &    \TotalHT    \cr
        TVA \TVA~\%         & & &    \TotalTVA    \cr
        \hline \hline
        \textbf{Total TTC}    & & &    \TotalTTC
    }

    \newcommand*\eaddto[2]{% version développée de \addto
       \edef\tmp{#2}%
       \expandafter\addto
       \expandafter#1%
       \expandafter{\tmp}%
    }

    \newcommand{\ListeProduits}{}




    %%%%%%%%%%%%%%%%%%%%% A MODIFIER DANS LA FACTURE %%%%%%%%%%%%%%%%%%%%%

    \def\FactureNum            {1}    % Numéro de facture
    \def\FactureAcquittee    {non}        % Facture acquittée : oui/non
    \def\FactureLieu    {Paris}    % Lieu de l'édition de la facture
    \def\FactureObjet    {facture pour te faire payer}    % Objet du document
    % Description de la facture
    \def\FactureDescr    {%
    Cette facture concerne la réalisation du site web machin-truc.com, son hébergement, et la location du nom de domaine
    }

    % Infos Client
    \def\ClientNom{M. Dupont}    % Nom du client
    \def\ClientAdresse{%                    % Adresse du client
        12, rue de la Geekerie \\
        75000 Paris
    }

    % Liste des produits facturés : Désignation, quantité, prix unitaire HT
    \AjouterProduit    {Réalisation du site}        {1}        {1600}
    \AjouterProduit    {Hébergement -- 1 mois}        {3}        {10}
    \AjouterProduit    {Nom de domaine -- 1 an}    {1}        {8}

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




    \geometry{verbose,tmargin=4em,bmargin=8em,lmargin=6em,rmargin=6em}
    \setlength{\parindent}{0pt}
    \setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}

    \thispagestyle{fancy}
    \pagestyle{fancy}
    \setlength{\parindent}{0pt}

    \renewcommand{\headrulewidth}{0pt}
    \cfoot{
        Ma Société SARL au capital de 3000 € ~--~ 34, rue du Brainfuck - 75000 Paris\newline
        \small{
            Telephone : +33(0)6 12 34 56 78 ~--~ Site web : www.ma-societe.com ~--~ E-mail : contact@ma-societe.com\newline
            RCS Paris 512 569 485 ~--~ Code APE 6201Z ~--~ Numéro TVA : FR 56-512-569-485
        }
    }



    \begin{document}

    % Logo de la société
    \includegraphics{logo.jpg}

    % Nom et adresse de la société
    Ma Société SARL \\
    34, rue du Brainfuck \\
    75000 Paris

    Facture n°\FactureNum


    {\addtolength{\leftskip}{10.5cm} %in ERT
        \textbf{\ClientNom}    \\
        \ClientAdresse        \\

    } %in ERT


    \hspace*{10.5cm}
    \FactureLieu, le \today

    ~\\~\\

    \textbf{Objet : \FactureObjet \\}

    \textnormal{\FactureDescr}

    ~\\

    \begin{center}
        \begin{tabular}{lrrr}
            \textbf{Désignation ~~~~~~}    & \textbf{Prix unitaire}    & \textbf{Quantité}    & \textbf{Montant (EUR)}    \\
            \hline
            \AfficheResultat{}
        \end{tabular}
    \end{center}

    ~\\

    \ifthenelse{\equal{\FactureAcquittee}{oui}}{
        Facture acquittée.
    }{

        À régler par chèque ou par virement bancaire :

        \begin{center}
            \begin{tabular}{|c c c c|}
                \hline     \textbf{Code banque}    & \textbf{Code guichet}    & \textbf{N° de Compte}        & \textbf{Clé RIB}    \\
                        59763                    & 00726                     & 41652387462                & 98                \\
                \hline     \textbf{IBAN N°}        & \multicolumn{3}{|l|}{ FR59 4859 4628 7921 0289 8106 846 }         \\
                \hline     \textbf{Code BIC}        & \multicolumn{3}{|l|}{ AGRIFPRP792 }         \\
                \hline
            \end{tabular}
        \end{center}

    }

    \end{document}
    [/code]


    Tout d'abord, la première fois, il faut modifier le nom de votre société, son adresse, le logo (situé dans un fichier logo.jpg qui doit être dans le même dossier), les informations de votre société en bas de page, et les informations bancaires pour les virements.

    Ensuite, à chaque fois qu'il faudra faire une facture, il suffira de modifier les lignes dans l'encart "A MODIFIER DANS LA FACTURE" où on définit les infos du clients, la description de la facture, et les produits vendus. Tout est expliqué dans les commentaires du code

    Les sous-totaux, la TVA, et le total TTC sont calculés automatiquement. C'était bien sûr la partie la plus dure à faire... J'ai utilisé en particulier le package fp pour les calculs.


    Vous trouverez dans ce targézède la source .tex de cet exemple, ainsi que le pdf compilé :
    Télécharger l'exemple


    12 commentaires


    Suivre le flux RSS des articles de cette rubrique
    Suivre le flux RSS des commentaires de cette rubrique