我想制作一个灰色框,里面有一些代码,但它应该已经显示一个居中的波浪号,后面跟着一个美元符号。或者我如何在环境中使用命令来获取某些文本,例如\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
意味着它的内容出现在前一行的末尾,这可能是也可能不是一个错误(在我看来它看起来像一个......)。