我正在寻找一种可维护的排版方式占位符在代码片段中。在我的清单中,我希望两个分隔符之间包含的任何内容@<
都是>@
- 用某种颜色(比如红宝石红)的斜体字排版(打字机排版),
- 前面有一个直立的(不是斜体)开口 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}