アンダースコアを含む文字列をファイル名と印刷文字列の両方として使用するにはどうすればよいですか?

アンダースコアを含む文字列をファイル名と印刷文字列の両方として使用するにはどうすればよいですか?

以下のコードでは、 の 2 番目の引数は\examplecodeファイル名とフレームのタイトルの両方を同時に表しています。ファイル名にアンダースコアが含まれていると失敗します。

\documentclass[a4paper,10pt,openany]{scrbook}

\usepackage{minted}
\usepackage{mdframed}

\newcommand{\examplecode}[2]
{
    \mdfsetup{frametitle={\colorbox{white}{\space #2 \space}}}

    \begin{mdframed}

    \inputminted[linenos,fontsize=\footnotesize,baselinestretch=.7]{#1}{src/#2}
    \end{mdframed}
}

\begin{document}

\examplecode{c}{testfile.c}    % ok
\examplecode{c}{test_file.c}   % error

\end{document}

これら両方の目的に使用できるように #2 をどのように処理すればよいでしょうか?

答え1

テキスト モードで使用できないため、コードは失敗します。最も簡単な解決策は、コマンド内でローカルに_再定義することです。\_

\newcommand{\examplecode}[2]{
    \mdfsetup{frametitle={\colorbox{white}{\space #2 \space}}}
    \begin{mdframed}
        \def\_{_}
        \inputminted[linenos,fontsize=\footnotesize,baselinestretch=.7]{#1}{src/#2}
    \end{mdframed}
}

それを呼び出しで使用します:

\examplecode{c}{text\_file.c}

答え2

私がこれを実行した別の方法は、次のようにファイル名引数を別の中括弧で囲むことです。

\inputminted[linenos,fontsize=\footnotesize,baselinestretch=.7]{#1}{{src/#2}}

関連情報