¿Cómo puedo hacer \lstinputlisting
para buscar archivos en un directorio determinado? Estoy pensando en una solución similar a la solución aesta pregunta.
Me gustaria tener una solucion como
\lstinputpath{/some/path/in/the/system}
\lstinputlisting{file.ext}
donde file.ext
reside en /some/path/in/the/system
. Intenté buscar esa solución sin suerte. Descubrí que dentro de la definición de \lstinputlistings
los autores se utiliza un archivo \lst@inputpath
. Sin embargo, una modificación ingenua de esta macro no produce ningún resultado.
Respuesta1
El listings
paquete proporciona una clave llamada inputpath
para especificar una ruta donde \lstinputlisting
se deben buscar los archivos fuente. Tenga en cuenta que inputpath
solo está documentado en la listings
guía del desarrollador,noen el manual de usuario; Si no ha compilado la guía del desarrollador, busque "inputpath" enlistados.dtxle llevará a la definición de la inputpath
clave. Para utilizar este último, simplemente escriba
\lstset{inputpath=<path-in-question>}
en algún lugar de su documento (no necesariamente en su preámbulo, pero sí después de cargarlo listings
, por supuesto). Si realmente insistes en usar una macro similar a \graphicspath
, puedes definir una \lstinputpath
macro tú mismo, así
\newcommand*\lstinputpath[1]{\lstset{inputpath=#1}}
El siguiente código supone que el archivo sample.c
reside en un subdirectorio llamado test
de su directorio de trabajo.
\documentclass{article}
\usepackage{listings}
\newcommand*\lstinputpath[1]{\lstset{inputpath=#1}}
\lstinputpath{test}
\begin{document}
\lstinputlisting[
language = C,
basicstyle = \ttfamily,
frame = single,
caption = {Hello world in C},
]{sample.c}
\end{document}
Respuesta2
La alternativa incluye el uso de \input@path
una macro interna de LaTeX.
Ver tambiénhttps://tex.stackexchange.com/a/24827/250119,¿Se puede establecer una ruta predeterminada globalmente para \input{...} similar a \graphicspath{...}?.
p.ej
\documentclass{article}
\usepackage{listings}
\makeatletter
\def\input@path{{SubFolder/}}
\makeatother
\begin{document}
\lstinputlisting[
language = C,
basicstyle = \ttfamily,
frame = single,
caption = {Hello world in C},
]{SubTest.tex}
\end{document}
Ventaja: Funciona, admite múltiples rutas y no sufre la desventaja mencionada enel comentario de arriba
Un inconveniente importante que se debe tener en cuenta aquí es que la ruta de entrada siempre se antepone incluso si el argumento proporcionado contiene barras (e incluso si comienza con una, es decir, si es una ruta absoluta).
Desventaja:
- Por lo que puedo ver
\input@path
es una macro interna de LaTeX, y suoriginal¿El propósito ni siquiera es permitir a los usuarios ampliar las posibles ubicaciones para\input
...? (detalles más adelante) - Esto sólo funciona porque
listings
la documentación del paquetesimplemente le pasa auso interno\input
para procesar el archivo internamente. De lo contrario no funcionaría.
(por cierto, usar \active
para representar la constante 13 for \endlinechar
es lo opuesto al código autodocumentado).