ConTeXt: 다양한 유형의 부동 객체에서 참조 이름 충돌 방지

ConTeXt: 다양한 유형의 부동 객체에서 참조 이름 충돌 방지

나는 ConTeXt가 부동 객체의 참조를 위해 동일한 네임스페이스를 사용하는 것이 매우 짜증스럽다는 것을 알았습니다. 즉, 그림과 표에 동일한 참조를 제공하면 항상 먼저 정의된 참조를 참조하게 됩니다. 즉, 이름이 명백히 충돌합니다. 내 관점에서는 이것은 어리석은 일이다. ConTeXt Wiki에서 나는 스팸 \figure[figure:Your Reference]을 제안하는 것과 같은 해결 방법을 보았습니다. 모든 참조에 접두사를 붙이는 것이 다시 한 번 매우 짜증나는 일입니다.figure:table:

내가하고 싶은 일은 다음과 같습니다.

\let\corefigure\figure

\def
\figure{
  \dosingleargument
  \dofigure
}

\def
\dofigure[#1]{
  \corefigure[figure:#1]
}

그리고

\let\corestartplacefigure\startplacefigure

\def
\startplacefigure{
  \dotripleargument
  \dostartplacefigure
}

\def
\dostartplacefigure[#1][#2][#3]{
  # TODO: Somehow insert "figure:" into #1 after "reference="...
  \corestartplacefigure[#1][#2][#3]
}

테이블도 마찬가지일 것이다. 그렇다면 TODO일을 영리하게 이행하는 방법은 무엇입니까?

제안과 설명을 찾고 있습니다. 감사해요.

답변1

referenceprefix명령 의 키를 사용하여 각 부동 소수점 유형에 대한 접두사를 설정할 수 있습니다 \setupcation.

\setupexternalfigures[location=default]

\setupcaption[figure][referenceprefix=figure]
\setupcaption[table] [referenceprefix=table]

\starttext

\dorecurse{3}{\input knuth\par}

\startplacefigure[title=Test figure,reference=test]
  \externalfigure[cow][width=4cm]
\stopplacefigure

\dorecurse{3}{\input zapf\par}

\startplacetable[title=Test table,reference=test]
  \starttabulate[|l|l|]
  \HL
  \NC One \NC Two \NC\NR
  \NC Three \NC Four \NC\NR
  \HL
  \stoptabulate
\stopplacetable

\dorecurse{3}{\input tufte\par}

\page

This documents contains a figure on \at{page}[figure:test] and a table on \at{page}[table:test].

\stoptext

답변2

\let\figure\corefigure

\def
\figure{

두 번 정의하고 \figure첫 번째 정의를 에 폐기합니다 . 기존 정의를 저장하기 위해 다른 방향으로 \corefigure의도한 것 같습니다.\let\figure

 \let\corefigure\figure

답변3

Metafox의 답변은 매우 좋은 힌트를 제공했지만 referenceprefix여전히 솔루션의 절반에 불과했습니다. 여기에서는 모든 것을 하나로 묶기 전에 몇 가지 불쾌한 함정이 있었기 때문에 설명과 함께 완전하고 강력한 솔루션을 제공하고 싶습니다. 나는 그림, 표, 공식에 대한 해결책을 제시할 것이며, 다른 떠다니는 물체도 동일한 체계를 따를 것입니다. 나는 어떤 사람들이 그것이 유용하다고 확신합니다.

추신: 내 질문에 반대표를 던진 여러분, 신의 축복이 있기를 바랍니다.

해결책


따라서 가장 먼저 정의해야 할 것은 캡션입니다.

\setupcaption
[figure][
            style={small},
        headstyle={bold},
            width={\textwidth},
            align={middle},
         location={bottom},
              way={bysection},
           prefix={yes},
   prefixsegments={chapter:section},
  referenceprefix={figure},
]

\setupcaption
[table][
            style={small},
        headstyle={bold},
            width={\textwidth},
            align={right},
         location={top},
              way={bysection},
           prefix={yes},
   prefixsegments={chapter:section},
  referenceprefix={table},
]

\setupformulas[
      numberstyle={bold},
              way={bysection},
           prefix={yes},
   prefixsegments={chapter:section},
  referenceprefix={formula},
]

많은 설정이 있지만 완전성을 위해 나열되었습니다. 우리 토론에서 중요한 것은 입니다 referenceprefix. 다음으로 참조 형식을 정의합니다.

\definereferenceformat
[infigure]

\definereferenceformat
[intable]

\definereferenceformat
[informula][
   left={(},
  right={)},
]

내가 그들 모두에게 접두어를 붙였다는 점에 주목하세요 in. 실제로 위의 명령이 새로운 매크로( \infigure[...], \intable[...], ) 를 정의했기 때문에 이는 중요합니다 \informula[...]. 이것들은 우리의 보조 매크로가 될 것이며, 우리의 텍스트에서 직접 사용하지는 않을 것입니다!

\figure[...]마지막으로 친숙한 이름인 , , \table[...]: \formula[...]을 사용하여 사용자 정의 매크로를 정의합니다.

\def
\figure{
  \dosingleargument
  \dofigure
}

\def
\dofigure[#1]{%
  \leavevmode
  \unskip
  \infigure
  [figure:#1]
  \ignorespaces
  \unskip
}

\def
\table{
  \dosingleargument
  \dotable
}

\def
\dotable[#1]{%
  \leavevmode
  \unskip
  \intable
  [table:#1]
  \ignorespaces
  \unskip
}

\def
\formula{
  \dosingleargument
  \doformula
}

\def
\doformula[#1]{%
  \leavevmode
  \unskip
  \informula
  [formula:#1]
  \ignorespaces
  \unskip
}

이제 끝났습니다. 이제 다양한 유형의 부동 개체 사이에 이름이 충돌할 염려 없이 텍스트에서 \figure[...], \table[...]및 를 안전하게 사용할 수 있습니다 . \formula[...]함정과 그 해결 방법에 대해 알고 싶다면 계속 읽으십시오.

함정


먼저 및 형제 뒤에 있는 백분율 기호( %) 를 확인하세요 \dofigure[#1]{. 이는 참조 앞에 추가 기생충 공간을 방지합니다. 그것을 제거해 보면 내가 무슨 말을 하는지 알게 될 것입니다.

둘째, \infigure[figure:#1]형제들이 어떻게 싸여 있는지 주목하십시오.

\leavevmode
\unskip
...
\ignorespaces
\unskip

무슨 일이 일어날지 직접 확인하기 위해 이를 생략해 볼 수 있습니다. 모든 참조 주위에 이상한 간격이 있다는 것을 알아야 합니다. 더 구체적으로 말하면 참조 주위에 2개의 추가 기생충 공간이 추가된 것 같습니다. 이것은 순수 \in[...]매크로가 사용되는 곳마다, 그리고 \definereferenceformat(보조 매크로 \infigure[...], \intable[...], 와 같은)로 정의된 매크로가 , 및 와 \informula[...]같은 다른 매크로 내부에서 확장되는 경우에만 발견되는 문제입니다 .\figure[...]\table[...]\formula[...]

"좋아요, 기존 방식을 시도해 보는 건 어떨까요?"라고 말할 수 있습니다.

\def
\dofigure[#1]{%
  \infigure[figure:#1]%
}

정답은 오른쪽 기생충 공간만 방지하지만, 왼쪽 기생충 공간이 하나 더 남게 된다는 것입니다. 따라서 올바르게 조판되는 참조 주위의 간격을 유지하려면 위의 구성에 보조 매크로를 포함하는 것이 중요합니다.

관련 정보