如何使用 columns=fixed 和 color 来修复 lstlisting 中的列对齐?

如何使用 columns=fixed 和 color 来修复 lstlisting 中的列对齐?

我正在使用该listings包将一些固定宽度的文本对齐到图像下方。字体basicstyle=\ttfamily外观columns=fixed漂亮,间距完美。

内部的列对齐存在两个问题lstlisting

一小部分文本需要使用不同的颜色(此处为橙色)。此文本与其他文本之间没有空格分隔。显然,其中的转义字符lstlisting被视为空格,这会打乱中间的对齐。[下图中的 1。]

行与行之间存在轻微的对齐不匹配,并且单词之间的空格数不同。[下图中的 2。]

看看包装文档columns=fullflexible,我尝试过将和结合起来keepspaces=true,但没有成功basewidth=0.6em。如果有任何其他想法,我将不胜感激!

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

\begin{document}
\noindent\framebox[7.1cm]{image}

\def\coloro{\color{orange}}
\def\colorb{\color{black}}
\begin{lstlisting}[basicstyle=\ttfamily,escapeinside={(}{)},columns=fixed]
|  ||  ||  ||  ||  ||  ||  ||  |
(\aftergroup\coloro)||||||||||||||||(\aftergroup\colorb)||||||||||||||||
||||||||||||||||||||||||||||||||
|| || || || || || || || || || ||
\end{lstlisting}

\end{document}

在此处输入图片描述

答案1

这里有两个问题。首先,不要使用escapeinside它来突出显示列表的某些部分,而是设置适当的分隔环境:

moredelim=[is][\color{orange}]{(}{)},

这定义了一个由(和分隔的新环境),其中有不可见的分隔符。与此相反,escapeinside所有排版都在列表的特殊解析环境中完成,而escape选项会暂时切换回正常的 LaTeX 模式。

另一个问题是由于包中的一个错误,即使在列对齐listings中,它似乎也会以不同的方式对齐空格标记和其他标记。为了规避这个问题,你可以使用映射到自身的选项:fixedliterate|

literate={|}{|}1

后续管道字符不会被分组,并且对齐是正确的。

完整示例代码:

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

\begin{document}
\noindent\framebox[7.1cm]{image}

\lstset{
    basicstyle=\ttfamily,
    moredelim=[is][\color{orange}]{(}{)},
    columns=fixed,
    literate={|}{|}1
}

\begin{lstlisting}
|  ||  ||  ||  ||  ||  ||  ||  |
(||||||||||||||||)||||||||||||||||
||||||||||||||||||||||||||||||||
|| || || || || || || || || || ||
||||||||||||||||
                ||||||||||||||||
\end{lstlisting}

\end{document}

在此处输入图片描述

相关内容