在 lstinputlisting 命令中替换字符串

在 lstinputlisting 命令中替换字符串

listings的 package 命令\lstinputlisting对于带下划线的文件名应该具有以下语法:
\lstinputlisting[caption={a\_b.mat}]{a_b.mat}

我想自动化名称转换过程,但我停留在特殊字符_替换阶段。

命令:
\noexpandarg\StrSubstitute{a_b.mat}{_}{\_}
在文本主体内有效,但在内部停止工作\lstinputlisting

\documentclass{article}

\usepackage{filecontents} % only need to provide the file a_b.mat
\begin{filecontents*}{a_b.mat}
    a = 1;
\end{filecontents*}

\usepackage{listings}
\usepackage{xstring}

\newcommand{\mycmda}[1]{\lstinputlisting[caption={a\_b.mat}]{#1}} % WORKS
\newcommand{\mycmdb}[1]{\lstinputlisting[caption={\noexpandarg\StrSubstitute{#1}{_}{\_}}]{#1}}

\begin{document}
    \noexpandarg\StrSubstitute{a_b.mat}{_}{\_} % WORKS - PROOF OF CONCEPT
    \mycmda{a_b.mat}                           % WORKS
    %\mycmdb{a_b.mat}                            % DOES NOT WORK
\end{document}

段落在 \lst@temp 完成之前结束。\mycmdb{a_b.mat}

如何克服这个问题?

答案1

在将更改的字符串传递给之前保存它caption=

\begin{filecontents*}{a_b.mat}
    a = 1;
\end{filecontents*}

\documentclass{article}

\usepackage{listings}
\usepackage{xstring}

\newcommand{\matlablisting}[1]{%
  \begingroup\noexpandarg
  \StrSubstitute{#1}{_}{\_}[\mllcap]%
  \lstinputlisting[caption=\mllcap]{#1}%
  \endgroup
}

\begin{document}

\matlablisting{a_b.mat}

\end{document}

相关内容