
Я рассматриваю возможность использования опции командной строки -output-directory=<some/path>
, чтобы временные файлы не засоряли мой рабочий каталог, но были доступны для последующих сборок. Это также устранит множество ненужных действий Dropbox.
Однако я также создаю некоторые собственные временные файлы, поэтому хотел бы иметь возможность получить доступ к тому, что output-directory
было указано в командной строке.
Итак, как мне задать значение макроса в приведенном ниже MWE, \OuptutDirectory
чтобы я мог правильно определить имена моих временных файлов?
Использованная литература:
- Не позволяйте pdflatex записывать кучу файлов
- Есть ли способ настроить pdflatex так, чтобы сделать все файлы, кроме .tex и .pdf, скрытыми?
Сопутствующий вопрос:
Код:
\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 не обязательно ищет в выходном каталоге)
Похожие ответы:
- Если вам нужно только прочитать файл из TeX (вместо внешней команды), то работает обычный
\file_get:nnN
или\input
. - Если выходной каталог находится в переменной среды (см.этот комментарий), вам не нужно передавать выходной каталог в команде, также возможнопрочитать переменную окружения напрямую.
- Для LuaTeX есть прямое решение:Как узнать эффективный выходной каталог в Luatex?
- Жестко задайте путь для записи файла и путь для чтения файла (требуется
openout_any=a
переменная окружения) - Использовать
scontents
, чтобы вам вообще не понадобился временный файл, см.https://tex.stackexchange.com/a/513810/250119