Внутренний листинг кода из файла с неправильным размещением символов

Внутренний листинг кода из файла с неправильным размещением символов

Есть проблема, когда символы моего родного языка (литовского) не отображаются в правильных позициях при использовании в листинге кода. Эта проблема возникает даже при листинге из файла. Обычно используемые специальные символы отображаются нормально. По какой-то причине эти символы постоянно возвращаются в начало слова.

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

Результат

решение1

Цитата из раздела 2.5 Специальные символыруководство по листингу-пакету:

Национальные символыЕсли вы вводите такие символы непосредственно как символы кодов 128–255 и используете их также в листингах, сообщите об этом пакету, иначе вы получите действительно забавные результаты. extendedchars=true позволяетиextendedchars=false запрещаетлистинги от обработки расширенных символов в листингах. Если вы их используете, вам следует загрузить fontenc, inputenc и/или любой другой пакет, который определяет символы.

→У меня проблемы с использованием inputenc вместе с листингами. Это может быть проблема совместимости. Составьте отчет об ошибке, как описано в разделе 7 Устранение неполадок.

Расширенные символы не охватывают арабский, китайский, иврит, японский и т. д., в частности, любые кодировки, в которых на символ используется несколько байтов.
Таким образом, если вы используете пакет, поддерживающий многобайтовые символы, например пакеты CJK или ucs для китайских символов и символов UTF-8, вам следует избегать обработки листингами расширенных символов.Обычно лучше также указать extendedchars=false, чтобы избежать запутывания листингов в обработке расширенных символов другого пакета. Если у вас есть листинг, содержащийся в среде CJK, и вы хотите иметь символы CJK внутри листинга, вы можете поместить их в комментарий, который экранируется в LATEX – см. раздел 5.12, чтобы узнать, как это сделать. (Если листинг не находится в среде CJK, вы можете просто поместить небольшое окружение CJK в экранированную в LATEX часть комментария.) Аналогично, если вы используете расширенные символы UTF-8 в листинге, они должны быть помещены в экранирование в LaTeX. Кроме того, в разделе 9 есть несколько подробностей о том, как работать с расширенными символами в контексте Λ.

Похоже, вы хотите использовать utf8x/utf8, которая является многобайтовой кодировкой, и хотите напрямую вводить национальные символы, такие как «ų».

extendedchars=falseХотя в руководстве сказано, что вам необходимо разрешить extendedchars=trueпакету листингов обрабатывать такие расширенные/национальные символы.

Вы используете utf8x/utf8, которая является многобайтовой кодировкой, хотя в руководстве говорится, что вы должны избегать обработки листингами символов, которые поступают из многобайтовых кодировок и закодированы более чем одним байтом.

Вы можете сделать следующее:

  1. Не устанавливай extendedchars=false, а устанавливай extendedchars=trueи
  2. Убедитесь, что пакету listings-package не нужно обрабатывать многобайтовые символы, загрузив Heiko Oberdiek'slistingsutf8-пакет, который для \lstinputlistingкоманды предоставляет процедуры для преобразования из многобайтовой кодировки в подходящую однобайтовую кодировку перед фактической отправкой данных в списки и
  3. Например, через filecontents*-средусодержимое файла-package поместить листинг во временный файл и вставить его с помощью -command \lstinputlisting.

В моей системе нет кодировки L7x, и я думаю, что utf8 предпочтительнее, чем utf8x.

Поэтому в примере ниже я использовал T1 в качестве кодировки шрифта и utf8 в качестве кодировки ввода.

На своей системе вы также можете проверить, работает ли L7x и 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}

введите описание изображения здесь

решение2

Проще (хотя и немного сложнее в выполнении, но это работа, которая делается раз и навсегда): используйте 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}

введите описание изображения здесь

Связанный контент