确定是否在 \lstinline 或普通 lstlisting 环境中

确定是否在 \lstinline 或普通 lstlisting 环境中

我的编辑器要求我的代码清单的背景不能是白色。为了让我的代码清单看起来更美观,我使用设置literatelistings下划线(在 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}

在此处输入图片描述

相关内容