![Есть ли эквивалент \graphicspath для списков?](https://rvso.com/image/286965/%D0%95%D1%81%D1%82%D1%8C%20%D0%BB%D0%B8%20%D1%8D%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%20%5Cgraphicspath%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%3F.png)
Как мне сделать так, \lstinputlisting
чтобы он искал файлы в указанном каталоге? Я думаю о решении в духе решения дляэтот вопрос.
Я хотел бы иметь такое решение
\lstinputpath{/some/path/in/the/system}
\lstinputlisting{file.ext}
где file.ext
находится в /some/path/in/the/system
. Я пытался найти такое решение, но безуспешно. Я обнаружил, что внутри определения \lstinputlistings
авторы используют \lst@inputpath
. Однако наивная модификация этого макроса не дала никаких результатов.
решение1
Пакет listings
предоставляет ключ, который называется inputpath
для указания пути, где \lstinputlisting
следует искать исходные файлы. Обратите внимание, что это inputpath
документировано только в listings
руководстве разработчика,нетв руководстве пользователя; если вы не скомпилировали руководство разработчика, найдите «inputpath» влистинги.dtxприведет вас к определению ключа inputpath
. Чтобы использовать последний, просто напишите
\lstset{inputpath=<path-in-question>}
где-то в вашем документе (не обязательно в преамбуле, но после загрузки listings
, конечно). Если вы действительно настаиваете на использовании макроса, похожего на \graphicspath
, вы можете определить \lstinputpath
макрос самостоятельно, например так
\newcommand*\lstinputpath[1]{\lstset{inputpath=#1}}
В приведенном ниже коде предполагается, что файл sample.c
находится в подкаталоге test
вашего рабочего каталога.
\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}
решение2
Альтернативой является использование \input@path
внутреннего макроса LaTeX.
Смотрите такжеhttps://tex.stackexchange.com/a/24827/250119,Можно ли задать глобальный путь по умолчанию для \input{...}, например, \graphicspath{...}?.
например
\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}
Преимущество: Он работает, поддерживает несколько путей и не страдает от недостатка, упомянутого вкомментарий выше
Здесь следует отметить один важный недостаток: входной путь всегда добавляется, даже если предоставленный аргумент содержит косые черты (и даже если он начинается с одной, т. е. если это абсолютный путь).
Недостаток:
- Насколько я вижу
\input@path
это внутренний макрос LaTeX, и егооригинальныйцель даже не в том, чтобы позволить пользователям расширять возможные местоположения для\input
...? (подробности позже) - Это работает только потому, что
listings
документация по пакетупросто случаетсявнутренне использовать\input
для внутренней обработки файла. Иначе это не сработает.
(кстати, использование \active
для представления константы 13 for \endlinechar
является противоположностью самодокументированному коду.)