我的编辑器要求我的代码清单的背景不能是白色。为了让我的代码清单看起来更美观,我使用设置literate
将listings
下划线(在 T1 字体编码中非常宽)更改为更窄的规则。由于我希望读者能够将代码从 PDF 复制到文本编辑器中并获取语法有效的代码,因此我目前在规则之外插入了“不可见”的文本下划线。
我使用 使下划线不可见,使其与非白色代码列表背景颜色相同。但是,当我排版背景\textcolor
为白色的代码时,这种方法不起作用。\lstinline
因此,我希望下划线的颜色发生变化:在lstlisting
环境中它应该是灰色,在\lstinline
环境中它应该是白色。我该如何实现呢?
最小工作示例:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{color,listings}
\lstset{backgroundcolor=\color[rgb]{0.85,0.85,0.86},
literate={_}{\niceunderscore}1}
\newcommand{\niceunderscore}{%
% Invisible underscore that can be copied in the PDF:
\makebox[0pt][l]{\makebox[3pt][c]{%
\textcolor[rgb]{0.85,0.85,0.86}{\_}}}%
% Visible, noncopyable rule:
\rule[-0.4pt]{3pt}{0.4pt}}
\begin{document}
This is what \lstinline+foo_bar+ looks like:
\begin{lstlisting}
foo_bar
\end{lstlisting}
\end{document}
如您所见,下划线在内联文本中的黑色规则下方显示为灰色字符,但在环境中lstlisting
,它却像我希望的那样不可见。
答案1
恕我直言,您可以使用 TextStyle-Hook:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\definecolor{mygray}{rgb}{0.85,0.85,0.86}
\newcommand\mylstcolor{mygray}
\usepackage{listings}
\lstset{backgroundcolor=\color{mygray},
literate={_}{\niceunderscore}1}
\newcommand{\niceunderscore}{%
% Invisible underscore that can be copied in the PDF:
\makebox[0pt][l]{\makebox[3pt][c]{%
\textcolor{\mylstcolor}{\_}}}%
% Visible, noncopyable rule:
\rule[-0.4pt]{3pt}{0.4pt}}
\makeatletter
\lst@AddToHook{TextStyle}{\def\mylstcolor{white}}
\makeatother
\begin{document}
This is what \lstinline+foo_bar+ looks like:
\begin{lstlisting}
foo_bar
\end{lstlisting}
\end{document}