70 votes

Listes en Latex avec UTF-8 (ou au moins les trémas allemands)

En essayant d'inclure un fichier source dans mon document latex en utilisant le paquet listings, j'ai eu des problèmes avec les trémas allemands à l'intérieur des commentaires dans le code. Utilisation de

\lstset{
extendedchars=\true,
inputencoding=utf8x
}

Les trémas dans les fichiers sources (encodés en UTF-8 sans BOM) sont traités, mais ils sont en quelque sorte déplacés au début du mot dans lequel ils sont contenus. Ainsi,

// die Größe muss berücksichtigt werden

dans le fichier source d'entrée, devient

// die ößGre muss übercksichtigt werden

dans le fichier de sortie.

NOTE : comme j'ai trouvé des erreurs dans ma configuration initiale, j'ai fortement modifié cette question.

1 votes

Quel encodage d'entrée avez-vous déclaré dans votre document et quel encodage utilisez-vous dans votre éditeur ?

1 votes

J'ai eu le même problème avec le français. IMO vous devriez essayer d'utiliser un encodage non-multi-octets, tel que Latin-1.

1 votes

Problème similaire avec le cyrillique. L'utilisation d'un encodage d'un octet résout le problème.

60voto

yaxu Points 569

J'ai trouvé une approche plus simple, qui fonctionne pour moi :

\usepackage{listings}

\lstset{
  literate={ö}{{\"o}}1
           {ä}{{\"a}}1
           {ü}{{\"u}}1
}

1 votes

Cela fonctionne bien pour moi, le paquet listingsutf8 n'est pas nécessaire. La meilleure solution de contournement !

3 votes

Il fonctionne également pour le turc. Voici l'extrait de code correspondant : \lstset{ literate={â}{{\^{a}}}1 {Â}{{\^{A}}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {}{{\u{g}}}1 {}{{\u{G}}}1 {}{{\i}}1 {}{{\.{I}}}1 {ö}{{\"o}}1 {Ö}{{\"O}}1 {}{{\c{s}}}1 {}{{\c{S}}}1 {ü}{{\"u}}1 {Ü}{{\"U}}1 }

2 votes

La solution utilisant texcl=true décrite dans une autre réponse semble être plus élégante.

37voto

Seb DA ROCHA Points 761

Pour commentaires uniquement vous pouvez utiliser l'option texcl option :

\lstset{language=C++,texcl=true}

Ensuite, vos commentaires deviennent Latex et vous pouvez utiliser des caractères "spéciaux".

\begin{lstlisting}
int iLink = 0x01; // Paramètre entrée
\end{lstlisting}

6 votes

C'est l'une des solutions les plus élégantes ici, elle a besoin de plus de votes positifs ! :)

0 votes

Wow ! Ensuite, vous pouvez même mettre des formules mathématiques dans les listings, par exemple double pi = 3.141; // This is $\pi$ o double d = 1.0 // $3 \int_0^1 x^2 dx$ . C'est vraiment cool !

0 votes

Génial ! L'autre option (avec literate ) ne fonctionnent pas avec XeLaTex.

26voto

Heimo Adelsberger Points 151

Cela devrait également fonctionner pour les autres langues (espagnol, danois) :

\documentclass[
a4paper, %% defines the paper size: a4paper (default), a5paper, letterpaper, ...
12pt %% set default font size to 12 point
]{scrartcl} %% article, see KOMA documentation (scrguide.dvi)

\usepackage[utf8]{inputenc}

\usepackage[T1]{fontenc}
\usepackage{listings}

\lstset{language=Pascal}
\lstset{literate=%
{Ö}{{\"O}}1
{Ä}{{\"A}}1
{Ü}{{\"U}}1
{ß}{{\ss}}2
{ü}{{\"u}}1
{ä}{{\"a}}1
{ö}{{\"o}}1
}

\begin{document}

[Latex: kann man Umlaute in lstlisting verwenden?]
\begin{lstlisting}
Test für Umlaut äöü ÄÖÜ ß So geht es
\end{lstlisting}

\end{document}

3 votes

Merci - bonne solution ! Quoi qu'il en soit, cela devrait être {ß}{{\ss}}1 car "ß" ne prend qu'un seul caractère dans la sortie ;)

17voto

Tomáš Linhart Points 1399

Ma contribution pour la langue tchèque.

\lstset{
    inputencoding=utf8,
    extendedchars=true,
    literate=%
    {á}{{\'a}}1
    {č}{{\v{c}}}1
    {ď}{{\v{d}}}1
    {é}{{\'e}}1
    {ě}{{\v{e}}}1
    {í}{{\'i}}1
    {ň}{{\v{n}}}1
    {ó}{{\'o}}1
    {ř}{{\v{r}}}1
    {š}{{\v{s}}}1
    {ť}{{\v{t}}}1
    {ú}{{\'u}}1
    {ů}{{\r{u}}}1
    {ý}{{\'y}}1
    {ž}{{\v{z}}}1
    {Á}{{\'A}}1
    {Č}{{\v{C}}}1
    {Ď}{{\v{D}}}1
    {É}{{\'E}}1
    {Ě}{{\v{E}}}1
    {Í}{{\'I}}1
    {Ň}{{\v{N}}}1
    {Ó}{{\'O}}1
    {Ř}{{\v{R}}}1
    {Š}{{\v{S}}}1
    {Ť}{{\v{T}}}1
    {Ú}{{\'U}}1
    {Ů}{{\r{U}}}1
    {Ý}{{\'Y}}1
    {Ž}{{\v{Z}}}1
}

1 votes

Merci ! :) Veuillez noter que j'ai dû enlever le inputencoding=utf8, et extendedchars=true, et aussi les % après literate= pour que ça marche dans mon cas.

11voto

Janosch Points 541

Ok, j'ai trouvé une sorte de solution de contournement maintenant :

  1. au lieu du paquet listings, utilisez listingsutf8

    \usepackage {listingsutf8}

  2. copier listings.sty dans le dossier où se trouve le document

  3. trouver les lignes suivantes

    \\lst@CCPutMacro
        \\lst@ProcessOther {"23}\\#
        \\lst@ProcessLetter{"24}\\textdollar
        \\lst@ProcessOther {"25}\\%
        \\lst@ProcessOther {"26}\\&
  4. Saisissez-y les lignes suivantes (chacune "enregistre" un tréma)

    \\lst@ProcessLetter{"E4}{\\"a}
    \\lst@ProcessLetter{"F6}{\\"o}
    \\lst@ProcessLetter{"FC}{\\"u}
    \\lst@ProcessLetter{"C4}{\\"A}
    \\lst@ProcessLetter{"D6}{\\"O}
    \\lst@ProcessLetter{"DC}{\\"U}
    \\lst@ProcessLetter{"DF}{\\ss{}}
  5. Sauvegarder le fichier

  6. Utilisez

    \\lstset{
        extendedchars=\\true,
        inputencoding=utf8/latin1
    }

pour activer le mappage des caractères utf8 en caractères latin1

  1. Convertir les fins de ligne de votre fichier source à partir de Windows ( \r\n ) à unix ( \n )
  2. Profitez de

Je sais que c'est laid à bien des égards, mais c'est la seule solution qui fonctionne pour moi jusqu'à présent.

0 votes

Je pense que 'extendedchars= \true est égal à 'extendedchars=false'.

0 votes

J'ai copié listings.sty sur listingsutf8.sty dans /usr/share/texmf-texlive/tex/latex/listings/ sur Ubuntu 10.10. J'ai édité le fichier, mais mes listings ne fonctionnent pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X