Como posso fazer a \lstinputlisting
busca por arquivos em um determinado diretório? Estou pensando em uma solução nos moldes da solução paraessa questão.
Eu gostaria de ter uma solução como
\lstinputpath{/some/path/in/the/system}
\lstinputlisting{file.ext}
onde file.ext
reside em /some/path/in/the/system
. Tentei procurar essa solução sem sorte. Descobri que dentro da definição dos \lstinputlistings
autores usa-se um arquivo \lst@inputpath
. No entanto, uma modificação ingénua desta macro não produz quaisquer resultados.
Responder1
O listings
pacote fornece uma chave chamada inputpath
para especificar um caminho onde \lstinputlisting
deve-se procurar os arquivos fonte. Observe que isso inputpath
está documentado apenas no listings
guia do desenvolvedor,nãono manual do usuário; se você não compilou o guia do desenvolvedor, procure por "inputpath" emlistagens.dtxo levará à definição da inputpath
chave. Para usar o último, basta escrever
\lstset{inputpath=<path-in-question>}
em algum lugar do seu documento (não necessariamente no seu preâmbulo, mas depois de carregar listings
, é claro). Se você realmente insiste em usar uma macro semelhante a \graphicspath
, você mesmo pode definir uma \lstinputpath
macro, assim
\newcommand*\lstinputpath[1]{\lstset{inputpath=#1}}
O código abaixo pressupõe que o arquivo sample.c
reside em um subdiretório chamado test
de seu diretório de trabalho.
\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}
Responder2
A alternativa inclui o uso de \input@path
macro interna LaTeX.
Veja tambémhttps://tex.stackexchange.com/a/24827/250119,Um caminho padrão pode ser definido globalmente para \input{...} semelhante a \graphicspath{...}?.
por exemplo
\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}
Vantagem: Funciona, suporta múltiplos caminhos e não sofre da desvantagem mencionada emo comentário acima
Uma desvantagem importante que deve ser observada aqui é que o caminho de entrada é sempre anexado mesmo se o argumento fornecido contiver barras (e mesmo se começar com uma, ou seja, se for um caminho absoluto).
Desvantagem:
- Pelo que posso ver
\input@path
é uma macro interna do LaTeX, e seuoriginalo objetivo não é nem mesmo permitir que os usuários estendam os locais possíveis para\input
...? (detalhes mais tarde) - Isso só funciona porque
listings
a documentação do pacotesimplesmente aconteceuse internamente\input
para processar o arquivo internamente. Caso contrário, não funcionaria.
(a propósito, usar \active
para representar a constante 13 for \endlinechar
é o oposto do código autodocumentado.)