将默认文本放入列表环境中

将默认文本放入列表环境中

我想制作一个灰色框,里面有一些代码,但它应该已经显示一个居中的波浪号,后面跟着一个美元符号。或者我如何在环境中使用命令来获取某些文本,例如\newcommand{\prompt}{user@linux:\~\$}

\documentclass{book}
\usepackage{fontspec,listings,color}
\definecolor{verbgray}{gray}{0.9}
\newfontfamily\ubuntumono{Ubuntu Mono}
\lstnewenvironment{sh}{
  \lstset{backgroundcolor=\color{verbgray},
  frame=single,
  framerule=1pt,
  basicstyle=\ubuntumono,
  columns=fullflexible}}{}
\begin{document}
\begin{sh}
user@linux:(centered tilde)$
\end{sh}
\end{document}

这必须使用 XeLaTeX 为 fontspec 包构建。

答案1

使用该etoolbox包,您可以修补类似于下面的示例。(我删除了对测试的\lst@NewLine依赖...):fontspec

\documentclass{article}

\usepackage{listings,xcolor,etoolbox}
\definecolor{verbgray}{gray}{0.9}

\newcommand*\prompt{}% empty default
\lstnewenvironment{sh}{%
  % redefine bash prompt:
  \renewcommand*\prompt{user@linux:\textasciitilde>\space}%
  \lstset{backgroundcolor=\color{verbgray},
    frame=single,
    framerule=1pt,
    basicstyle=\ttfamily,
    columns=fullflexible
  }%
}{}

% patch \lst@NewLine:
\makeatletter
\patchcmd\lst@NewLine
  {\hbox{}}% search
  {\hbox{}\prompt}% replace
  {}% success
  {}% failure
\makeatother

\begin{document}

\begin{sh}
foo

baz
\end{sh}

% other listings behave as they should:   
\begin{lstlisting}
foo
\end{lstlisting}

\end{document}

在此处输入图片描述

listings实际上有一个钩子OnNewLine,但是添加的代码\lst@AddToHook{OnNewLine}{<code>}似乎被放在了之前\par\noindent,这\lst@NewLine意味着它的内容出现在前一行的末尾,这可能是也可能不是一个错误(在我看来它看起来像一个......)。

相关内容