ファイル内のコードリスト内の文字配置が間違っている

ファイル内のコードリスト内の文字配置が間違っている

コード リストで使用すると、母国語 (リトアニア語) の文字が適切な位置に表示されないという問題があります。この問題は、ファイルからリストする場合でも発生します。通常使用されるこれらの特殊文字は問題なく表示されます。何らかの理由で、これらの文字は単語の先頭に戻り続けます。

\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 トラブルシューティングの説明に従ってバグ レポートを作成してください。

拡張文字は、アラビア語、中国語、ヘブライ語、日本語など、特に文字ごとに複数のバイトを使用するエンコードには適用されません。
したがって、中国語および UTF-8 文字用の CJK または ucs パッケージなど、マルチバイト文字をサポートするパッケージを使用する場合は、リストで拡張文字が処理されないようにする必要があります。一般的には、リストが他のパッケージの拡張文字処理に巻き込まれないように、extendedchars=false も指定するのが最善です。リストが CJK 環境内に含まれていて、リスト内に CJK 文字を含めたい場合は、LATEX にエスケープするコメント内に配置できます。方法については、セクション 5.12 を参照してください。(リストが CJK 環境内にない場合は、コメントの LATEX にエスケープする部分に小さな CJK 環境を置くだけです。) 同様に、リストで UTF-8 拡張文字を使用している場合は、LaTeX へのエスケープ内に配置する必要があります。また、セクション 9 には、Λ のコンテキストで拡張文字を操作する方法の詳細がいくつか記載されています。

マルチバイトエンコーディングである utf8x/utf8 を使用し、「ų」などの国別文字を直接入力したいようです。

extendedchars=falseマニュアルには、extendedchars=truelistings パッケージがこのような拡張文字や国別文字を処理できるようにする必要があると書かれていますが、そうではありません。

マルチバイト エンコーディングである utf8x/utf8 を使用しますが、マニュアルには、マルチバイト エンコーディングから取得され、複数バイトでエンコードされた文字をリストで処理しないようにする必要があると記載されています。

次の操作を実行できます。

  1. 設定しないextendedchars=falseで設定しextendedchars=true
  2. Heiko Oberdiekのリストutf8-packageは、\lstinputlisting-コマンド用に、実際にリストにデータを入力する前に、マルチバイトエンコーディングから適切なシングルバイトエンコーディングに変換するルーチンを提供します。
  3. 例えばfilecontents*ファイル内容-package はリストを一時ファイルに保存し、それを\lstinputlisting-command 経由で挿入します。

私のシステムには 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}

ここに画像の説明を入力してください

関連情報