¿Cómo uso una cadena como nombre de archivo y como cadena impresa cuando contiene un guión bajo?

¿Cómo uso una cadena como nombre de archivo y como cadena impresa cuando contiene un guión bajo?

En el código siguiente, el segundo argumento \examplecodees simultáneamente el nombre de un archivo y el título de un fotograma. Falla cuando el nombre del archivo contiene un guión bajo.

\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}

¿Cómo manejo el número 2 para que pueda usarse para ambos propósitos?

Respuesta1

Su código falla porque no puede usarlo _en modo texto. La solución más sencilla sería redefinir \_localmente en su comando:

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

y usarlo en la llamada:

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

Respuesta2

Otra forma en que he hecho esto es envolver el argumento del nombre del archivo entre otro par de llaves como:

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

información relacionada