Есть проблема, когда символы моего родного языка (литовского) не отображаются в правильных позициях при использовании в листинге кода. Эта проблема возникает даже при листинге из файла. Обычно используемые специальные символы отображаются нормально. По какой-то причине эти символы постоянно возвращаются в начало слова.
\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, которая является многобайтовой кодировкой, хотя в руководстве говорится, что вы должны избегать обработки листингами символов, которые поступают из многобайтовых кодировок и закодированы более чем одним байтом.
Вы можете сделать следующее:
- Не устанавливай
extendedchars=false
, а устанавливайextendedchars=true
и - Убедитесь, что пакету listings-package не нужно обрабатывать многобайтовые символы, загрузив Heiko Oberdiek'slistingsutf8-пакет, который для
\lstinputlisting
команды предоставляет процедуры для преобразования из многобайтовой кодировки в подходящую однобайтовую кодировку перед фактической отправкой данных в списки и - Например, через
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}