-output-directory의 액세스 값

-output-directory의 액세스 값

-output-directory=<some/path>임시 파일이 작업 디렉터리를 방해하지 않고 후속 빌드에도 사용할 수 있도록 명령줄 옵션을 사용하는 것을 고려하고 있습니다 . 이렇게 하면 불필요한 Dropbox 활동도 많이 제거됩니다.

output-directory그러나 나는 또한 내 자신의 일부 임시 파일을 생성하므로 명령줄에 지정된 파일에 액세스할 수 있기를 원합니다 .

\OuptutDirectory그렇다면 아래 MWE에서 임시 파일의 이름을 올바르게 확인할 수 있도록 매크로 값을 어떻게 설정해야 합니까 ?

참고자료:

관련 질문:

암호:

\documentclass[a4paper]{article}

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

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

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

답변1

나는 작업 디렉토리에 다음을 a.tex포함하는 파일을 설정했습니다.

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

\immediate\write\test{Hello}

\bye

하위 디렉토리를 만들고 temp전화했습니다.

pdftex -output-dir=temp a

파일 은 다음 디렉토리 temp.txt에 생성되었습니다 temp.

> ls -R .
a.tex   temp/

./temp:
a.log       temp.txt

pdftex내가 아는 한 출력 디렉터리 경로를 포함하는 내부에서 액세스할 수 있는 변수는 없습니다 .

물론 \OutputDirectory명령줄에서 정의를 전달하여 이를 에뮬레이트할 수 있습니다.

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

답변2

TeX Live 2024부터 시작되는 새로운 솔루션( $TEXMF_OUTPUT_DIRECTORY)

이름이 지정된 환경 변수에 액세스하면 됩니다 $TEXMF_OUTPUT_DIRECTORY. 사용 sys_get_shell:https://tex.stackexchange.com/a/62032/250119. 신용 거래:https://tex.stackexchange.com/a/707351/250119.


사용하는 솔루션currfile-abspath

currfile-abspath자세히 사용하기https://tex.stackexchange.com/a/54894/250119 (플래그에 관한 참고 사항 참조 ) 다음 사실을 사용하여 출력 디렉토리를 얻는 데 -recorder사용할 수 있습니다 .\currfileabsdir

  • 파일에 쓰면 기본적으로 출력 디렉터리에 기록됩니다.
  • \input현재 -output-directory먼저 검색
%! 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}

그러나 임시 파일이 필요합니다.

메모한 컴파일에 가 있으면 -recorder다음 컴파일에는 가 없으며 -recorder변경 사항을 감지하는 것이 불가능하다고 생각합니다.
currfile-abspath패키지도 잘못되었습니다.
쓰기를 시도하면 \jobname.fls뭔가 할 수 있지만 Windows에서는 동일한 파일에 여러 번 쓰기가 허용되지 않는 것 같습니다.
한 가지 옵션은 파일 이름을 무작위로 지정하는 것이지만 MiKTeX에서는 작동하지 않으며(레코더 파일은 온라인으로 업데이트되지 않음) 파일 시스템을 복잡하게 만듭니다.

메모충분히 모호한 이름으로 이름을 바꾸고 test.tex쓰기 전에 파일이 존재하는지 확인할 수도 있습니다. 주의하지 않으면 중요한 파일을 덮어쓸 수도 있습니다.


ps현재 프로세스의 명령줄 인수를 가져오는 데 사용하는 대체 방법

(일부 권한 문제로 인해 Overleaf에서는 작동하지 않지만 대부분의 POSIX 시스템에서는 작동합니다)

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

그런 다음 \l_data_tlTeX 프로세스의 명령줄(예: pdflatex --output-directory=/a/b/c main.tex)로 구성되지만 모든 문자에는 공백을 포함한 "기타" catcode가 포함됩니다.

여기서 출력 디렉터리를 얻기 위해 문자열을 구문 분석하는 것이 표준 연습입니다. 관련 플래그는 다음과 같이 작성될 수 있습니다.

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

내가 알 수 있는 한 이것들은 모든 변형입니다( output-directory보다 길거나 같은 모든 접두사는 output-d허용됩니다). 예를 들어 확인하지는 않았습니다 texdoc pdftex-changes.


find로그 파일을 찾는 데 사용하는 또 다른 대안

인용하다데이비드 칼라일의 답변. 권장되지 않습니다.


또 다른 대안

(완전히 테스트되지 않음)

없으면 -recorder먼저 파일을 작성한 후 참조하세요.파일의 절대 경로를 얻는 방법(또는 file_get_full_nameexpl3의 기능일 수도 있습니다. 확실하지 않습니다.) 파일 경로를 가져옵니다. (실패할 수도 있지만 kpsewhich로 출력 디렉터리를 반드시 검색할 필요는 없습니다.)


관련 답변:

관련 정보