代码片段中占位符的可维护排版

代码片段中占位符的可维护排版

我正在寻找一种可维护的排版方式占位符在代码片段中。在我的清单中,我希望两个分隔符之间包含的任何内容@<都是>@

  • 用某种颜色(比如红宝石红)的斜体字排版(打字机排版),
  • 前面有一个直立的(不是斜体)开口 V 形符号,
  • 附加一个直立的(非斜体)闭合 V 形符号。

例如,@<some_value>@在我的某个列表中,应该排版为

在此处输入图片描述

不幸的是,我无法找到一种方法来将分隔符(@<>@)替换为垂直 V 形,而无需对后者进行硬编码,也不会破坏其功能moredelim。我想避免对 V 形进行硬编码,因为它不可维护;想象一下,如果我后来改变了主意,不知道应该如何排版占位符……

下面是我目前拥有的以及我想要获得的东西的示例。有什么想法吗?

\documentclass{article}

\usepackage[dvipsnames]{xcolor}
\usepackage{listings}

\lstset
{
    moredelim       = **[is][\color{RubineRed}\itshape]{@<}{>@},
    basicstyle  = \ttfamily,
}

\begin{document}

Current strategy: hard code the chevrons (which, sadly, get italicised), e.g.
\begin{lstlisting}
    x=@<<some_value>>@
\end{lstlisting}

Desired output of \texttt{\detokenize{x=@<some_value>@}} within a listing:
{
    \ttfamily
    x=%
    {%
        \color{RubineRed}
        \textless\textit{some\_value}\textgreater
    }
}

\end{document}

在此处输入图片描述

答案1

在此处输入图片描述

\documentclass{article}

\usepackage[dvipsnames]{xcolor}
\usepackage{listings}

\def\zz{\color{RubineRed}\textless\bgroup\itshape\aftergroup\endzz}
\def\endzz{\textgreater\egroup}
\lstset
{
    moredelim       = **[is][\zz]{@<}{>@},
    basicstyle  = \ttfamily,
}

\begin{document}

Now the chevrons don't get italicised:
\begin{lstlisting}
    x=@<some_value>@
\end{lstlisting}


\end{document}

答案2

经过一番思考,我想出了一个替代方案。

  • 我用更性感、更常见的和<取代了和;>\textlangle\textrangle
  • 占位符文本现在以斜体排版(包括\/末尾的斜体校正),可以说看起来好多了。
  • 不幸的是,David 的方法存在一些奇怪的间距问题,因此我决定采用逃往 LaTeX路线。我定义了一个用于排版占位符的宏,可以通过转义为 LaTeX 在列表中使用;这escapechar取决于你。

在此处输入图片描述

\documentclass{article}

\usepackage{textcomp}
\usepackage[dvipsnames]{xcolor}
\usepackage{listings}

\begin{document}

\let\us\textunderscore

\newcommand\placeholder[1]%
{%
    \bgroup
        \normalfont\upshape\color{RubineRed}%
        \textlangle{\itshape #1\/}\textrangle%
    \egroup
}

\lstset
{%
    basicstyle  = \ttfamily,
    escapechar=`,
}

\begin{lstlisting}
for i= `\placeholder{first\us{}value}`:`\placeholder{last\us{}value}`
    % do stuff
end
\end{lstlisting}

\end{document}

相关内容