Доступ к значению -output-directory

Доступ к значению -output-directory

Я рассматриваю возможность использования опции командной строки -output-directory=<some/path>, чтобы временные файлы не засоряли мой рабочий каталог, но были доступны для последующих сборок. Это также устранит множество ненужных действий Dropbox.

Однако я также создаю некоторые собственные временные файлы, поэтому хотел бы иметь возможность получить доступ к тому, что output-directoryбыло указано в командной строке.

Итак, как мне задать значение макроса в приведенном ниже MWE, \OuptutDirectoryчтобы я мог правильно определить имена моих временных файлов?

Использованная литература:

Сопутствующий вопрос:

Код:

\documentclass[a4paper]{article}

\def\OuptutDirectory{????}% <--- How do I determine this?

\edef\MyTempFile{\OuptutDirectory/\jobname.foo}%

\begin{document}
    My temp file is \MyTempFile.
\end{document}

решение1

Я создал в рабочем каталоге файл, a.texсодержащий

\newwrite\test
\immediate\openout\test=temp.txt

\immediate\write\test{Hello}

\bye

Я создал tempподкаталог и назвал

pdftex -output-dir=temp a

и temp.txtфайл был создан в tempкаталоге:

> ls -R .
a.tex   temp/

./temp:
a.log       temp.txt

pdftexНасколько мне известно, нет переменной, к которой можно было бы получить доступ изнутри и которая содержала бы путь к выходному каталогу.

Конечно, вы можете эмулировать это, передав определение \OutputDirectoryиз командной строки:

pdftex -output-dir=temp "\def\OutputDirectory{./temp}\input a"

решение2

Новое решение, начиная с TeX Live 2024 ( $TEXMF_OUTPUT_DIRECTORY)

Просто получите доступ к переменной среды с именем $TEXMF_OUTPUT_DIRECTORY. Используйте sys_get_shell:https://tex.stackexchange.com/a/62032/250119. Кредит:https://tex.stackexchange.com/a/707351/250119.


Решение с использованиемcurrfile-abspath

Используя currfile-abspathподробное описаниеhttps://tex.stackexchange.com/a/54894/250119 (см. примечание относительно -recorderфлага), можно использовать \currfileabsdirдля получения выходного каталога, используя тот факт, что

  • Запись в файл по умолчанию запишет его в выходной каталог.
  • \inputпоиск в текущем -output-directoryпервом
%! TEX program = xelatex
\documentclass{standalone}
\usepackage[abspath]{currfile}
\begin{document}

\ExplSyntaxOn

% write the content to a temporary file `test.tex`
\iow_new:N \myfile
\iow_open:Nn \myfile {test.tex}
\iow_now:Nn \myfile {
    \tl_set:Nx \myoutputdir {\currfileabsdir}
}
\iow_close:N \myfile

% execute the content of that file
\input {test.tex}

% print the obtained output directory path to the PDF
\texttt{\myoutputdir}

\ExplSyntaxOff


\end{document}

Однако для этого требуется временный файл.

Примечаниечто если в одной компиляции есть -recorder, то в следующей компиляции нет -recorder, я думаю, что невозможно обнаружить изменение --
currfile-abspathпакет тоже ошибается.
Попытка записи в \jobname.flsможет что-то сделать, но в Windows, я думаю, что множественная запись в один и тот же файл не допускается.
Один из вариантов - рандомизировать имя файла, но это не работает в MiKTeX (файл записи не обновляется онлайн) и загромождает файловую систему.

Примечаниечто вы можете захотеть переименовать test.texво что-то достаточно непонятное, и, возможно, проверить, существует ли файл перед записью. Если вы не будете осторожны, вы можете перезаписать какой-нибудь важный файл.


Альтернативное использование psдля получения аргументов командной строки текущего процесса

(из-за некоторых проблем с разрешениями это не работает на Overleaf, но в остальном должно работать на большинстве систем POSIX)

\ExplSyntaxOn
\sys_get_shell:nnN {ps~-o~args=~-p~$(ps~-o~ppid=~-p~$$)} {\cctab_select:N \c_other_cctab} \l_data_tl
\ExplSyntaxOff

Затем \l_data_tlвведите командную строку процесса TeX (например, pdflatex --output-directory=/a/b/c main.tex), но обратите внимание, что все символы будут иметь «другой» код, включая пробелы.

Отсюда разбор строки для получения выходного каталога является стандартным упражнением. Обратите внимание, что соответствующий флаг может быть записан как...

-output-d=/path
-output-d=
-output-dir=/path
--output-dir=/path
--output-directory=/path
-output-d /path
-output-directory /path
--output-directory /path

Насколько я могу судить, это все варианты (принимаются все префиксы output-directoryдлиннее или равные output-d), хотя я не проверял, например, с texdoc pdftex-changes.


Другая альтернатива, использующая findдля поиска файла журнала

Ссылаться наОтвет Дэвида Карлайла. Не рекомендуется.


Другая альтернатива

(совершенно не проверено)

если у вас нет-recorder , сначала запишите файл, а затем обратитесь кКак получить абсолютный путь к файлу(или, может быть, file_get_full_nameфункция в expl3, я не уверен) для получения пути к файлу. (хотя это может не сработать, kpsewhich не обязательно ищет в выходном каталоге)


Похожие ответы:

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