我在列表包中遇到了麻烦showstringspaces
,将选项设置为 true 似乎被完全忽略了。
我的目标是使用突出显示字符串中的空格\inlinetext
,但目前输出如下所示:
我是不是漏掉了什么?为什么showstringspaces
没有任何效果?
最小工作示例:
\documentclass{article}
% Color
\usepackage{xcolor}
\usepackage{textcomp}
% Code
\usepackage{listings}
\newcommand*{\inlinetext}{\lstinline[language=textwithspaces,showstringspaces=true,style=showspaces]}
\lstdefinestyle{showspaces}{
basicstyle = \footnotesize\ttfamily,
breaklines=true,
upquote=true,
showstringspaces=true
}
\lstdefinelanguage{textwithspaces}{
alsoletter={0,1,2,3,4,5,6,7,8,9,.,/,:},
showstringspaces=true,
style=showspaces
}
\begin{document}
\begin{table}[h]
\begin{tabular}{ll}
Raw Transactor Name & Occurrences \\
\inlinetext$TESCO STORES 5128$ & 87 \\
\inlinetext$TESCO STORES 2977$ & 68 \\
\inlinetext$TESCO_STORES$ & 14 \\
\inlinetext$SACAT MARKS AND$ & 33 \\
\inlinetext$SACAT MARKS AND$ & 16 \\
\inlinetext$WILKINSON $ & 22 \\
\inlinetext$WILKINSON$ & 8
\end{tabular}
\label{table:cleaningstrings}
\end{table}
\end{document}
答案1
不显示可见空格字符的原因是showstringspaces
key 只显示字符串文字中的可见空格,并且您的自定义样式和自定义语言都没有定义列表中应将哪些内容视为字符串。您似乎希望在任何地方都显示可见空格;在这种情况下,正如您正确猜测的那样,您应该使用showspaces
。
一些建议
(太长而无法留在 TeX.SX 注释中):
style
并且language
在语义上有所不同。在大多数情况下,一种listings
语言应该只用来定义一种语言是(关键字、字符串分隔符、注释等)。相反,listings
样式应该只用于定义给定语言应该看起来像。您应该首先定义语言,使用诸如morekeywords
、morestring
、morecomment
等键。然后,您应该通过加载新定义的语言并自定义外观来定义样式,使用诸如basicstyle
、keyworstyle
、stringstyle
、commentstyle
、showstringspaces
等键。根据此规则,您可以在样式定义中加载语言,但绝不能相反,因为语言的listings
层次结构比样式更高。- 不要使用这个名字展示空间寻求一种新的风格。您不应定义名为 的样式,
showspaces
因为这是键的名称listings
。这样的名称选择可能是安全的(它不应与任何副作用相关联),但它可能会造成混淆。 - 先加载语言,稍后自定义外观。定义样式时,加载相关语言(或基本样式)第一的,然后才自定义外观。“太晚”加载语言或样式可能会抹去大部分当前设置。
- 对内联代码使用单字符简写。如果在整个文档中使用内联代码,则可以使用
listings
'\lstMakeShortInline
宏(请参阅文档中的第 4.17 节)以您选择的样式定义内联代码的单字符简写,从而节省一些击键次数。当然,您应该使用很少/从未使用过的字符:如果它出现在文件的其他地方tex
,则可能会使 TeX 完全混乱。
我认为您的代码可以改进如下:
\documentclass{article}
% Color
\usepackage{xcolor}
\usepackage{textcomp}
% Code
\usepackage{listings}
\lstdefinelanguage{vizspaces-lang}{
alsoletter={0,1,2,3,4,5,6,7,8,9,.,/,:}, % Is there a good reason for that?
}
\lstdefinestyle{vizspaces-sty}{
language = vizspaces-lang,
basicstyle = \footnotesize\ttfamily,
breaklines = true,
showspaces = true,
% showstringspaces = true, % (not needed if showspaces is set)
upquote = true,
}
\lstMakeShortInline[style=vizspaces-sty]"
\begin{document}
\begin{table}[h]
\begin{tabular}{ll}
Raw Transactor Name & Occurrences \\
"TESCO STORES 5128" & 87 \\
"TESCO STORES 2977" & 68 \\
"TESCO_STORES" & 14 \\
"SACAT MARKS AND" & 33 \\
"SACAT MARKS AND" & 16 \\
"WILKINSON " & 22 \\
"WILKINSON" & 8
\end{tabular}
\label{table:cleaningstrings}
\end{table}
\end{document}
答案2
我发现了错误,我在评论中暗示的是正确的,列表没有将文本视为字符串。但是,我发现了显示showspaces=true
列表中任何地方找到的空格的选项,并且完全符合我的要求。