使用UTF-8(或至少包含德语umlauts)的Latex清单

70

我试图使用listings宏包将源文件包含到我的latex文档中,但在代码注释中遇到了德语umlauts的问题。

使用:

\lstset{
extendedchars=\true,
inputencoding=utf8x
}

源文件中的umlauts(使用UTF-8编码且没有BOM)会被处理,但它们会被移动到所在单词的开头。

// die Größe muss berücksichtigt werden
在输入源文件中,变成
// die ößGre muss übercksichtigt werden

在输出文件中。

注意:由于我发现了初始设置中的错误,我对这个问题进行了大量编辑。


1
你在文档中声明了什么输入编码,以及你在编辑器中使用的编码是什么? - Gumbo
1
我在使用法语时也遇到了同样的问题。我认为你应该尝试使用非多字节编码,例如Latin-1。 - Bastien Léonard
1
使用单字节编码可以解决使用 Cyrillic 字符时出现的类似问题。 - Vanuan
一个非常完整的使用lstlistings的文学语句可以在以下链接中找到:https://tex.stackexchange.com/a/574950/6865 - Stephen
25个回答

64

我发现一个更简单的方法,对我来说有效:

\usepackage{listings}

\lstset{
  literate={ö}{{\"o}}1
           {ä}{{\"a}}1
           {ü}{{\"u}}1
}

1
这对我来说很好用,不需要使用package listingsutf8。最佳解决方案! - Chielus
5
它也适用于土耳其语。以下是相关的代码片段:\lstset{ literate={â}{{\^{a}}}1 {Â}{{\^{A}}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ğ}{{\u{g}}}1 {Ğ}{{\u{G}}}1 {ı}{{\i}}1 {İ}{{\.{I}}}1 {ö}{{\"o}}1 {Ö}{{\"O}}1 {ş}{{\c{s}}}1 {Ş}{{\c{S}}}1 {ü}{{\"u}}1 {Ü}{{\"U}}1 } - petrichor
2
另一个答案中描述的使用 texcl=true 的解决方案似乎更加优雅。 - Jan Špaček
1
有人知道这个解决方案对于挪威字符æøå会是什么样子吗? - Njaal Gjerde
我不认为这是解决方案或变通方法,因为如果你有包含任意特殊字符的长文本(可能是生成的),这并没有什么帮助。 - anion

45

对于仅注释,您可以使用texcl选项:

\lstset{language=C++,texcl=true}

您的评论将变为 LaTeX,您可以使用“特殊”字符

\begin{lstlisting}
int iLink = 0x01; // Paramètre entrée
\end{lstlisting}

9
这是这里最优雅的解决方案之一,需要更多的赞! :) - Jan Špaček
哇!你甚至可以将数学公式放入代码清单中,例如 double pi = 3.141; // This is $\pi$double d = 1.0 // $3 \int_0^1 x^2 dx$。这真的很酷! - Elmar Zander
太棒了! 使用“literate”选项会与XeLaTex不兼容。 - WerWet
似乎如果在某个注释中出现$或类似的字符,它们将被解释为数学公式(这可能是无意的),如果它们格式不正确,则会导致许多错误。 - user202729

27

这也适用于其他语言(西班牙语、丹麦语):

\documentclass[
a4paper, %% defines the paper size: a4paper (default), a5paper, letterpaper, ...
12pt %% set default font size to 12 point
]{scrartcl} %% article, see KOMA documentation (scrguide.dvi)

\usepackage[utf8]{inputenc}

\usepackage[T1]{fontenc}
\usepackage{listings}

\lstset{language=Pascal}
\lstset{literate=%
{Ö}{{\"O}}1
{Ä}{{\"A}}1
{Ü}{{\"U}}1
{ß}{{\ss}}2
{ü}{{\"u}}1
{ä}{{\"a}}1
{ö}{{\"o}}1
}

\begin{document}

[Latex: kann man Umlaute in lstlisting verwenden?]
\begin{lstlisting}
Test für Umlaut äöü ÄÖÜ ß So geht es
\end{lstlisting}

\end{document} 

5
谢谢 - 它成功了!波兰语也一样:\lstset{literate={ą}{{\k{a}}}1 {ł}{{\l{}}}1 {ń}{{'n}}1 {ę}{{\k{e}}}1 {ś}{{'s}}1 {ż}{{.z}}1 {ó}{{'o}}1 {ź}{{'z}}1 {Ą}{{\k{A}}}1 {Ł}{{\L{}}}1 {Ń}{{'N}}1 {Ę}{{\k{E}}}1 {Ś}{{'S}}1 {Ż}{{.Z}}1 {Ó}{{'O}}1 {Ź}{{'Z}}1 } - GDR
4
谢谢,GDR!这样做省了我们很多时间。您只忘了ć和Ć。以下是完整的列表(奖励:排序),以便其他人可以快速使用Ctrl+C + Ctrl+V: \lstset{literate=% {ą}{{\k{a}}}1 {ć}{{'c}}1 {ę}{{\k{e}}}1 {ł}{{\l{}}}1 {ń}{{'n}}1 {ó}{{'o}}1 {ś}{{'s}}1 {ż}{{.z}}1 {ź}{{'z}}1 {Ą}{{\k{A}}}1 {Ć}{{'C}}1 {Ę}{{\k{E}}}1 {Ł}{{\L{}}}1 {Ń}{{'N}}1 {Ó}{{'O}}1 {Ś}{{'S}}1 {Ż}{{.Z}}1 {Ź}{{'Z}}1 } (显然,评论没有换行符,因此粘贴后您需要修复它(例如在vim中::.s/ /\r/g)) - przemoc
3
谢谢-好的解决方案!无论如何,它应该是“{ß}{{\ss}}1”,因为“ß”在输出中只占一个字符 ;) - Simon

18

我为捷克语的贡献。

\lstset{
    inputencoding=utf8,
    extendedchars=true,
    literate=%
    {á}{{\'a}}1
    {č}{{\v{c}}}1
    {ď}{{\v{d}}}1
    {é}{{\'e}}1
    {ě}{{\v{e}}}1
    {í}{{\'i}}1
    {ň}{{\v{n}}}1
    {ó}{{\'o}}1
    {ř}{{\v{r}}}1
    {š}{{\v{s}}}1
    {ť}{{\v{t}}}1
    {ú}{{\'u}}1
    {ů}{{\r{u}}}1
    {ý}{{\'y}}1
    {ž}{{\v{z}}}1
    {Á}{{\'A}}1
    {Č}{{\v{C}}}1
    {Ď}{{\v{D}}}1
    {É}{{\'E}}1
    {Ě}{{\v{E}}}1
    {Í}{{\'I}}1
    {Ň}{{\v{N}}}1
    {Ó}{{\'O}}1
    {Ř}{{\v{R}}}1
    {Š}{{\v{S}}}1
    {Ť}{{\v{T}}}1
    {Ú}{{\'U}}1
    {Ů}{{\r{U}}}1
    {Ý}{{\'Y}}1
    {Ž}{{\v{Z}}}1
}

1
谢谢!请注意,为了使其在我的情况下正常工作,我不得不删除inputencoding=utf8extendedchars=true行以及literate=后面的 - zbr

13

我对巴西葡萄牙语的贡献。

\lstset{%
        inputencoding=utf8,
        extendedchars=true,
        literate=%
        {é}{{\'{e}}}1
        {è}{{\`{e}}}1
        {ê}{{\^{e}}}1
        {ë}{{{e}}}1
        {É}{{\'{E}}}1
        {Ê}{{\^{E}}}1
        {û}{{\^{u}}}1
        {ù}{{\`{u}}}1
        {ú}{{\'{u}}}1
        {â}{{\^{a}}}1
        {à}{{\`{a}}}1
        {á}{{\'{a}}}1
        {ã}{{\~{a}}}1
        {Á}{{\'{A}}}1
        {Â}{{\^{A}}}1
        {Ã}{{\~{A}}}1
        {ç}{{\c{c}}}1
        {Ç}{{\c{C}}}1
        {õ}{{\~{o}}}1
        {ó}{{\'{o}}}1
        {ô}{{\^{o}}}1
        {Õ}{{\~{O}}}1
        {Ó}{{\'{O}}}1
        {Ô}{{\^{O}}}1
        {î}{{\^{i}}}1
        {Î}{{\^{I}}}1
        {í}{{\'{i}}}1
        {Í}{{\~{Í}}}1
}

11

好的,现在我找到了一种解决方法:

  1. 使用listingsutf8而不是listings宏包

    \usepackage{listingsutf8}

  2. 将listings.sty复制到文档所在的文件夹中

  3. 找到以下行

    \lst@CCPutMacro
        \lst@ProcessOther {"23}\#
        \lst@ProcessLetter{"24}\textdollar
        \lst@ProcessOther {"25}\%
        \lst@ProcessOther {"26}\&
  4. 在那里输入以下行(每个"注册"一个umlaut)

    \lst@ProcessLetter{"E4}{\"a}
    \lst@ProcessLetter{"F6}{\"o}
    \lst@ProcessLetter{"FC}{\"u}
    \lst@ProcessLetter{"C4}{\"A}
    \lst@ProcessLetter{"D6}{\"O}
    \lst@ProcessLetter{"DC}{\"U}
    \lst@ProcessLetter{"DF}{\ss{}}
  5. 保存文件

  6. 使用

    \lstset{
        extendedchars=\true,
        inputencoding=utf8/latin1
    }

启用utf8字符到latin1字符映射

  1. 将源文件的行结尾从Windows(\r\n)转换为Unix(\n)
  2. 享受吧

我知道这在很多方面都很丑陋,但这是目前我找到的唯一解决方法。


我认为,“extendedchars=\true”等同于“extendedchars=false”。 - Vanuan
我将listings.sty复制到了Ubuntu 10.10上的/usr/share/texmf-texlive/tex/latex/listings/目录下,并将其重命名为listingsutf8.sty。我编辑了这个文件,但我的代码清单无法正常工作。 - Martin Thoma

4

适用于大多数ISO字符(包括瑞典语的åäöÅÄÖ,这正是我所需要的)。

\usepackage[utf8]{inputenc}
\usepackage{listings}
\lstset{literate=
  {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
  {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
  {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
  {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
  {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
  {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
  {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
  {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
  {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
  {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
  {€}{{\EUR}}1 {£}{{\pounds}}1
}

来源:http://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings#Encoding_issue

当使用LaTeX编写源代码时,可能会遇到字符编码问题。这可能是由于代码中包含非ASCII字符而导致的。为了解决这个问题,可以在文档开头添加以下代码:

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

第一行告诉LaTeX输入编码为utf8,第二行指定字体编码为T1。这将确保LaTeX正确地处理所有字符并正确地显示它们。


3
更简单的法语方法。
\documentclass{article}
    \usepackage[utf8]{inputenc}
    \usepackage[francais]{babel}
    \usepackage[T1]{fontenc}
    \usepackage{listings}
    \lstloadlanguages{R}
    \lstset{language=R}
    \lstset{%
        inputencoding=utf8,
            extendedchars=true,
            literate=%
            {é}{{\'{e}}}1
            {è}{{\`{e}}}1
            {ê}{{\^{e}}}1
            {ë}{{{e}}}1
            {û}{{\^{u}}}1
            {ù}{{\`{u}}}1
            {â}{{\^{a}}}1
            {à}{{\`{a}}}1
            {î}{{\^{i}}}1
            {ô}{{\^{o}}}1
            {ç}{{\c{c}}}1
            {Ç}{{\c{C}}}1
            {É}{{\'{E}}}1
            {Ê}{{\^{E}}}1
            {À}{{\`{A}}}1
            {Â}{{\^{A}}}1
            {Î}{{\^{I}}}1
    }

    \begin{document}
    \begin{lstlisting}
    # Est-ce que ça marche : é ê è à Â Ê É Î ç Ç
    x<-rnorm(100,0,10)
    plot(density(x))
    \end{lstlisting}
    \end{document}

2
与之前的帖子(yaxz等)类似,我为克罗地亚定义了宏:
% on top
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[croatian]{babel}

% add listings package
\usepackage{listings}

% set font translations
\lstset{inputencoding=utf8}
\lstset{extendedchars=true}
\lstset{
    literate=%
    {ć}{{\'c}}1
    {č}{{\v{c}}}1
    {đ}{{\dj{}}}1
    {š}{{\v{s}}}1
    {ž}{{\v{z}}}1
    {Ć}{{\'C}}1
    {Č}{{\v{C}}}1
    {Đ}{{\DJ{}}}1
    {Š}{{\v{S}}}1
    {Ž}{{\v{Z}}}1
}

我在添加关键词“inače”时仍然遇到了一些问题。以下内容无法使用“inače”:

\lstset{morekeywords={ponavljaj, ako, inače, dok}}

关键字“inače”(在代码中出现)未被识别为关键字。有什么想法吗?
希望这能帮助其他人(除了我自己 :))。

我有同样的问题,我想要一个带重音符号的关键字。有人做到了吗? - Eduardo Santana

2

对于波兰语:

\lstset{%
literate=%
 {ą}{{\k{a}}}1
 {ę}{{\k{e}}}1
 {Ą}{{\k{A}}}1
 {Ę}{{\k{E}}}1
 {ś}{{\'{s}}}1
 {Ś}{{\'{S}}}1
 {ź}{{\'{z}}}1
 {Ź}{{\'{Z}}}1
 {ń}{{\'{n}}}1
 {Ń}{{\'{N}}}1
 {ć}{{\'{c}}}1
 {Ć}{{\'{C}}}1
 {ó}{{\'{o}}}1
 {Ó}{{\'{O}}}1
 {ż}{{\.{z}}}1
 {Ż}{{\.{Z}}}1
 {ł}{{\l{}}}1
 {Ł}{{\l{}}}1
}

以下是符号列表,以便您可以为您的语言创建它: https://en.wikibooks.org/wiki/LaTeX/Special_Characters


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接