
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-directory
se especificó en la línea de comando.
Entonces, en el MWE a continuación, ¿cómo configuro el valor de la macro \OuptutDirectory
para poder determinar correctamente los nombres de mis archivos temporales?
Referencias:
- Evite que pdflatex escriba un montón de archivos
- ¿Hay alguna manera de configurar pdflatex para que todos los archivos, excepto los .tex y .pdf, sean archivos ocultos?
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.tex
que contiene
\newwrite\test
\immediate\openout\test=temp.txt
\immediate\write\test{Hello}
\bye
Creé un temp
subdirectorio y llamé
pdftex -output-dir=temp a
y el temp.txt
archivo fue creado en el temp
directorio:
> ls -R .
a.tex temp/
./temp:
a.log temp.txt
pdftex
Hasta 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 \OutputDirectory
desde 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-abspath
lo detallado enhttps://tex.stackexchange.com/a/54894/250119
(consulte la nota sobre -recorder
la bandera), es posible usarlo \currfileabsdir
para obtener el directorio de salida, utilizando los hechos que
- Escribir en un archivo lo escribirá en el directorio de salida de forma predeterminada
\input
busca en el actual-output-directory
primero
%! 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-abspath
el paquete también se equivoca.
Intentar escribir \jobname.fls
podrí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.tex
a 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 ps
para 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_tl
conste 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-directory
mayores o iguales a output-d
), aunque no lo he comprobado, por ejemplo, con texdoc pdftex-changes
.
Otra alternativa find
para 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_name
funcione 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:
- Si solo necesita leer el archivo desde TeX (en lugar de un comando externo) normal
\file_get:nnN
o\input
funciona. - Si el directorio de salida está en una variable de entorno (vereste comentario), no es necesario pasar el directorio de salida en un comando, también es posibleleer la variable de entorno directamente.
- Para LuaTeX hay una solución directa:En Luatex, ¿cómo saber el directorio de salida efectivo?
- Codifique tanto la ruta para escribir el archivo como la ruta para leer el archivo (requiere
openout_any=a
una variable de entorno) - Úselo
scontents
para no necesitar ningún archivo temporal; consultehttps://tex.stackexchange.com/a/513810/250119