Valor de acesso de -output-directory

Valor de acesso de -output-directory

Estou pensando em usar a opção de linha de comando -output-directory=<some/path>para que os arquivos temporários não obstruam meu diretório de trabalho, mas também estejam disponíveis para compilações subsequentes. Isso também eliminará muitas atividades desnecessárias do Dropbox.

No entanto, eu também produzo alguns arquivos temporários, então gostaria de poder acessar o que output-directoryfoi especificado na linha de comando.

Então, no MWE abaixo, como defino o valor da macro \OuptutDirectorypara poder determinar corretamente os nomes dos meus arquivos temporários?

Referências:

Pergunta relacionada:

Código:

\documentclass[a4paper]{article}

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

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

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

Responder1

Eu configurei, em um diretório de trabalho, o arquivo a.texcontendo

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

\immediate\write\test{Hello}

\bye

Criei um tempsubdiretório e chamei

pdftex -output-dir=temp a

e o temp.txtarquivo foi criado no tempdiretório:

> ls -R .
a.tex   temp/

./temp:
a.log       temp.txt

Não há nenhuma variável que possa ser acessada de dentro pdftexque contenha o caminho do diretório de saída, até onde eu sei.

Claro que você pode emulá-lo passando a definição \OutputDirectoryna linha de comando:

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

Responder2

Nova solução a partir do TeX Live 2024 ( $TEXMF_OUTPUT_DIRECTORY)

Basta acessar a variável de ambiente chamada $TEXMF_OUTPUT_DIRECTORY. Usar sys_get_shell:https://tex.stackexchange.com/a/62032/250119. Crédito:https://tex.stackexchange.com/a/707351/250119.


Solução usandocurrfile-abspath

Usando currfile-abspathdetalhado emhttps://tex.stackexchange.com/a/54894/250119 (veja a nota sobre -recorderflag), é possível usar \currfileabsdirpara obter o diretório de saída, usando os fatos que

  • Escrever em um arquivo irá gravá-lo no diretório de saída por padrão
  • \inputpesquisas no atual -output-directoryprimeiro
%! 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}

No entanto, requer um arquivo temporário.

Observaçãoque se em uma compilação houver -recorder, então na compilação seguinte não há -recorder, acho que é impossível detectar a mudança -
currfile-abspatho pacote também erra.
Tentar gravar \jobname.flspode causar alguma coisa, mas no Windows acho que várias gravações no mesmo arquivo não são permitidas.
Uma opção é randomizar o nome do arquivo, mas isso não funciona no MiKTeX (arquivo do gravador não atualizado online) e sobrecarrega o sistema de arquivos.

Observaçãoque você pode querer renomear test.texpara algo suficientemente obscuro e possivelmente verificar se o arquivo existe antes de escrever. Se você não tomar cuidado, poderá sobrescrever algum arquivo importante.


Alternativa de uso pspara obter argumentos de linha de comando do processo atual

(devido a algum problema de permissão, isso não funciona no Overleaf, mas deve funcionar na maioria dos sistemas POSIX)

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

Em seguida, \l_data_tlconsista na linha de comando do processo TeX (por exemplo, pdflatex --output-directory=/a/b/c main.tex), mas observe que todos os caracteres terão "outros" catcode incluindo espaços.

A partir disso, analisar a string para obter o diretório de saída é um exercício padrão. Observe que o sinalizador relevante pode ser escrito como...

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

Pelo que sei, essas são todas as variantes (todos os prefixos maiores output-directoryou iguais a output-dsão aceitos), embora eu não tenha verificado, por exemplo texdoc pdftex-changes.


Outra alternativa de uso findpara procurar o arquivo de log

Referir-seA resposta de David Carlisle. Não recomendado.


Outra alternativa

(completamente não testado)

se você não tiver -recorder, primeiro escreva o arquivo e depois consulteComo obter o caminho absoluto de um arquivo(ou talvez file_get_full_namefuncione em expl3, não tenho certeza) para obter o caminho do arquivo. (embora isso possa falhar, o diretório de saída não é necessariamente pesquisado por kpsequal)


Respostas relacionadas:

informação relacionada