有這樣的問題:在程式碼清單中使用時,我的母語(立陶宛語)字元沒有顯示在正確的位置。即使從文件列出,也會出現此問題。通常使用的那些特殊字元顯示得很好。由於某種原因,這些字元不斷跳回詞首。
\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=true
列表包處理此類擴展/國家字符。
您使用 utf8x/utf8,這是多位元組編碼,儘管手冊說您必須避免讓清單處理來自多位元組編碼且由多個位元組編碼的字元。
您可以執行以下操作:
- 不要設置
extendedchars=false
,而是設置extendedchars=true
並 - 確保列表包不需要透過載入 Heiko Oberdiek 的來處理多位元組字符列表sutf8-package 為
\lstinputlisting
-command 提供了在實際將內容提供給清單之前從多位元組編碼轉換為合適的單字節編碼的例程 - 例如,透過
filecontents*
-environment文件內容-package 將清單放入臨時檔案中並透過\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}