Archive for the ‘Latex’ Category

Latex, C++ et les accents

Thursday, June 10th, 2010

Pour intégrer à un document Latex des morceaux de code en C++, j’utilise le package listings. Celui-ce est certainement le plus connu pour intégrer du code informatique à un document Latex tout en assurant une coloration syntaxique.

J’intègre du code à mes documents Latex principalement de deux façons :

  • en intégrant le morceau de code directement au document Latex, en le plaçant entre les balises \begin{lstlisting} et \end{lstlisting};
  • en important un fichier, avec la balise \lstinputlisting.

La principale difficulté vient de l’encodage des caractères.

Parfois, le code importé provient d’un code écrit sous Windows. L’encodage par défaut du fichier est cp1252. Chaque caractère est encodé sur un octet.

Parfois, le code importé provient d’un code écrit sous Mac OS X. L’encodage par défaut du fichier est applemac. Chaque caractère est encodé sur un octet.

Parfois, le code importé provient d’un code enregistré au format UTF-8. Certains caractères sont encodés sur deux octets.

Enfin, lorsque le code est directement intégré au document Latex, l’encodage est celui du document, en l’occurence UTF-8.

Voici un exemple :

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern,textcomp}
\usepackage[frenchb]{babel}
\usepackage{listings}
\lstset{
language=C++,
frame=single
}
\begin{document}
Voici du code intégré au document \LaTeX :
\begin{lstlisting}
#include 

int main() {
   std::cout << "Bonjour à tous\n";
   return 0;
}
\end{lstlisting}

Voici du code importé avec un encodage \texttt{Windows} :
\lstinputlisting[inputencoding=cp1252]{main_cp1252.cpp}

Voici du code importé avec un encodage \texttt{Latin1} :
\lstinputlisting[inputencoding=latin1]{main_latin1.cpp}

Voici du code importé avec un encodage \texttt{MacRoman} :
\lstinputlisting[inputencoding=applemac]{main_applemac.cpp}

Voici du code importé avec un encodage \texttt{UTF-8} :
\lstinputlisting{main_utf8.cpp}
\end{document}

Et bien ce code n’est pas compilable ! Le caractère à à la ligne 17 pose problème (c’est un caractère accentué, encodé sur deux octets en UTF-8).

Si, pour aller plus loin, on remplace temporairement ce caractère à par a, la compilation échoue maintenant au moment de l’importation du fichier main_utf8.cpp.

En fait, tout le problème vient du fait que peu importe l’encodage, la paquet listings ne supporte pas les caractères encodés sur plus d’un octet. Si vous souhaitez intégrer du code à un document Latex encodé en UTF-8, il n’y a donc qu’une solution : importer le code depuis un fichier externe encodé avec un format d’un octet par caractère. Dans l’exemple ci-dessus, les formats cp1252, Latin1 et MacRoman fonctionnent très bien.

Dessin Visio dans Latex

Wednesday, March 17th, 2010

Ma situation est la suivante : j’ai des dessins vectoriels créés avec Visio que je dois inclure dans un document Latex.

Dans Latex, j’utilise la package graphics, qui permet d’inclure des fichiers PDF.

Le problème : enregistrer un dessin Visio en PDF.

Ma première tentative a été de sauvegarder le dessin en SVG, puis de le convertir en PDF avec InkScape. Malheureusement, si le dessin Visio contient des textes (de surcroît avec des polices de caractères spéciales ou avec des espaces entre lettres et entre lignes non standards), le fichier SVG produit est inutilisable.

Restaient alors deux solutions pour sauvegarder un dessin Visio en PDF : imprimer avec un distilleur PDF (par exemple PDF Creator) ou installer une extension fournie par Micro$oft qui s’intègre directement à Visio, solution que j’ai retenue.

Cette extension peut être téléchargée ici.

Une fois cette extension installée, le menu Fichier offre la fonctionnalité suivante : Publier comme PDF ou XPS...

Mais, un nouveau problème doit être résolu : le dessin que je veux inclure dans Latex n’a pas la dimension d’une page A4, il est plus petit. Or, la publication en PDF de Visio exporte toute la page. Il est possible dans les options d’exportation de n’exporter que la sélection, mais l’élément sélectionné est quand même placé sur une page A4, ce qui ne convient pas à une inclusion dans Latex.

Pour résoudre ce dernier problème, il faut utiliser une macro très pratique (DissMacros.vss) que j’ai trouvée ici (miroir local : DissMacros).

L’intégration de cette macro dans un document Visio nécessite quelques étapes simples :

  1. Télécharger la macro DissMacros.vss et l’enregistrer dans Mes Documents\Mes formes.
  2. Ajouter ces formes au document : Fichier->Formes->Mes Formes->DissMacros (activer les macros si cela vous est demandé).
  3. S’assurer que le dessin à exporter est seul sur une page.
  4. Appeler la macro ExportActivePage avec le menu Outils->Macros->DissMacros->Module 1->ExportActivePage.
  5. Cette macro redimensionne temporairement la page pour s’adapter aux dimensions du dessin et l’exporte en PDF (ainsi que dans d’autres formats).
  6. Les fichiers créés sont stockés dans un répertoire du même nom que le document Visio, situé au même emplacement que ce document.

MISE À JOUR DU 24.8.2012

Voici la marche à suivre pour Visio 2010 :

  1. Télécharger la macro DissMacros.vss et l’enregistrer dans Mes Documents\Mes formes.
  2. Ajouter ces formes au document : Fichier->Formes->Mes Formes->DissMacros (activer les macros si cela vous est demandé).
  3. Activer l’onglet Développeur : Fichier->Options->Personnaliser le ruban, cocher Développeur dans la liste à droite nommée Onglets principaux.
  4. S’assurer que le dessin à exporter est seul sur une page.
  5. Appeler la macro ExportActivePage : menu Onglet Développeur->Macros. Choisir DissMacros.vss dans la liste déroulante Macros dans.
  6. Cette macro redimensionne temporairement la page pour s’adapter aux dimensions du dessin et l’exporte en PDF (ainsi que dans d’autres formats).
  7. Les fichiers créés sont stockés dans un répertoire du même nom que le document Visio, situé au même emplacement que ce document.