我如何才能正确地将下划线传递给 \newcommand?

我如何才能正确地将下划线传递给 \newcommand?

我想用这个命令定义来简化我的代码附录:

\usepackage{listings}
% ...
\newcommand{\CodeListing}[1]{%
    \lstinputlisting[caption=#1]{#1}%
}

也就是说,标题应该是文件名。但是,标题参数和文件名参数似乎对下划线的处理方式不同。对于前者,我需要对其进行转义 ( \_),但对于后者,非转义下划线就可以正常工作。如果我只想传递一次文件名,该如何解决这个问题?

! Package Listings Error: File `spt2/my\T1\textunderscorefile(.m)' not found.

这是一个简单的例子:

\documentclass[a4paper]{scrreprt}
\usepackage{listings}
\begin{document}
\newcommand{\codelst}[1]{
    \lstinputlisting[caption=#1]{#1}
}
\codelst{/home/tim/projekt/matlab/path/save\_plot\_as.m}
\end{document}

这对于无下划线的路径来说效果很好。

答案1

这是一个很常见的问题:如果要排版下划线,则需要传递\_,这对于文件名来说并不好。解决方案:

\documentclass[a4paper]{scrreprt}
\usepackage{listings}
\newcommand{\codelst}{\begingroup
  \catcode`_=12 \docodelst}
\newcommand{\docodelst}[1]{%
  \lstinputlisting[caption=\texttt{#1}]{#1}%
  \endgroup
}
\begin{document}
\codelst{/home/tim/projekt/matlab/path/save_plot_as.m}
\end{document}

最好也\texttt{#1}这样说,以便文件名将以打字机字体打印。

这个想法是将 变成_可打印的字符,使其失去其特殊含义。诀窍在于将其更改为该论点被抓住了。

相关内容