在 \item 中使用 \lstinline

在 \item 中使用 \lstinline

我知道逐字命令的脆弱性,并且它们不应该用作另一个宏的参数,但需要编写一个description环境,其中要定义的术语是编程变量和函数,因此我需要\lstinline与它们一起使用。

我知道逐字描述列表项,但我的问题有些不同,原因如下:

  • 我不想只提供逐字输出和tt字体,我想要提供的语法高亮\lstinline
  • 那些描述环境不是我写的,是用工具(pandoc)自动生成的。

本质上,我有一个markdown源文件,例如包含:

The arguments of the function are:

`foo`
   : Name of the file
`bar`
   : Permissions

(该语法是 Markdown 描述的扩展,由 实现pandoc)。通过适当的选项处理后,将生成pandoc以下代码:tex

The arguments of the function are:

\begin{description}
\item[\lstinline!foo!] 
Name of the file
\item[\lstinline!bar!]
Permissions
\end{description}

当然,当 latex 编译它时,它会阻塞(奇怪的是,它不会产生编译错误,但是在生成的 pdf 中,定义的术语消失了,并且它们后来出现,全部覆盖在同一个位置,首先\item在下一个中itemize)。

我的问题是(按优先顺序排列):

  1. 是否有某种方法可以重新定义\item\lstinline以便上述工作无需更改生成的tex代码?
  2. 如果没有,是否可以定义其他命令来代替\item(例如\lstitem),这将产生由 排版(和语法突出显示)的定义术语listings。在第二种情况下,我将编写一个脚本,tex在文件中搜索内容\item[\lstinline!.*!]并将其替换为\lstitem{.*}

答案1

您可以重新定义\item,以便它读取[ ]水平框之间的内容,该框可以逐字保存。为此,您需要扫描开头[,启动框存储过程并创建一个活动字符(即像宏一样),该字符添加框的结尾,并使用框作为参数]调用原始内容。\item

如果您需要进一步帮助来理解代码,请告诉我。

\documentclass{article}

\usepackage{listings}

\makeatletter
\let\orig@item\item

\def\item{%
    \@ifnextchar{[}%
        {\lstinline@item}%
        {\orig@item}%
}

\begingroup
\catcode`\]=\active
\gdef\lstinline@item[{%
    \setbox0\hbox\bgroup
        \catcode`\]=\active
        \let]\lstinline@item@end
}
\endgroup

\def\lstinline@item@end{%
    \egroup
    \orig@item[\usebox0]%
}

\makeatother

\begin{document}

The arguments of the function are:

\begin{description}
\item[\lstinline!foo!]
    Name of the file \\[1cm] % other [ ] still work as normal!
    something
\item[\lstinline!bar!]
Permissions
\item[\lstinline!%^$]_!]
verbatim
%\item[\lstinline!stuff! {doesn't work[]}]
%No other ] allowed in the argument
\end{description}

\end{document}

答案2

如果您对新命令感到满意,以下是我现在正在使用的东西(受到上一个答案的启发):

\newcommand*{\lstitem}[1]{
  \setbox0\hbox{\lstinline{#1}}  
  \item[\usebox0]  
  % \item[\hbox{\lstinline{#1}}]
  \hfill \\
}

\begin{description}
\lstitem{sleep} Waits some time
\end{description}

我不知道为什么未注释的部分不起作用。但目前这段代码对我来说是可行的。欢迎改进。

相关内容