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}