在 lstlisting 中逃离 moredelim

在 lstlisting 中逃离 moredelim

我想知道是否仍然可以打印所选中的字符moredelim\lstdefinestyle事实证明,由于我已将字符定义为moredelim,因此它只能在引号或注释中使用,没有明显的方法来转义它。以下是一些代码,可帮助您理解我的意思:

% !TEX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{listings,xcolor}
\usepackage[T1]{fontenc}
\usepackage{verbatim}

\newcommand{\listingsfont}{\fontfamily{courier}}

\lstdefinestyle{test}{
    language={sh},
    moredelim=**[is][\color{red}]{~}{~},
    basicstyle=\ttfamily, 
}

\begin{document}

I want to highlight first two command arguments in the following code:
\begin{verbatim}
$ ./my-command some-dir some-dir2 some-other-argument
$ ./my-command ~/Desktop ~/Documents some-other-argument
\end{verbatim}


What I get:
\begin{lstlisting}[style=test]
$ ./my-command ~some-dir~ ~some-dir2~ some-other-argument
$ ./my-command ~"~/Desktop"~ ~~./Documents~ some-other-argument
# ~ is not shown before ./Documents because of being used in moredelim,
# but it can be still printed in comments / inside strings.
\end{lstlisting}
\end{document}

在 lstlisting 中逃离 moredelim

当然,在我的简单例子中,我可以通过使用其他字符代替 ~ 来解决这个问题,但是当涉及到一份有几百页和大量列表的文档时,最好知道无论你选择什么 moredelims,你都不会陷入陷阱。

我怎样才能将 ~ (或任何其他字符)保留为moredelim,但仍能够在需要时打印它?

答案1

看来我现在找到了自己问题的解决方案。它literate在定义时使用\lstdefinestyle

% !TEX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage{listings,xcolor}
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage{verbatim}

\newcommand{\listingsfont}{\fontfamily{courier}}

\lstdefinestyle{test}{
    language={sh},
    moredelim=**[is][\color{red}]{~}{~},
    moredelim=**[is][\color{blue}]{<}{>},
    basicstyle=\ttfamily, 
    literate={\\~}{{\textasciitilde}}1
        {\\<}{{\unichar{"003C}}}1 
        {\\>}{{\unichar{"003E}}}1
}

\begin{document}

\textasciitilde, > or < can be escaped using \texttt{literate}, and still be used as \texttt{moredelim}:
\begin{lstlisting}[style=test]
$ ./my-command ~some-dir~ ~some-dir2~ some-other-argument
$ ./my-command ~"~/Desktop"~ ~\~./Documents~ some-other-argument
$ ls \~ > /dev/null
$ <ls \~ \> /dev/null>  
\end{lstlisting}
\end{document}

定义 lstdefinestyle 时,可以使用 literate 在 lstlisting 中转义 moredelim

您可以在 moredelim 字符前添加反斜杠,然后将该序列替换为纯字符。诀窍在于使用与字符或其 unicode 定义对应的 latex 命令。如果您输入{\\~}{{~}}1而不是{\\~}{{\textasciitilde}}1,这将不起作用,因为 latex 最终会陷入死循环。

通过这样的解决方法,您可以获得非常简短和简单的 moredelims,但不必限制您在列表中打印的内容。

相关内容