Zugriffswert von -output-directory

Zugriffswert von -output-directory

Ich überlege, die Kommandozeilenoption zu verwenden -output-directory=<some/path>, damit die temporären Dateien mein Arbeitsverzeichnis nicht verstopfen, sondern auch für nachfolgende Builds verfügbar sind. Dadurch werden auch viele unnötige Dropbox-Aktivitäten vermieden.

Ich erstelle jedoch auch einige eigene temporäre Dateien und möchte daher auf das zugreifen können, was output-directoryin der Befehlszeile angegeben wurde.

Wie lege ich also im folgenden MWE den Wert des Makros fest, \OuptutDirectorydamit ich die Namen meiner temporären Dateien richtig bestimmen kann?

Verweise:

Verwandte Frage:

Code:

\documentclass[a4paper]{article}

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

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

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

Antwort1

Ich habe in einem Arbeitsverzeichnis die Datei a.texmit

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

\immediate\write\test{Hello}

\bye

Ich habe ein tempUnterverzeichnis erstellt und es aufgerufen

pdftex -output-dir=temp a

und die temp.txtDatei wurde im tempVerzeichnis erstellt:

> ls -R .
a.tex   temp/

./temp:
a.log       temp.txt

pdftexSoweit mir bekannt ist, gibt es keine intern zugängliche Variable , die den Pfad zum Ausgabeverzeichnis enthält.

Natürlich können Sie es emulieren, indem Sie die Definition \OutputDirectoryvon der Befehlszeile übergeben:

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

Antwort2

Neue Lösung ab TeX Live 2024 ( $TEXMF_OUTPUT_DIRECTORY)

Greifen Sie einfach auf die Umgebungsvariable mit dem Namen zu $TEXMF_OUTPUT_DIRECTORY. Verwenden Sie sys_get_shell:https://tex.stackexchange.com/a/62032/250119. Kredit:https://tex.stackexchange.com/a/707351/250119.


Lösung mitcurrfile-abspath

Mit currfile-abspathdetaillierten inhttps://tex.stackexchange.com/a/54894/250119 (siehe Hinweis zum -recorderFlag), ist es möglich, \currfileabsdirdas Ausgabeverzeichnis zu erhalten, indem man die Tatsachen nutzt, dass

  • Beim Schreiben in eine Datei wird diese standardmäßig in das Ausgabeverzeichnis geschrieben
  • \inputsucht im aktuellen -output-directoryersten
%! 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}

Es ist jedoch eine temporäre Datei erforderlich.

Notizdass, wenn in einer Kompilierung vorhanden ist -recorder, in der nächsten Kompilierung kein vorhanden ist -recorder, ich denke, es ist unmöglich, die Änderung zu erkennen –
currfile-abspathdas Paket macht es auch falsch.
Der Versuch, in zu schreiben, \jobname.flskönnte etwas bewirken, aber unter Windows ist meines Erachtens mehrfaches Schreiben in dieselbe Datei nicht zulässig.
Eine Möglichkeit besteht darin, den Dateinamen zufällig zu wählen, aber das funktioniert unter MiKTeX nicht (Recorder-Datei wird nicht online aktualisiert) und führt zu einer Überlastung des Dateisystems.

Notizdass Sie die Datei möglicherweise in etwas ausreichend Unbekanntes umbenennen test.texund vor dem Schreiben möglicherweise prüfen möchten, ob sie existiert. Wenn Sie nicht vorsichtig sind, überschreiben Sie möglicherweise eine wichtige Datei.


Alternative Verwendung pszum Abrufen der Befehlszeilenargumente des aktuellen Prozesses

(aufgrund eines Berechtigungsproblems funktioniert dies nicht auf Overleaf, sollte aber ansonsten auf den meisten POSIX-Systemen funktionieren)

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

Bestehend dann \l_data_tlaus der Befehlszeile des TeX-Prozesses (z. B. pdflatex --output-directory=/a/b/c main.tex), beachten Sie jedoch, dass alle Zeichen einschließlich Leerzeichen einen „anderen“ Catcode haben.

Das Parsen der Zeichenfolge zum Abrufen des Ausgabeverzeichnisses ist eine Standardübung. Beachten Sie, dass das relevante Flag wie folgt geschrieben werden könnte:

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

Dies sind meines Wissens alle Varianten (alle Präfixe, die output-directorylänger als oder gleich sind output-d, werden akzeptiert), ich habe dies jedoch nicht bei zB überprüft texdoc pdftex-changes.


Eine weitere Alternative zur findSuche nach der Protokolldatei

Beziehen aufDavid Carlisles Antwort. Nicht empfohlen.


Eine andere Alternative

(völlig ungetestet)

Wenn Sie nicht haben -recorder, schreiben Sie zuerst die Datei und beziehen Sie sich dann aufSo erhalten Sie den absoluten Pfad einer Datei(oder vielleicht file_get_full_nameeine Funktion in expl3, ich bin nicht sicher), um den Pfad der Datei zu erhalten. (obwohl dies fehlschlagen könnte, wird das Ausgabeverzeichnis nicht unbedingt von kpsewhich durchsucht)


Ähnliche Antworten:

verwandte Informationen