aux 파일에 전역 명령 정의

aux 파일에 전역 명령 정의

나는 긴 문서를 작성하고 있는데, 내 삶을 더 쉽게 만들기 위해 매크로로 사용하는 수량을 정의하여 변경될 때 한 곳에서 업데이트하면 되는 것을 좋아합니다. 나에게는 문서에서 가장 관련성이 높은 섹션에서 이를 정의하는 것이 합리적입니다. 그러나 때로는 이 명령을 다른 장에서, 때로는 이전 장에서도 사용하고 싶을 때도 있습니다.

그러므로 나는 라텍스 파일에 명령의 정의를 뱉어내는 매크로를 추가하고 싶습니다. .aux그러면 명령이 일단 정의되면 어디에서나 사용할 수 있습니다. 지금까지 나는 이것을 얻었습니다 :

% Make a command which defines a macro with \providecommand but in the aux file,
% so it's accessible to all other chapters
\makeatletter
\newcommand{\doccommand}[2]{%
\protected@write\@auxout{}{\protect\providecommand\protect#1{#2}}%
}
\makeatother

그러면 aux 파일에 다음이 추가됩니다.

\providecommand \tester {123}

다음과 같은 장의 경우:

\chapter{Test chapter}

This is a test chapter!

Tester is \tester{}.

\doccommand{\tester}{123}

불행히도 작동하지 않습니다. 테스트 장 내에서 명령을 사용해도 "정의되지 않은 제어 순서"가 표시되고 다른 장에서도 마찬가지입니다.

원래 나는 이것이 파일에 있는 공백과 관련이 있을 수 있다고 생각했지만 .aux수동으로 제거하고 \includeonly{a_different_chapter}여전히 동일한 오류가 발생하는 로 컴파일했습니다.

무엇을 제공합니까?

업데이트:

여기의 모든 도움 덕분에 이 작업을 수행하고 작은 패키지에 작성했습니다. 관심이 있으시면 CTAN에서 찾아보실 수 있습니다.https://ctan.org/pkg/globalvals

답변1

저는 다른 전략을 사용하겠습니다. 즉, 매크로를 직접 정의하는 대신 래퍼 명령을 사용하는 것입니다.

\documentclass{article}

\makeatletter
\newcommand{\usevalue}[1]{%
  \ifcsname usevalue@#1\endcsname
    \csname usevalue@#1\endcsname
  \else
    ??%
  \fi
}
\newcommand{\definevalue}[2]{%
  \write\@auxout{%
    \unexpanded{\global\@namedef{usevalue@#1}{#2}}%
  }
}
\makeatother

\begin{document}

Something with \usevalue{tester}.

Something else.

Now we can define \texttt{tester} and use again it: \usevalue{tester}.

\definevalue{tester}{42}

\end{document}

첫 번째 실행의 출력

여기에 이미지 설명을 입력하세요

두 번째 실행의 출력

여기에 이미지 설명을 입력하세요

답변2

당신은 쓸 수 있습니다

\makeatletter
\newcommand{\doccommand}[2]{%
  \immediate\write\@auxout{\gdef\noexpand#1{\unexpanded{#2}}}%
  \gdef#1{#2}%
}
\makeatother

그러면 대체 텍스트를 확장하지 않고 전역 정의가 수행됩니다. \gdefTeX를 다시 실행하지 않고도 명령을 사용할 수 있도록 직접 추가를 추가했습니다 .

그러나 이것은 좋은 생각이 아닙니다. 명령이 정의된 지점 이전에 명령을 사용하지 않으면 aux 파일에서 명령을 정의하는 것은 쓸모가 없습니다. 정의하기 전에 명령을 사용하면 LaTeX는 aux 파일 항목을 쓰는 지점에 도달하지 않습니다.

따라서 명령을 정의했지만 사용하지 않은 상태에서 TeX을 한 번 실행한 후에만 명령을 사용할 수 있습니다. aux 파일을 삭제하면 문서가 손상됩니다. 다른 장만 포함하면 보조 파일 항목이 기록되지 않으므로 문서가 손상됩니다.

대신 프리앰프에 포함하는 정의로 별도의 파일을 만들 수 있습니다. 더 많은 작업이 필요하지만 훨씬 더 안정적인 문서가 생성됩니다.

답변3

영리한 접근 방식에 대해 @egreg에게 감사드립니다. 동일한 문서에 두 가지 정의가 작성되면 오류 메시지를 추가하기 위해 그의 코드를 약간 변경했습니다.

\documentclass{article}    

\usepackage{siunitx}

\makeatletter
\newcommand{\useVal}[1]{%
  \ifcsname useVal@#1\endcsname
    \csname useVal@#1\endcsname
  \else
    ??%
  \fi
}
\newcommand{\defVal}[2]{%
\ifcsname useVal@#1@defined\endcsname
    \PackageError{useVal}{Value "#1" already defined}{}
\else
  \write\@auxout{%
    \unexpanded{\global\@namedef{useVal@#1}{#2}}%
  }
  \global\@namedef{useVal@#1@defined}{}
\fi
}
\makeatother

\begin{document}

Testval is \useVal{testVal}.

Now defining testval...

\defVal{testVal}{\SI{123}{\meter}}

Now it's \useVal{testVal}. 

% This would throw an error:
% \defVal{testVal}{Not this please!}

\end{document}

관련 정보