文件中代码列表中列出的错误字符位置

文件中代码列表中列出的错误字符位置

存在一个问题,即我的母语(立陶宛语)字符在代码列表中使用时无法显示在正确的位置。即使从文件列表中列出,也会出现此问题。通常使用这些特殊字符可以正常显示。由于某种原因,这些字符总是跳回到单词的开头。

\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 节 特殊字符listings-package 手册

民族性格如果您直接输入诸如代码 128-255 的字符之类的字符并在列表中使用它们,请让包知道这一点 - 否则您会得到非常有趣的结果。 extendedchars=true 允许extendedchars=false 禁止listings 处理 listings 中的扩展字符。如果您使用它们,则应加载 fontenc、inputenc 和/或定义字符的任何其他包。

→我在使用 inputenc 和 listings 时遇到问题。这可能是兼容性问题。请按照第 7 节故障排除中所述提交错误报告。

扩展字符不包括阿拉伯语、中文、希伯来语、日语等——具体来说,不包括每个字符使用多个字节的任何编码。
因此,如果您使用支持多字节字符的包,例如用于中文和 UTF-8 字符的 CJK 或 ucs 包,则必须避免让列表处理扩展字符。通常最好还指定 extendedchars=false,以避免列表与其他包的扩展字符处理纠缠在一起。如果您确实有一个包含在 CJK 环境中的列表,并且希望列表中包含 CJK 字符,则可以将它们放在转义为 LATEX 的注释中 - 请参阅第 5.12 节了解如何执行此操作。(如果列表不在 CJK 环境中,您只需将一个小的 CJK 环境放在注释的转义为 LATEX 部分中。)同样,如果您在列表中使用 UTF-8 扩展字符,则必须将它们放在转义为 LaTeX 的字符中。此外,第 9 节详细介绍了如何在 Λ 上下文中使用扩展字符。

似乎您希望使用多字节编码 utf8x/utf8,并且希望直接输入“ų”之类的国家字符。

extendedchars=false尽管手册说您需要extendedchars=true允许 listings-package 处理此类扩展/国家字符,但您还是必须这样做。

您使用 utf8x/utf8,这是一种多字节编码,尽管手册说您必须避免让列表处理来自多字节编码并由多个字节编码的字符。

您可以执行以下操作:

  1. 不要设置extendedchars=false,但设置extendedchars=true
  2. 通过加载 Heiko Oberdiek 的listingsutf8-package 为\lstinputlisting-command 提供了在实际将内容提供给列表之前从多字节编码转换为合适的单字节编码的例程,并且
  3. 例如,通过filecontents*-environment 的文件内容-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}

在此处输入图片描述

相关内容