
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-directory
foi especificado na linha de comando.
Então, no MWE abaixo, como defino o valor da macro \OuptutDirectory
para poder determinar corretamente os nomes dos meus arquivos temporários?
Referências:
- Impedir que o pdflatex grave vários arquivos
- Existe uma maneira de configurar o pdflatex para tornar todos os arquivos ocultos, exceto os arquivos .tex e .pdf?
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.tex
contendo
\newwrite\test
\immediate\openout\test=temp.txt
\immediate\write\test{Hello}
\bye
Criei um temp
subdiretório e chamei
pdftex -output-dir=temp a
e o temp.txt
arquivo foi criado no temp
diretório:
> ls -R .
a.tex temp/
./temp:
a.log temp.txt
Não há nenhuma variável que possa ser acessada de dentro pdftex
que contenha o caminho do diretório de saída, até onde eu sei.
Claro que você pode emulá-lo passando a definição \OutputDirectory
na 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-abspath
detalhado emhttps://tex.stackexchange.com/a/54894/250119
(veja a nota sobre -recorder
flag), é possível usar \currfileabsdir
para 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
\input
pesquisas no atual-output-directory
primeiro
%! 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-abspath
o pacote também erra.
Tentar gravar \jobname.fls
pode 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.tex
para 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 ps
para 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_tl
consista 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-directory
ou iguais a output-d
são aceitos), embora eu não tenha verificado, por exemplo texdoc pdftex-changes
.
Outra alternativa de uso find
para 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_name
funcione 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:
- Se você precisar apenas ler o arquivo do TeX (em vez de um comando externo) normal
\file_get:nnN
ou\input
funciona. - Se o diretório de saída estiver em uma variável de ambiente (consulteeste comentário), você não precisa passar o diretório de saída em um comando, também é possívelleia a variável de ambiente diretamente.
- Para LuaTeX existe uma solução direta:No Luatex, como saber o diretório de saída efetivo?
- Codifique o caminho para gravar o arquivo e o caminho para ler o arquivo (requer
openout_any=a
variável de ambiente) - Use
scontents
para que você não precise de um arquivo temporário, consultehttps://tex.stackexchange.com/a/513810/250119