这里我使用escapechar
withlistings
来设置列表中单个单词的颜色。但是,使用列表设置的文本设置得比较松散,因此无法对齐。我该如何让它对齐?
\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}
输出