列表和 UTF-8 存在问题。可以修复吗?

列表和 UTF-8 存在问题。可以修复吗?

我的文档中的列表和 UTF-8 出现了一些问题。也许有人能帮我?有些字符可以,比如 é 和 ó,但 á 和其他字符出现在单词的开头...

\documentclass[12pt,a4paper]{scrbook}
\KOMAoptions{twoside=false,open=any,chapterprefix=on,parskip=full,fontsize=14pt}

\usepackage[portuguese]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listingsutf8}

\usepackage{inconsolata}
\lstset{
    language=bash, %% Troque para PHP, C, Java, etc... bash é o padrão
    basicstyle=\ttfamily\small,
    numberstyle=\footnotesize,
    numbers=left,
    backgroundcolor=\color{gray!10},
    frame=single,
    tabsize=2,
    rulecolor=\color{black!30},
    title=\lstname,
    escapeinside={\%*}{*)},
    breaklines=true,
    breakatwhitespace=true,
    framextopmargin=2pt,
    framexbottommargin=2pt,
    extendedchars=false,
    inputencoding=utf8
}

\begin{document}
\begin{lstlisting}
<?php

echo 'Olá mundo!';
print 'Olá mundo!';
\end{lstlisting}

\end{document}
\end{lstlisting}

答案1

解决此限制的一种方法listings是使用选项extendedchars=true,然后literate对要使用的每个重音使用选项(这样做有点繁琐,但一旦完成了语言的所有重音,就再也不用担心它们了)。语法是

literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 

对于每个重音符号,您必须将真实字符放在括号内(例如{á}),然后将所需的字符放在双括号内(例如{{\'a}}),最后放置数字一(1);在两个条目之间,您可以放置​​一个空格以便清楚表示。

这是您修改后的示例:

\documentclass[12pt,a4paper]{scrbook}
\KOMAoptions{twoside=false,open=any,chapterprefix=on,parskip=full,fontsize=14pt}

\usepackage[portuguese]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{xcolor}

\usepackage{inconsolata}
\lstset{
    language=bash, %% Troque para PHP, C, Java, etc... bash é o padrão
    basicstyle=\ttfamily\small,
    numberstyle=\footnotesize,
    numbers=left,
    backgroundcolor=\color{gray!10},
    frame=single,
    tabsize=2,
    rulecolor=\color{black!30},
    title=\lstname,
    escapeinside={\%*}{*)},
    breaklines=true,
    breakatwhitespace=true,
    framextopmargin=2pt,
    framexbottommargin=2pt,
    inputencoding=utf8,
    extendedchars=true,
    literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1,
}

\begin{document}

\begin{lstlisting}
<?php

echo 'Olá mundo!';
print 'áãé';
\end{lstlisting}

\end{document}

答案2

将这些字符转义为 LaTeX,如文档(列表手册,第 14 页)所建议的那样:

类似地,如果您在列表中使用 UTF-8 扩展字符,则必须将它们放在 LaTeX 的转义字符内。

\documentclass[12pt,a4paper]{scrbook}
\KOMAoptions{twoside=false,open=any,chapterprefix=on,parskip=full,fontsize=14pt}

\usepackage[portuguese]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listingsutf8}
\usepackage{xcolor}

\usepackage{inconsolata}
\lstset{
    language=bash, %% Troque para PHP, C, Java, etc... bash é o padrão
    basicstyle=\ttfamily\small,
    numberstyle=\footnotesize,
    numbers=left,
    backgroundcolor=\color{gray!10},
    frame=single,
    tabsize=2,
    rulecolor=\color{black!30},
    title=\lstname,
    escapeinside={\%*}{*)},
    breaklines=true,
    breakatwhitespace=true,
    framextopmargin=2pt,
    framexbottommargin=2pt,
    extendedchars=false,
    inputencoding=utf8
}

\begin{document}
\begin{lstlisting}
<?php

echo '%*Olá mundo*)!';
print '%*Olá mundo*)!';
\end{lstlisting}

\end{document}

在此处输入图片描述

答案3

该包处理非 ASCII UTF-8 编码字符的方式inputenc(通过使第一个字节处于活动状态,然后读取后面的字节作为参数)与该listing包的工作方式根本不兼容,后者单独读取每个字节并期望它是一个单独的字符。

listingsutf8 包尝试解决此问题,因为您的字符可以转换为某种 8 位编码(并且您正在使用 PdfLaTeX) - 但这仅适用于\lstinputlisting(正如 Marc 的回答指出的那样),而不适用于内联列表。对于内联列表,该literate选项(正如 Phillipe 指出的那样)听起来不错。另一种方法是转为 LaTeX(正如 Gonzalo 指出的那样) - 但这很简单剪切和粘贴不行。

上次我排版包含非 ASCII Unicode 字符的代码时(比如 Java 标识符中的 ℤ,据我所知,它们不在任何 8 位编码中),我改用 XeLaTeX,它支持开箱即用的 UTF-8 输入,无需 inputenc 包。有了这个,它工作得很好。我想 LuaLaTeX 也会以同样的方式工作(但当时还不那么成熟)。

(但后来我也想让评论格式化,因此我开始/恢复了我的ltxdoclet 项目包括源代码和格式化的注释。)

答案4

使用 listingsutf8 包和传统(非 UTF-8)TeX 引擎,您只能使用 \lstinputlisting 命令,该命令可以正确显示 UTF-8 编码的文件。您不能使用 lstlisting 环境,除非里面的代码是纯 ASCII。

相关内容