编译代码
\documentclass{standalone}
\usepackage{newtxtext,newtxmath}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[columns=flexible,mathescape,identifierstyle=\slshape,keywords={SPEC,sort},numbers=left,numberstyle=\tiny,numbersep=5pt]
SPEC SomeSpecification =
{
sort Sort1, AnotherSort, ThisOneIsOk, AFourthSort
fun1: Sort1 $\to$ AnotherSort
anotherFun: AnotherSort $\to$ AFourthSort
thirdFun: AnotherSort, AFourthSort $\to$ ThisOneIsOk
}
\end{document}
使用 pdflatex 产生输出
如您所见,在第 3 行中,“AnotherSort”与后面的逗号之间的空格比“ThisOneIsOk”与后面的逗号之间的空格大得多。这似乎是一个小问题,但第 3 行中的排序越多,看起来就越糟糕。如何自动将逗号“粘贴”到其前面的单词,同时保持对齐
第 3 行至第 7 行,即第一个单词(“sort”、“fun1”、“anotherFun”和“thirdFun”)应从同一列开始,并且在
第 5 至第 7 行,即冒号后的函数类型(“Sort1”、“AnotherSort”、“AnotherSort”)应从同一列开始
?
我不想在\begin{lstlisting}[...]
和之间更改\end{lstlisting}
太多代码,而希望采用集中解决方案(例如,通过某些包选项、某些环境选项或某些宏)。我也不太可能切换到等宽字体:它会占用更多空间。
答案1
摘自手册listings
:
这三种格式之间的区别在于,完全灵活格式不关心其他任何事情,而普通灵活格式和空间灵活格式则在字符串需要的空间小于“保留”时尝试修复列对齐。普通灵活格式将在空格处、标识符前后以及其他字符序列前后插入补充空间以修复对齐;空间灵活格式只会通过拉伸现有空间来插入补充空间。在上面的灵活示例中,两个 MEN 垂直对齐,因为在第四行插入了一些空间来修复对齐。在完全灵活格式中,两个 MEN 未对齐。
以下是示例
从描述来看,flexible
它正在做它应该做的事情。fullflexible
在任何情况下都可以使用,特别是使用可变宽度字体时,进行列对齐是没有意义的。
\documentclass{article}
\usepackage{newtxtext,newtxmath}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[
columns=fullflexible,
mathescape,
identifierstyle=\slshape,
keywords={SPEC,sort},
numbers=left,
numberstyle=\tiny,numbersep=5pt]
SPEC SomeSpecification =
{
sort Sort1, AnotherSort, ThisOneIsOk, AFourthSort
fun1: Sort1 $\to$ AnotherSort
anotherFun: AnotherSort $\to$ AFourthSort
thirdFun: AnotherSort, AFourthSort $\to$ ThisOneIsOk
}
\end{lstlisting}
\end{document}
如果您想要保持对齐并且没有“移位标点”,请使用等宽字体;有几种可供选择。
\documentclass{article}
\usepackage{newtxtext,newtxmath}
\usepackage{listings}
\begin{document}
\begin{lstlisting}[
basicstyle=\ttfamily,
columns=flexible,
basewidth={0.5em,0.5em},
mathescape,
identifierstyle=\slshape,
keywords={SPEC,sort},
numbers=left,
numberstyle=\tiny,numbersep=5pt]
SPEC SomeSpecification =
{
sort Sort1, AnotherSort, ThisOneIsOk, AFourthSort
fun1: Sort1 $\to$ AnotherSort
anotherFun: AnotherSort $\to$ AFourthSort
thirdFun: AnotherSort, AFourthSort $\to$ ThisOneIsOk
}
\end{lstlisting}
\end{document}
结果如下\usepackage{sourcecodepro}
: