listings 包:删除换行符前的最后一个空格。如何保留它?

listings 包:删除换行符前的最后一个空格。如何保留它?

我的电脑上有某种模板/bash 脚本示例(硬盘上的 .sh 文件),我在其中放置了命令和注释输出。这是我的 example.sh 文件:

echo     this    is    wide    spaced    
#this is wide spaced
echo     this    is    $'\n'    wide    spaced    
#this is <-notice the whitespace here before the newline
# wide spaced

(我添加了“<-注意换行符之前的空格”,但脚本中没有)。有时我会在 latex 中编译它们以添加更多信息,并使用 lstinputlisting 导入它们。我已定义:

\documentclass{article}
\usepackage{listings}

\begin{document}
\lstdefinestyle{customBashStyle}{
  keepspaces=true,
  language=Bash,
  showspaces=true,
}

\lstinputlisting[style=customBashStyle]{./example.sh}
\end{document}

问题是它保留了所有空格,使它们可见,除了换行符之前的空格。我怎样才能使该空格也存在且可见?

答案1

这与 TeX 读取文件的低级过程有关,这个过程分为几个步骤;与当前问题最相关的是,引用 TeXbook 第 46 页,

TeX 删除输入行最右端的所有 ⟨space⟩ 字符(数字 32)。

listings大多数 TeX 实现也会删除制表符(编号 9)。这甚至在标记化过程开始将字符转换为标记之前就已发生,因此当某一行完成其工作时,尾随空格就一去不复返了。

对于需要显示尾随空格的特殊情况,这种情况很少见,因为 shell 脚本的工作方式与 TeX 相同并且会忽略尾随空格,您可以使用以下escapechar功能:

\documentclass{article}
\usepackage{listings}

\begin{document}
\lstdefinestyle{customBashStyle}{
  basicstyle=\ttfamily,
  columns=fullflexible,
  keepspaces=true,
  language=Bash,
  showspaces=true,
}

%\lstinputlisting[style=customBashStyle]{./example.sh}

\begin{lstlisting}[style=customBashStyle,escapechar=\%]
echo     this    is    wide    spaced
#this is wide spaced
echo     this    is    $'\n'    wide    spaced
#this is %%
# wide spaced
\end{lstlisting}

\end{document}

在此处输入图片描述

恐怕没有其他方法可以打印尾随空格。您可以使用任何未出现在要打印的代码中的转义字符作为转义字符。

相关内容