我正在编写一份用户手册,其中包含一些用 XML 编写的代码的文档。我想在两个嵌套描述环境中编写此文档,并使用我的 XML 语法样式突出显示标签,如以下代码所示:
\documentclass[11pt,%
a4paper,%
twoside,openright,%
]{scrreprt}
\usepackage{listings,xcolor}
\definecolor{darkgreen}{rgb}{0.0,0.6,0.0}
\usepackage{lipsum}
\lstdefinelanguage{XML}
{
morestring=[b]",
morestring=[s]{>}{<},
morecomment=[s]{<?}{?>},
morecomment=[s]{<!--}{-->},
moredelim=[l][basicstyle]{>},
morekeywords={xmlns,version,type,value,Value,app,com}
}
\lstdefinestyle{MyXML}
{
language=XML,
basicstyle=\small\ttfamily,
keywordstyle=\color{darkgreen},
identifierstyle=\color{blue},
stringstyle=\color{red},
commentstyle=\color{gray}\upshape,
emphstyle=\itshape,
columns=fullflexible,
breaklines=true,
keepspaces=true,
showstringspaces=false,
frame=single,
}
% Use lstinline as item in description
\newcommand*{\lstitem}[2][]{
\setbox0\hbox{\lstinline[#1]|#2|}
\item[\usebox0]\leavevmode
}
\renewcommand{\ttdefault}{pcr}
\begin{document}
\begin{description}
\lstitem[style=MyXML]{time}
\begin{description}
\lstitem[style=MyXML,morekeywords={app}]{app}\lipsum{1}
\lstitem[style=MyXML,morekeywords={com}]{com}\lipsum{2}
\end{description}
\lstitem[style=MyXML]{standalone}\lipsum{3}
\end{description}
\end{document}
我希望嵌套描述的第一个标签(“app”)与“time”标签保持在同一行。有人能帮我吗?
答案1
您不应该过早地将文本吸收为\lstinline
参数,因为这会破坏需要更改类别代码的宏的工作。
一种解决方法是修补一个由调用的内部宏,\lstinline
以便它关闭由发起的组\setbox0=\hbox\bgroup
,然后传递\item[\usebox0]
。
在以下实现中,对 的补丁\lst@InlineM
对于该框内置的隐式组是本地的,因此它不会影响 的其他用法\lstinline
。
\documentclass[
11pt,
a4paper,
twoside,
openright,
]{scrreprt}
\usepackage{listings,xcolor,etoolbox}
\definecolor{darkgreen}{rgb}{0.0,0.6,0.0}
\usepackage{lipsum}
\lstdefinelanguage{XML}{
morestring=[b]",
morestring=[s]{>}{<},
morecomment=[s]{<?}{?>},
morecomment=[s]{<!--}{-->},
moredelim=[l][basicstyle]{>},
morekeywords={xmlns,version,type,value,Value,app,com}
}
\lstdefinestyle{MyXML}{
language=XML,
basicstyle=\small\ttfamily,
keywordstyle=\color{darkgreen},
identifierstyle=\color{blue},
stringstyle=\color{red},
commentstyle=\color{gray}\upshape,
emphstyle=\itshape,
columns=fullflexible,
breaklines=true,
keepspaces=true,
showstringspaces=false,
frame=single,
}
% Use lstinline as item in description
\makeatletter
\newcommand*{\lstitem}[1][]{%
\setbox0\hbox\bgroup
\patchcmd{\lst@InlineM}{\@empty}{\@empty\egroup\item[\usebox0]\leavevmode\ignorespaces}{}{}%
\lstinline[#1]%
}
\makeatother
\renewcommand{\ttdefault}{pcr}
\begin{document}
\begin{description}
\lstitem[style=MyXML]|time|
\begin{description}
\lstitem[style=MyXML,morekeywords={app}]{app}\lipsum[1]
\lstitem[style=MyXML,morekeywords={com}]{com}\lipsum[2]
\end{description}
\lstitem[style=MyXML]{standalone}\lipsum[3]
\end{description}
\end{document}