Valor de acceso de -directorio-salida

Valor de acceso de -directorio-salida

Estoy considerando usar la opción de línea de comando -output-directory=<some/path>para que los archivos temporales no obstruyan mi directorio de trabajo pero también estén disponibles para compilaciones posteriores. Esto también eliminará mucha actividad innecesaria de Dropbox.

Sin embargo, también produzco algunos archivos temporales propios, por lo que me gustaría poder acceder a lo que output-directoryse especificó en la línea de comando.

Entonces, en el MWE a continuación, ¿cómo configuro el valor de la macro \OuptutDirectorypara poder determinar correctamente los nombres de mis archivos temporales?

Referencias:

Pregunta 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}

Respuesta1

Configuré, en un directorio de trabajo, el archivo a.texque contiene

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

\immediate\write\test{Hello}

\bye

Creé un tempsubdirectorio y llamé

pdftex -output-dir=temp a

y el temp.txtarchivo fue creado en el tempdirectorio:

> ls -R .
a.tex   temp/

./temp:
a.log       temp.txt

pdftexHasta donde yo sé, no hay ninguna variable a la que se pueda acceder desde dentro que contenga la ruta del directorio de salida.

Por supuesto, puedes emularlo pasando la definición de \OutputDirectorydesde la línea de comando:

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

Respuesta2

Nueva solución a partir de TeX Live 2024 ( $TEXMF_OUTPUT_DIRECTORY)

Simplemente acceda a la variable de entorno denominada $TEXMF_OUTPUT_DIRECTORY. Usar sys_get_shell:https://tex.stackexchange.com/a/62032/250119. Crédito:https://tex.stackexchange.com/a/707351/250119.


Solución usandocurrfile-abspath

Utilizando currfile-abspathlo detallado enhttps://tex.stackexchange.com/a/54894/250119 (consulte la nota sobre -recorderla bandera), es posible usarlo \currfileabsdirpara obtener el directorio de salida, utilizando los hechos que

  • Escribir en un archivo lo escribirá en el directorio de salida de forma predeterminada
  • \inputbusca en el actual -output-directoryprimero
%! 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}

Sin embargo, requiere un archivo temporal.

Notaque si en una compilación hay -recorder, entonces en la siguiente compilación no hay -recorder, creo que es imposible detectar el cambio;
currfile-abspathel paquete también se equivoca.
Intentar escribir \jobname.flspodría lograr algo, pero en Windows creo que no se permiten escrituras múltiples en el mismo archivo.
Una opción es aleatorizar el nombre del archivo, pero eso no funciona en MiKTeX (el archivo de la grabadora no se actualiza en línea) y satura el sistema de archivos.

NotaEs posible que desee cambiarle el nombre test.texa algo lo suficientemente oscuro y posiblemente verificar si el archivo existe antes de escribirlo. Si no tiene cuidado, podría sobrescribir algún archivo importante.


Uso alternativo pspara obtener los argumentos de la línea de comandos del proceso actual

(debido a algún problema de permisos, esto no funciona en el dorso, pero debería funcionar en la mayoría de los 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

Luego, \l_data_tlconste de la línea de comandos del proceso TeX (por ejemplo pdflatex --output-directory=/a/b/c main.tex), pero tenga en cuenta que todos los caracteres tendrán "otro" código cat, incluidos los espacios.

A partir de esto, analizar la cadena para obtener el directorio de salida es un ejercicio estándar. Tenga en cuenta que la bandera relevante podría escribirse como...

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

Por lo que puedo decir, estas son todas las variantes (se aceptan todos los prefijos output-directorymayores o iguales a output-d), aunque no lo he comprobado, por ejemplo, con texdoc pdftex-changes.


Otra alternativa findpara buscar el archivo de registro.

Referirse aLa respuesta de David Carlisle. No recomendado.


Otra alternativa

(completamente no probado)

Si no lo tiene -recorder, primero escriba el archivo y luego consulteCómo obtener la ruta absoluta de un archivo(o tal vez file_get_full_namefuncione en expl3, no estoy seguro) para obtener la ruta del archivo. (aunque esto puede fallar, kpse Which no necesariamente busca en el directorio de salida)


Respuestas relacionadas:

información relacionada