![使用 lstinputlisting 定义新命令时出现问题](https://linux22.com/image/247032/%E4%BD%BF%E7%94%A8%20lstinputlisting%20%E5%AE%9A%E4%B9%89%E6%96%B0%E5%91%BD%E4%BB%A4%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
我正在尝试定义一个新命令,以便在我的文档中轻松地插入 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
(列表列表)文件中。