对齐列表中的转义文本

对齐列表中的转义文本

这里我使用escapecharwithlistings来设置列表中单个单词的颜色。但是,使用列表设置的文本设置得比较松散,因此无法对齐。我该如何让它对齐?

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

\begin{document}
\lstset{language=Python,
  basicstyle=\ttfamily,
  keywordstyle=\textcolor{purple},
  escapechar=\@,
}
\begin{lstlisting}
def pass_fn(x):
    pass
\end{lstlisting}

\begin{lstlisting}
def @\textcolor{blue}{pass\_fn}@(x):
    pass
\end{lstlisting}

\end{document}

在此处输入图片描述

\textcolor那里有一个例子,但没有什么特别的问题。我使用 也遇到了同样的问题@\ttfamily pass\_fn@

答案1

listings在输入中找到转义字符时,它会暂时切换回正常输入处理和排版模式。这意味着@...@在您的示例中读取的所有字符都没有像列表中的字符那样对齐。只有当您确实需要列表中的一些 LaTeX 代码(如数学符号)时才应使用转义。

但是,有几种方法可以突出显示代码的各个部分:

强调标识符

listings有一些特殊的标识符组,例如关键字或强调标识符。后者用于突出显示代码中的特殊单词。与标识符一样,您可以声明不同编号的强调标识符类:

emph      = [1]{pass_fn},
emphstyle = [1]{\color{blue}}

优点:代码中无需额外标签。
缺点:仅适用于标识符。

分隔环境

与转义环境类似,您可以定义新的分隔环境,这些环境不会转义到正常处理,但仍允许您为分隔符之间的文本定义特殊标记。分隔符类型多种多样,最有趣的是两种 ( s) 不可见 ( i) 分隔符:

moredelim = [is][\color{blue}]{\#}{\#}

优点:可用于代码的任意部分,也可以嵌套。
缺点:需要在代码中添加额外的标签。

文学处理

listings还提供了literate指定精确/文字代码替换的选项。请注意,替换文本的每个字符都设置在单个框中,这可以防止在整个替换文本周围跨越格式化命令:

literate = {pass_fn}{{\textcolor{blue}{p}}
                     {\textcolor{blue}{a}}
                     {\textcolor{blue}{s}}
                     {\textcolor{blue}{s}}
                     {\textcolor{blue}{\char`\_}}
                     {\textcolor{blue}{f}}
                     {\textcolor{blue}{n}}}{7}

优点:无需额外标签即可用于代码的任意部分。
缺点:如果替换文本长度超过几个字母,则定义会非常冗长。

完整示例文档:

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

\begin{document}
\parindent=0pt
\lstset{language=Python,
  basicstyle=\ttfamily,
  keywordstyle=\textcolor{purple},
  escapechar=\@,
}

\begin{lstlisting}
def pass_fn(x):
    pass
\end{lstlisting}

\bigskip
\begin{minipage}[t]{0.4\linewidth}
\texttt{escapechar:}
\begin{lstlisting}
def @\textcolor{blue}{pass\_fn}@(x):
    pass
\end{lstlisting}
\end{minipage}
%
\begin{minipage}[t]{0.4\linewidth}
\texttt{emph/emphstyle:}
\begin{lstlisting}[
    emph={[1]{pass_fn}},
    emphstyle={[1]{\color{blue}}}
]
def pass_fn(x):
    pass
\end{lstlisting}
\end{minipage}

\bigskip
\begin{minipage}[t]{0.4\linewidth}
\texttt{moredelim:}
\begin{lstlisting}[
    moredelim={[is][\color{blue}]{\#}{\#}}
]
def #pass_fn#(x):
    pass
\end{lstlisting}
\end{minipage}
%
\begin{minipage}[t]{0.4\linewidth}
\texttt{literate:}
\begin{lstlisting}[
    literate={pass_fn}{{\textcolor{blue}{p}}
                       {\textcolor{blue}{a}}
                       {\textcolor{blue}{s}}
                       {\textcolor{blue}{s}}
                       {\textcolor{blue}{\char`\_}}
                       {\textcolor{blue}{f}}
                       {\textcolor{blue}{n}}}{7}
]
def pass_fn(x):
    pass
\end{lstlisting}
\end{minipage}

\end{document}

输出

在此处输入图片描述

相关内容