我知道逐字命令的脆弱性,并且它们不应该用作另一个宏的参数,但需要编写一个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
)。
我的问题是(按优先顺序排列):
- 是否有某种方法可以重新定义
\item
,\lstinline
以便上述工作无需更改生成的tex
代码? - 如果没有,是否可以定义其他命令来代替
\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}
我不知道为什么未注释的部分不起作用。但目前这段代码对我来说是可行的。欢迎改进。