Можно ли использовать Lua для получения текущего рабочего каталога?

Можно ли использовать Lua для получения текущего рабочего каталога?

Пакет currfileс abspathопцией может получить абсолютный путь к текущему файлу. Однако он полагается на запуск pdflatexс -recorderфлагом. Можно ли достичь той же цели с помощью lualatex?

Обратите внимание, что lualatexимеет тот же набор флагов командной строки, что и pdlflatex, поэтому, естественно, currfileбудет работать в lualatexтак же, как и в pdflatex. Задача состоит в том, чтобы использовать luaдля извлечения информации о текущей папке в текстебезопираясь на -recorderфлаг.

решение1

Опять давление со стороны сверстников.:)

IIRC, чистый Lua не имеет встроенного способа узнать текущий рабочий каталог, не прибегая к уловкам. К счастью, LuaTeX поставляется с удивительнымLuaFileSystem, который является«библиотека, разработанная для дополнения набора функций, связанных с файловыми системами, предлагаемых стандартным дистрибутивом Lua».

Theсправочный разделруководства LFS указывает путь достижения желаемого:

lfs.currentdir ()

Возвращает строку с текущим рабочим каталогом или nilплюс строку ошибки.

Вот и все! Теперь давайте напишем наш .texфайл на основе этой идеи:

\documentclass{article}

\edef\workingdir{\unexpanded\expandafter{\directlua{tex.write(lfs.currentdir())}}}

\begin{document}

Hello, I'm in \workingdir

\texttt{\meaning\workingdir}

\end{document}

Спасибо egreg за предоставление \edefверсии вместо моего первоначального \newcommandподхода; таким образом, можно избежать проблем со специальными символами в пути, а если поместить его в преамбулу основного документа, значение не изменится при \workingdirиспользовании в \inputфайле.

Вот пример вывода с моей машины:

Крякать

Вот и всё!:)

Обновлять:Если мы не хотим «замораживать» значение рабочего каталога, я полагаю, мы можем положиться на мою первую попытку, используя \newcommandвместо использования \edef:

\newcommand{\actualworkingdir}{%
\unexpanded\expandafter{\directlua{tex.write(lfs.currentdir())}}}

Таким образом, lfs.currentdir()всегда выдается по требованию. Пожалуйста, имейте в виду, что разница между этими двумя подходами довольно существенна:

Крякать

Связанный контент