
문서 내에서 변수를 정의하고 나중에 해당 값을 검색하는 데 권장되는 방법은 무엇입니까?
나는 일반적으로 약 10줄 길이의 여러 가지 솔루션을 검색했습니다. 다음과 같은 작업을 수행하는 더 짧은 방법이 있어야 하는지 궁금합니다(의사 코드).
\setvalue(VARIABLE1){foo foo bar}
그리고 나중에 문서에서
$\getvalue(VARIABLE1)$.
새 명령 정의를 포함하는 솔루션도 보았지만 해당 명령이 이미 다른 패키지 내에서 사용된 경우에는 어떻게 될까요? 그것은 실제로 독립적인 해결책처럼 보이지 않습니다.
답변1
글쎄, 나는 그것이 당신이 원하는 것이 아니라는 것을 알고 있지만 표준 경로는 a def
또는 newcommand
. 당신이 다룬 문제는 전역 네임스페이스입니다. 이를 사용하면 newcommand
명령이 이미 설정되어 있는지(잘못된 시도의 이름을 지정하는 컴파일 오류로) 알려주므로 newcommand
이러한 문제로부터 사용자를 보호할 수 있습니다.
% Set your new variable. In this case it will be
% called "\MyNewVariable" and the value will be "hello".
\newcommand{\MyNewVariable}{hello}
% Use to get the variable.
\MyNewVariable
이름이나 다른 니모닉을 앞에 붙일 수 있다면 충돌이 발생할 가능성이 거의 없습니다. 그러면 이 니모닉은 자신의 (일종의) 네임스페이스처럼 작동합니다.
변수의 첫 번째 인스턴스가 newcommand
오류 없이 a로 설정되었다고 가정하면 renewcommand
나중에 해당 변수를 변경하는 데 a를 사용할 수 있습니다.
답변2
키-값 시스템을 찾고 있는 것 같습니다. 제가 제안해도 될까요 pgfkeys
? 각 변수에 대한 속성을 사용하는 Yiannis의 아이디어를 포함하여 다음과 같이 수행합니다.
\documentclass{article}
\usepackage{pgfkeys}
\newcommand{\setvalue}[1]{\pgfkeys{/variables/#1}}
\newcommand{\getvalue}[1]{\pgfkeysvalueof{/variables/#1}}
\newcommand{\declare}[1]{%
\pgfkeys{
/variables/#1.is family,
/variables/#1.unknown/.style = {\pgfkeyscurrentpath/\pgfkeyscurrentname/.initial = ##1}
}%
}
\declare{}
\begin{document}
\setvalue{VARIABLE1 = foo foo bar}
\getvalue{VARIABLE1}
\declare{test/}
\setvalue{test/property = 12}
\getvalue{test/property}
\end{document}
중괄호만 있는 줄까지 포함하면 10줄 미만입니다. 작업은 매우 간단합니다. pgfkeys
변수를 "디렉토리"에 "파일"로 저장합니다. 나는 당신의 것이 디렉토리에 있어야 한다고 결정했습니다 /variables
.~ 아니다전역 네임스페이스에 있습니다. (그런데 pgfkeys
키는 일반 매크로 이름과 절대 충돌하지 않으므로 "전역 네임스페이스"는 매크로 네임스페이스와 다릅니다.)
매크로 \setvalue
는 디렉토리를 적절하게 변경한 다음 할당을 호출합니다. 매크로 \getvalue
는 올바른 디렉토리에서 변수를 검색합니다.
유일한 비결은 에서 pgfkeys
키를 할당하기 전에 키를 "알려야" 하거나 그렇지 않으면 키를 로 호출해야 한다는 것입니다 key/.initial = value
. 나는 여러분에게 그것을 작성하도록 강요하고 싶지 않기 때문에 이 코드 조각을 뒤에서 추가하는 알 수 없는 변수에 대한 "처리기"를 만들었습니다.
를 사용하여 속성이 있는 변수를 선언한 다음 에서 변수 이름으로 \declare{variable/}
사용할 수 있습니다 ( 기본 디렉터리로 사용할 수도 있으므로 다음과 같이 작성합니다).variable/property
\setvalue
variable/
\setvalue{variable, property 1 = value 1, property 2 = value 2}
편리합니다). 매크로 \declare
는 단지 "디렉토리"에 대해 알 수 없는 처리기를 설정합니다. /variables/variable/
즉, \declare{}
시작 부분의 비밀스러운 줄이 디렉터리 자체를 설정한다는 의미입니다 /variables/
.
답변3
나는 오히려 일종의 Lisp 방식이나 객체 지향 방식을 사용하여 정의하고 싶습니다.
아래의 최소값에서는 다음을 사용합니다.
\setproperty{test}{aproperty}{12}
\getproperty{test}{aproperty}
이를 나타내는 것으로 생각하십시오 test.aproperty
(실제로는 a 로 정의함 test@paproperty
). 이렇게 하면 사용자 자신의 명령 외에 기존 명령과 충돌할 가능성이 거의 없습니다.
최소한의 것:
\documentclass{article}
\makeatletter
% Properties a la Lisp.
\def\ece#1#2{\expandafter#1\csname#2\endcsname}%
% \setproperty{ATOM}{PROPNAME}{VALUE} defines the property PROPNAME on the
% ``atom'' ATOM to have VALUE.
%
\def\setproperty#1#2#3{\ece\protected@edef{#1@p#2}{#3}}%
\def\setpropertyglobal#1#2#3{\ece\protected@xdef{#1@p#2}{#3}}%
%
%
% \getproperty{ATOM}{PROPNAME} expands to the value of the property
% PROPNAME on ATOM, or to nothing (i.e., \empty), if the property isn't
% present.
%
\def\getproperty#1#2{%
\expandafter\ifx\csname#1@p#2\endcsname\relax
% then \empty
\else \csname#1@p#2\endcsname
\fi
}%
%
\makeatother
\begin{document}
\setproperty{test}{aproperty}{12}
\getproperty{test}{aproperty}
\end{document}
답변4
귀하의 코드는 거의 유효한 ConTeXt입니다. 다음을 사용하여 변수를 정의합니다.
\setvalue{variable1}{value}
다음을 사용하여 그 가치를 얻을 수 있습니다.
\getvalue{variable1}
(이것은 LaTeX와 유사합니다. \@namedef
) \@nameuse
키-값 기반 변수를 원하는 경우 다음을 사용할 수 있습니다.
\definenamespace
[VAR]
[
name=VAR,
setup=list,
command=list,
parent=VAR,
]
\setupVAR
[a={default A},
b={default B}]
\defineVAR
[set1]
[a={set1 A},
c={set1 C}]
\defineVAR
[set2]
[b={set2 B},
c={set2 C}]
\starttext
\startlines
\namedVARparameter{set1}{a} % gives set1 A
\namedVARparameter{set1}{b} % gives default B
\namedVARparameter{set1}{c} % gives set1 C
\stoplines
\stoptext