使用 lstinputlisting 定义新命令时出现问题

使用 lstinputlisting 定义新命令时出现问题

我正在尝试定义一个新命令,以便在我的文档中轻松地插入 SQL 查询(来自文件)。

我是这样定义的

\newcommand{\sqlfile}[2]{\lstinputlisting[language=SQL, caption={#1}, label=#2]{../sources/#2.sql}}

然后像这样使用它

\sqlfile{Total number of users}{nb_users}

运行正常。我能够引用 SQL 文件\ref{...},并且查询已正确插入。

现在我想在查询标题中插入文件名,所以我只需在参数#2中添加即可caption

\newcommand{\sqlfile}[2]{\lstinputlisting[language=SQL, caption={#1 #2}, label=#2]{../sources/#2.sql}}

但它不起作用,我不知道为什么。

! Missing $ inserted.
<inserted text>
$
l.1072 \sqlfile{Total number of users}{nb_users}
I've inserted a begin-math/end-math symbol since I think you left one out. 
Proceed, with fingers crossed.

我尝试添加括号和其他内容,但没有成功。谢谢

答案1

虽然_在文件名中是合法的,但在普通文本中是不合法的。一个可以拯救你的技巧可能是

\newcommand{\sqlfile}[2]{%
  \lstinputlisting
    [language=SQL,
     caption={#1 \protect\detokenize{#2}},
     label=#2]
    {../sources/#2.sql}}

您还必须致电

\usepackage[T1]{fontenc}

使其工作。

\detokenize命令将改变字符的性质_,使其在普通文本中可接受。我们\protect确保该\detokenize命令也写入.lol(列表列表)文件中。

相关内容