외부 데이터 상호 참조

외부 데이터 상호 참조

외부 데이터를 참조하는 데 사용할 수 있는 기존 모듈이 있습니까? 예를 들어 분석 결과를 일종의 라이브러리에 추가하고 텍스트 전체에서 사용할 수 있는 인용 키를 제공하고 싶습니다. 인용 키를 사용하여 실수/일관성 문제를 방지하고 분석이 수정되는 경우 원고 전체의 데이터를 신속하게 업데이트할 수 있다는 아이디어입니다.

답변1

myData.txt예를 들어 다음 내용이 포함된 외부 파일을 제공하겠습니다 .

% Content of myData.txt
\newcommand{\myVariablePi}{3.14} 
\newcommand{\myVariableEuler}{2.71} 

기본 문서에서 를 사용하여 이 파일을 가져올 수 있습니다 \input{myData.txt}. 그런 다음 \myVariablePi문서에서 변수로 사용할 수 있습니다 .

참고 사항 1:변수 뒤에 공백을 두거나 패키지를 사용하려면 끝에 \myVariablePi{}( ) 가 필요할 수 있습니다 .{}xspace

참고 사항 2:변수를 업데이트한 후에도 귀하의 진술이 여전히 유효한지 확인하세요 :).

답변2

주석에 비추어 다음을 수행할 수 있습니다. my-variables.sty예를 들어 다음을 포함하는 파일을 만듭니다.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{my-variables}
\RequirePackage{siunitx}

% Commands for setting and getting variables
\newcommand{\setvariable}[2]{
    \expandafter\def\csname myv@riable@#1\endcsname{#2}
}
\newcommand{\getvariable}[1]{%
    \csname myv@riable@#1\endcsname
}

% My variable variable definitions
\setvariable{speed-of-light}{\SI{299 792 458}{m/s}}

그리고 집의 texmf-tree에 넣으세요. Linux 컴퓨터의 경우 이는 ~/texmf/tex/latex/local. kpsewhich -var-value TEXMFHOME터미널에서 실행하여 올바른 디렉토리를 찾아야 합니다 .

이제 다음 tex 파일을 작성하여 "라이브러리"를 활용할 수 있습니다.

\documentclass{article}
\usepackage{my-variables}
\begin{document}
    The speed of light is \getvariable{speed-of-light}.
\end{document}

파일에 저장된 빛의 속도가 정확해야 합니다 my-variables.sty.

참고 사항:라이브러리 파일에서 읽은 모든 변수를 강조표시한다고 가정해 보세요. 내가 상상할 수 있는 이에 대한 사용 사례는 문서를 빠르게 훑어보고 라이브러리에서 모든 수량을 실제로 읽었는지 확인하려는 것입니다. 내가 제안한 솔루션을 사용하면 다음과 같이 할 수 있습니다.

\renewcommand{\getvariable}[1]{%
    \colorbox{yellow!50}{\csname myv@riable@#1\endcsname}
}

또는 방정식을 강조하기 위해 무엇을 하든 상관없습니다.

답변3

자세히 설명하기부바야의 솔루션 오타 등으로 인해 실수로 정의되지 않은 값을 얻으려고 하거나 이미 정의된 값을 정의하려고 시도하는 경우 약간의 오류 관리를 추가할 수 있습니다.

값을 설정하고 검색하는 매크로가 있는 곳에 코드를 넣었습니다.한정된이름이 다음과 같은 .sty 파일로 자체적으로SetValues.sty.
이 매크로가 있는 곳에 코드를 넣었습니다.사용된이름이 다음과 같은 다른 .sty 파일에 값을 설정하는 경우MyValues.sty.

아래 예제를 컴파일하면 -environments로 인해 이러한 .sty 파일이 자동으로 생성됩니다 filecontents*.

원하는 경우 두 개의 .sty 파일을 병합할 수 있습니다.

다른 프로젝트 및 다른 값 집합에도 이러한 매크로를 사용하고 싶을 수도 있기 때문에 그렇게 하지 않았습니다. ;-)

\documentclass{article}

% Let LaTeX create the file SetValues.sty in case it does not already exist
% on the system:
\begin{filecontents*}{SetValues.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{SetValues}
\newcommand\SetValues@Exchange[2]{#2#1}%
\newcommand\SetValues@Name{}%
\long\def\SetValues@Name#1#{\romannumeral0\SetValues@@Name{#1}}%
\newcommand\SetValues@@Name[2]{%
  \expandafter\SetValues@Exchange\expandafter{\csname#2\endcsname}{ #1}%
}%
\DeclareRobustCommand\GetValue[1]{%
  \@ifundefined{SetValues@@@#1}%
               {%
                 \SetValues@UndefText
                 \GenericError{\space\@spaces\@spaces}%
                   {Error: Value `#1' not defined}%
                   {Source for further information on this error is neither available nor needed.}%
                   {It was attempted to obtain a value with name `#1'\MessageBreak%
                    although such a value is not defined.\MessageBreak%
                    Either the intended value has another name (typo or the like?)\MessageBreak%
                    or it needs to be defined.%
                   }%
               }{%
                 \SetValues@Name{SetValues@@@#1}%
               }%
}%
\DeclareRobustCommand\SetValue[1]{%
  \@ifundefined{SetValues@@@#1}%
               {\SetValues@Name\newcommand*{SetValues@@@#1}}%
               {%
                 \GenericError{\space\@spaces\@spaces}%
                   {Error: Value `#1' already defined}%
                   {Source for further information on this error is neither available nor needed.}%
                   {A value with name `#1' is already defined.\MessageBreak%
                    Either choose another name for the value\MessageBreak%
                    or modify the existing definition.%
                   }%
               }%
}%
\@onlypreamble\SetValue
\AtBeginDocument{%
  \@ifpackageloaded{hyperref}{%
    \DeclareRobustCommand\SetValues@UndefText{%
      \texorpdfstring{\nfss@text{\reset@font\bfseries ??}}{??}%
    }%
  }{%
    \DeclareRobustCommand\SetValues@UndefText{%
      \nfss@text{\reset@font\bfseries ??}%
    }%
  }%
}%
\endinput
\end{filecontents*}

% Let LaTeX create the file MyValues.sty in case it does not already exist
% on the system:
\begin{filecontents*}{MyValues.sty}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{MyValues}
\RequirePackage{SetValues}
%
% At this place you can require whatever additional packages you 
% need for having LaTeX typeset your values nicely:
\RequirePackage{siunitx}
%\RequirePackage ...
%
% Now do a sequence of calls to \SetValue for defining values:
\SetValue{ApproxPi}{\num{3.1415927}}%
%\SetValue...
%
\endinput
\end{filecontents*}

%\usepackage{SetValues} % Actually you don't need to require the 
                        % SetValues-package as it is also required
                        % by the MyValues-package.
\usepackage{MyValues}

\begin{document}

$\pi$ is approximately \GetValue{ApproxPi}

\end{document}

관련 정보