如何防止 extendedchars=\true 产生空行?

如何防止 extendedchars=\true 产生空行?

我之前的问题如何抑制输出中的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 编码。listingslistingsextendedcharsinputenc

listings根据当前设计,包与包之间的协作inputenc仅限于单字节编码,例如 ISO-8859-1 和 ISO-8859-15。因此,当要排版的源代码以 UTF-8 编码时,extendedchars选项的默认值(即true)无用,无论包是否加载了utf8或模块。无论哪种情况,您都会收到错误和错误的输出。utf8xinputenc

如果extendedchars选项设置为false(或\true\chapter\documentclass等等 ;-) ),则listings包不会尝试与inputenc包协作。根据活动输入编码和 UTF-8 字符的组合,这可能偶然导致伪正确输出(与组合 + BOM 的情况一样utf8x)。但一般来说,您会再次得到错误和/或错误的输出。

总结一下:当要排版的源代码以 UTF-8 编码时,使用该extendedchars选项毫无意义。但还有另外两种可能性:

  • 采取literateUlrike Fischer 建议的选项。

  • 不要使用该包,而是将该包与扩展选项结合listings使用:listingsutf8inputencoding

    ...
    \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}

相关内容