Listado de código interno de la ubicación de caracteres incorrectos del archivo

Listado de código interno de la ubicación de caracteres incorrectos del archivo

Existe este problema por el cual los caracteres de mi idioma nativo (lituano) no aparecen en las posiciones adecuadas cuando se usan en la lista de códigos. Este problema ocurre incluso cuando se enumera desde un archivo. Normalmente, esos caracteres especiales se muestran bien. Por alguna razón, esos caracteres siguen saltando al inicio de la palabra.

\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}

Resultado

Respuesta1

Cita de la sección 2.5 Caracteres especiales delmanual del paquete de listados:

personajes nacionalesSi escribe dichos caracteres directamente como caracteres de los códigos 128–255 y los usa también en listados, infórmeselo al paquete o obtendrá resultados realmente divertidos. extendedchars=true permiteyextendedchars=false prohíbelistados manejen caracteres extendidos en los listados. Si los usas, debes cargar fontenc, inputenc y/o cualquier otro paquete que defina los caracteres.

→Tengo problemas al usar inputenc junto con listados. Esto podría ser un problema de compatibilidad. Realice un informe de error como se describe en la sección 7 Solución de problemas.

Los caracteres extendidos no cubren árabe, chino, hebreo, japonés, etc., específicamente, cualquier codificación que utilice varios bytes por carácter.
Por lo tanto, si utiliza un paquete que admite caracteres multibyte, como los paquetes CJK o ucs para caracteres chinos y UTF-8, debe evitar permitir que los listados procesen los caracteres extendidos.Generalmente es mejor especificar también extendedchars=false para evitar que los listados se enreden en el tratamiento de caracteres extendidos del otro paquete. Si tiene un listado contenido en un entorno CJK y desea tener caracteres CJK dentro del listado, puede colocarlos dentro de un comentario que escape a LATEX; consulte la sección 5.12 para saber cómo hacerlo. (Si el listado no está dentro de un entorno CJK, simplemente puede colocar un pequeño entorno CJK dentro de la parte del comentario con escape a LATEX). De manera similar, si está utilizando caracteres extendidos UTF-8 en un listado, deben colocarse dentro de un escape a LaTeX. Además, la sección 9 tiene algunos detalles sobre cómo trabajar con caracteres extendidos en el contexto de Λ.

Parece que desea utilizar utf8x/utf8, que es una codificación multibyte, y desea escribir caracteres nacionales como "ų" directamente.

Aunque extendedchars=falseel manual dice que es necesario extendedchars=truepermitir que el paquete de listados maneje dichos caracteres extendidos/nacionales.

Utiliza utf8x/utf8, que es una codificación multibyte, aunque el manual dice que debe evitar permitir que los listados procesen caracteres que provienen de codificaciones multibyte y están codificados en más de un byte.

Puedes hacer lo siguiente:

  1. No establezcas extendedchars=falsesino establece extendedchars=truey
  2. Asegúrese de que el paquete de listados no necesite manejar caracteres multibyte cargando el archivo de Heiko Oberdieklistadosutf8-paquete que para el \lstinputlistingcomando proporciona rutinas para convertir de codificación multibyte a una codificación adecuada de un solo byte antes de enviar elementos a los listados y
  3. Por ejemplo, a través del filecontents*entorno delcontenido del archivo-package coloca el listado en un archivo temporal e insértelo mediante el \lstinputlistingcomando -.

No tengo codificación L7x en mi sistema y creo que utf8 es preferible a utf8x.

Por lo tanto, en el siguiente ejemplo utilicé T1 como codificación de fuente y utf8 como codificación de entrada.

En su sistema puede probar si todo funciona también con L7x y utf8x.

\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}

ingrese la descripción de la imagen aquí

Respuesta2

Más sencillo (aunque un poco más tedioso de completar, pero es un trabajo de una vez por todas): utiliza 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}

ingrese la descripción de la imagen aquí

información relacionada