使用 \lstinline 作为描述项时出现问题

使用 \lstinline 作为描述项时出现问题

我正在编写一份用户手册,其中包含一些用 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}

enter image description here

相关内容