![列表和 UTF-8 存在问题。可以修复吗?](https://linux22.com/image/239274/%E5%88%97%E8%A1%A8%E5%92%8C%20UTF-8%20%E5%AD%98%E5%9C%A8%E9%97%AE%E9%A2%98%E3%80%82%E5%8F%AF%E4%BB%A5%E4%BF%AE%E5%A4%8D%E5%90%97%EF%BC%9F.png)
我的文档中的列表和 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。