Cómo crear un nuevo comando cuyo parámetro único se pueda aplicar tanto a los parámetros "caption" como a "path" de `lstinputlisting`

Cómo crear un nuevo comando cuyo parámetro único se pueda aplicar tanto a los parámetros "caption" como a "path" de `lstinputlisting`

Quiero crear un comando para simplificar el uso del comando lstinputlistingde los listados de paquetes, que puede aceptar un solo parámetro como ruta del archivo y pasarlo tanto al título como al parámetro de ruta de lstinputlisting. En una palabra, utilice la ruta del archivo como título.

Considere la siguiente fuente de LaTeX:

\documentclass[UTF8]{ctexart}
\usepackage{listings}

\newcommand{\myincludecode}[1]{\lstinputlisting[caption=#1, language=matlab]{#1}}
\newcommand{\mysecondincludecode}[2]{\lstinputlisting[caption={#2}, language=matlab]{#1}}


\begin{document}

\myincludecode{main.m}                        % line 10
\myincludecode{gen_data.m}                    % line 11

\mysecondincludecode{main.m}{main.m}          % line 13
\mysecondincludecode{gen_data.m}{gen\_data.m} % line 14

\end{document}

Claramente, los comandos en las líneas 13 y 14 funcionan bien, ya que incluyen correctamente el archivo correspondiente e imprimen los títulos correspondientes.

La línea 10 también funciona bien. Sin embargo, la línea 11 incluye el archivo correspondiente pero no genera ningún título. El archivo de registro dice:

Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Extra }, or forgotten $.
Try.tex|11 error| Missing $ inserted.
Try.tex|11 error| Missing } inserted.

Es obvio que el guión bajo descompone mi comando. Entonces, me pregunto cómo modificarlo myincludecodepara que funcione, incluso cuando encuentro algunos caracteres especiales, como el guión bajo aquí.

Respuesta1

Destokenizar el argumento:

\documentclass[UTF8]{ctexart}
\usepackage[T1]{fontenc}
\usepackage{listings}

\newcommand{\myincludecode}[1]{\lstinputlisting[caption=\detokenize{#1}, language=matlab]{#1}}

\begin{document}

\myincludecode{main.m}
\myincludecode{gen_data.m} 

\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

El mathmodeguión bajo tiene una función. Cambia el siguiente carácter a subíndice. Por eso espera una $señal. Esta es una solución simple a su problema.

\documentclass[UTF8]{ctexart}
\usepackage{listings}

\begin{document}
\begingroup
\newcommand{\myincludecode}[1]{\catcode`_=11\lstinputlisting[caption=#1, language=matlab]{#1}}
\myincludecode{main.m}
\myincludecode{gen_data.m}
\endgroup
$1_2$
\end{document}

Catcode significa código de categoría. La categoría de _es 8 que le asigna alguna función, si la cambio a 11, cambia el guión bajo a una categoría de letra, que probablemente sea lo que desea. Agregar este comando entre \begingroup& \endgrouphace que la función del subíndice esté intacta fuera de su alcance.

Respuesta3

Debe evitar "_" en los nombres de archivos y en las etiquetas de cita o referencia, o debe usar el paquete babel, con sus controles de caracteres activos, o debe dar la opción [cadenas], que intenta redefinir varios comandos (y puede no funciona perfectamente). Incluso sin la opción [cadenas] o babel, puedes usar guiones bajos ocasionales como: "\include{file\string_name}".

La operación predeterminada es bastante sencilla y no necesita personalización; pero debes evitar usar “_” en cualquier lugar donde LaTeX use un argumento como una cadena de caracteres para alguna función de control o como un nombre. Estos incluyen las etiquetas para \cite y \ref, nombres de archivos para \input, \include y \includegraphics, nombres de entorno, nombres de contadores y parámetros de ubicación (como [t]). El problema con estos contextos es que son 'argumentos en movimiento' pero LaTeX no 'activa' el "mecanismo \protect" para ellos.

Si necesita utilizar el carácter de subrayado en estos lugares, se proporciona la opción del paquete [cadenas] para redefinir los comandos que toman dicho argumento de cadena para que se aplique protección (con \protect hecho como \cadena). La lista de comandos a los que afecta esta disposición se proporciona en \UnderscoreCommands, con \do antes de cada uno; además de varios otros que cubren \input, \includegraphics, \cite, \ref y sus variantes.

Por favor mira--http://ctan.imsc.res.in/macros/latex/contrib/underscore/underscore.pdf y--Listado de un archivo con guiones bajos en su nombre/ruta

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

información relacionada