Falsche Zeichenplatzierung in der Codeauflistung der Datei

Falsche Zeichenplatzierung in der Codeauflistung der Datei

Es gibt dieses Problem, bei dem die Zeichen meiner Muttersprache (Litauisch) nicht an den richtigen Positionen angezeigt werden, wenn sie in der Codeauflistung verwendet werden. Dieses Problem tritt sogar beim Auflisten aus einer Datei auf. Normalerweise werden diese Sonderzeichen einwandfrei angezeigt. Aus irgendeinem Grund springen diese Zeichen immer wieder an den Wortanfang zurück.

\documentclass[12pt]{article}
\usepackage{listings}
\usepackage[utf8x]{inputenc}
\usepackage[L7x]{fontenc}
\lstset{
extendedchars=false
}

\begin{document}
public KainųMatrica kainųMatrica \{ get; set; \}
\begin{lstlisting}
using System;

namespace L1
{
    public class Kelias
    {
        public KainųMatrica kainųMatrica { get; set; }
        public int Apsilankymai { get; protected set; }
        private int dydis;
        private int[] taškai;

        public Kelias(int dydis = 1)
        {
            taškai = new int[dydis];
            Apsilankymai = 0;
            this.dydis = dydis;
        }
\end{lstlisting}
\end{document}

Ergebnis

Antwort1

Zitat aus Abschnitt 2.5 Sonderzeichen derHandbuch zum Listings-Paket:

Nationale CharaktereWenn Sie solche Zeichen direkt als Zeichen der Codes 128–255 eingeben und sie auch in Auflistungen verwenden, teilen Sie dies dem Paket mit – sonst erhalten Sie wirklich lustige Ergebnisse. extendedchars=true erlaubtUndextendedchars=false verbietetAuflistungen von der Verarbeitung erweiterter Zeichen in Auflistungen. Wenn Sie sie verwenden, sollten Sie fontenc, inputenc und/oder ein anderes Paket laden, das die Zeichen definiert.

→Ich habe Probleme, inputenc zusammen mit Listings zu verwenden. Dies könnte ein Kompatibilitätsproblem sein. Erstellen Sie einen Fehlerbericht wie in Abschnitt 7 Fehlerbehebung beschrieben.

Die erweiterten Zeichen decken Arabisch, Chinesisch, Hebräisch, Japanisch usw. nicht ab, insbesondere keine Kodierung, die mehrere Bytes pro Zeichen verwendet.
Wenn Sie also ein Paket verwenden, das Mehrbytezeichen unterstützt, wie etwa die CJK- oder ucs-Pakete für chinesische und UTF-8-Zeichen, müssen Sie vermeiden, dass in Auflistungen die erweiterten Zeichen verarbeitet werden.Es ist im Allgemeinen am besten, auch extendedchars=false anzugeben, um zu vermeiden, dass Auflistungen in die Behandlung von erweiterten Zeichen des anderen Pakets verwickelt werden. Wenn Sie eine Auflistung in einer CJK-Umgebung haben und CJK-Zeichen in der Auflistung haben möchten, können Sie diese in einen Kommentar einfügen, der nach LATEX wechselt – siehe Abschnitt 5.12, wie das geht. (Wenn sich die Auflistung nicht in einer CJK-Umgebung befindet, können Sie einfach eine kleine CJK-Umgebung in den nach LATEX wechselnden Teil des Kommentars einfügen.) Wenn Sie in einer Auflistung erweiterte UTF-8-Zeichen verwenden, müssen diese in einen Wechsel nach LaTeX eingefügt werden. Abschnitt 9 enthält außerdem einige Details zum Umgang mit erweiterten Zeichen im Kontext von Λ.

Anscheinend möchten Sie utf8x/utf8 verwenden, eine Multibyte-Kodierung, und nationale Sonderzeichen wie „ų“ direkt eingeben.

Sie müssen dies tun extendedchars=false, obwohl im Handbuch steht, dass Sie extendedchars=truedem Listings-Paket die Verarbeitung solcher erweiterten/nationalen Zeichen ermöglichen müssen.

Sie verwenden utf8x/utf8, eine Multibyte-Kodierung, obwohl im Handbuch steht, dass Sie es vermeiden müssen, in Listings Zeichen verarbeiten zu lassen, die aus Multibyte-Kodierungen stammen und mit mehr als einem Byte kodiert sind.

Sie können Folgendes tun:

  1. Nicht setzen extendedchars=false, sondern setzen extendedchars=trueund
  2. Stellen Sie sicher, dass das Listings-Paket keine Multibyte-Zeichen verarbeiten muss, indem Sie Heiko OberdieksListingsutf8-Paket, das für den \lstinputlisting-Befehl Routinen zur Konvertierung von Multibyte-Kodierung in eine geeignete Einzelbyte-Kodierung bereitstellt, bevor die Daten tatsächlich in Listen eingegeben werden und
  3. Beispielsweise über die filecontents*-Umgebung desDateiinhalt-package legt die Liste in eine temporäre Datei und fügt diese über den \lstinputlisting-Befehl ein.

Ich habe keine L7x-Kodierung auf meinem System und ich denke, dass UTF-8 UTF-8x vorzuziehen ist.

Daher habe ich im folgenden Beispiel T1 als Schriftkodierung und UTF-8 als Eingabekodierung verwendet.

Ob es auch mit L7x und utf8x klappt, kannst Du auf Deinem System testen.

\documentclass[12pt]{article}
\usepackage{listings}
\usepackage{listingsutf8}
\usepackage{filecontents}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage[utf8x]{inputenc}
%\usepackage{L7x]{fontenc}
\lstset{extendedchars=true}
% Don't do this as then you cannot type national characters
% in single-byte-encodings (characters 128-255) directly 
% any more:
%\lstset{
%extendedchars=false
%}

\begin{document}
public KainųMatrica kainųMatrica \{ get; set; \}
\begin{filecontents*}{temp.tex}
using System;

namespace L1
{
    public class Kelias
    {
        public KainųMatrica kainųMatrica { get; set; }
        public int Apsilankymai { get; protected set; }
        private int dydis;
        private int[] taškai;

        public Kelias(int dydis = 1)
        {
            taškai = new int[dydis];
            Apsilankymai = 0;
            this.dydis = dydis;
        }
\end{filecontents*}
% ISO/IEC 8859-4 = Latin-4 is designed to cover
% Estonian, Latvian, Lithuanian, Greenlandic, and Sami.
% See: https://en.wikipedia.org/wiki/ISO/IEC_8859-4
\lstinputlisting[inputencoding=utf8/latin4]{temp.tex}%
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Einfacher (wenn auch etwas mühsamer, aber eine einmalige Aufgabe): Verwenden Sie literate.

\documentclass[12pt]{article}
\usepackage{listings}
\usepackage[utf8]{inputenc} % utf8x is outdated and unmaintained
\usepackage[L7x]{fontenc}
\usepackage{lmodern} % cmr doesn't support L7x

\lstset{
  literate=%
    {ų}{{\k{u}}}1%
    {š}{{\v{s}}}1%
    % add more as needed
}

\begin{document}

public KainųMatrica kainųMatrica \{ get; set; \}

\begin{lstlisting}
using System;

namespace L1
{
    public class Kelias
    {
        public KainųMatrica kainųMatrica { get; set; }
        public int Apsilankymai { get; protected set; }
        private int dydis;
        private int[] taškai;

        public Kelias(int dydis = 1)
        {
            taškai = new int[dydis];
            Apsilankymai = 0;
            this.dydis = dydis;
        }
\end{lstlisting}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen