我之前的问题如何抑制输出中的BOM效应?已由@Vaulty 解决。extendedchars=\true
但是,启用 会在第一行产生不必要的空白行,如下所示。
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset
{
breaklines=true,
tabsize=3,
showstringspaces=false,
extendedchars=\true,%<======= SOURCE OF PROBLEM
language={[Sharp]C},
frame=single,
rulecolor=\color{red}%
}
\begin{document}
\lstinputlisting{Program.cs}
\end{document}
Program.cs
由 Visual Studio 生成的测试文件始终带有 BOM(字节顺序标记)前缀。如果您未安装 Microsoft Visual Studio,则可以下载名为默认.aspx.cs从 ASP.NET 官方网站安全下载。值得一提的是,中的反斜杠\true
不是拼写错误。
问题是如何避免extendedchars=\true
产生空行?
答案1
正确的语法是extendedchars=true
没有反斜杠。但是没有 inputenc 就没有意义。使用 inputenc 和/或 fontenc+T1 时,您无法获得想要的结果,因为输入将给出字符。
如果您使用命令作为值,这会在代码中的 BOM 后插入一个新行。这就是为什么它看起来好像是解决问题的方法。但实际上,如果您加载 inputenc 或 fontenc,它会再次中断。
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\lstset
{
breaklines=true,
tabsize=3,
showstringspaces=false,
extendedchars=\blub,%<======= SOURCE OF PROBLEM
language={[Sharp]C},
frame=single,
rulecolor=\color{red}%
}
\begin{document}
abc
\lstinputlisting{test-bom.txt}
\end{document}
当您的主文档是 utf8 并且列表(BOM 除外)是纯 ASCII 时,这里有一个解决 BOM 问题的建议:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage[utf8]{inputenc}
\lstset{%
language={[Sharp]C}}
\begin{document}
\begingroup
\inputencoding{ansinew}
\lstset{
literate={^^ef^^bb^^bf}{}0
}
\lstinputlisting{test-bom.txt}
\endgroup
\end{document}
答案2
没有空行
\lstset{
breaklines,
tabsize=3,
showstringspaces=false,
extendedchars,
language={[Sharp]C},
frame=single,
rulecolor=\color{red}%
}
答案3
如果您想使用不具备 Unicode 原生支持的 TeX 引擎(如 pdfTeX)来排版包含非 ASCII 字符的源代码,则extendedchars
该软件包的选项非常重要。显然,该软件包必须处理大量类别代码,具体而言,该选项解决了与软件包的协作问题,该软件包传统上通过字符激活启用 LaTeX 输入文件的非 ASCII 编码。listings
listings
extendedchars
inputenc
listings
根据当前设计,包与包之间的协作inputenc
仅限于单字节编码,例如 ISO-8859-1 和 ISO-8859-15。因此,当要排版的源代码以 UTF-8 编码时,extendedchars
选项的默认值(即true
)无用,无论包是否加载了utf8
或模块。无论哪种情况,您都会收到错误和错误的输出。utf8x
inputenc
如果extendedchars
选项设置为false
(或\true
,\chapter
,\documentclass
等等 ;-) ),则listings
包不会尝试与inputenc
包协作。根据活动输入编码和 UTF-8 字符的组合,这可能偶然导致伪正确输出(与组合 + BOM 的情况一样utf8x
)。但一般来说,您会再次得到错误和/或错误的输出。
总结一下:当要排版的源代码以 UTF-8 编码时,使用该extendedchars
选项毫无意义。但还有另外两种可能性:
采取
literate
Ulrike Fischer 建议的选项。不要使用该包,而是将该包与扩展选项结合
listings
使用:listingsutf8
inputencoding
... \usepackage{listingsutf8} \lstset{% inputencoding=utf8/ascii, breaklines=true, tabsize=3, showstringspaces=false, language={[Sharp]C}, frame=single, rulecolor=\color{red}% } ...
实际上,该
listingsutf8
包只能处理可以转换为某些单字节编码的 UTF-8 字符。无法转换为任何单字节编码的 UTF-8 字符(例如 BOM)将被默默忽略。这可能是可取的,也可能不是。幸运的是,对于 BOM,这是可行的。
答案4
这是 Vaulty 实际给出的解决方案。不幸的是,我没有意识到这\usepackage[utf8x]{inputenc}
是必要的。
\documentclass{article}
\usepackage{xcolor}
\usepackage[utf8x]{inputenc}%<========= MANDATORY
\usepackage{listings}
\lstset
{
breaklines=true,
tabsize=3,
showstringspaces=false,
extendedchars=\true,%<======= MANDATORY, it is not a typo :)
language={[Sharp]C},
frame=single,
rulecolor=\color{red}%
}
\begin{document}
\lstinputlisting{Default.aspx.cs}
\end{document}