ConTeXt: Evitar conflitos de nomes de referência em objetos flutuantes de diferentes tipos

ConTeXt: Evitar conflitos de nomes de referência em objetos flutuantes de diferentes tipos

Acho muito chato que o ConTeXt use o mesmo namespace para referências de objetos flutuantes. Em outras palavras, se você der a mesma referência a uma figura e a uma tabela, então você sempre se referirá àquela que foi definida primeiro, ou seja, óbvio conflito de nomes. Isso é estúpido do meu ponto de vista. No ConTeXt Wiki eu vi soluções alternativas como \figure[figure:Your Reference], ou seja, eles propõem spam figure:, table:prefixos em todas as suas referências, o que considero bastante irritante mais uma vez.

Aqui está o que eu quero fazer:

\let\corefigure\figure

\def
\figure{
  \dosingleargument
  \dofigure
}

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

e

\let\corestartplacefigure\startplacefigure

\def
\startplacefigure{
  \dotripleargument
  \dostartplacefigure
}

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

O mesmo aconteceria com a mesa. Então, como cumprir a TODOcoisa de maneira inteligente?

Procurando sugestões e esclarecimentos. Obrigado.

Responder1

Você pode definir um prefixo para cada tipo flutuante com a referenceprefixchave do \setupcationcomando.

\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

Responder2

\let\figure\corefigure

\def
\figure{

define \figureduas vezes, descartando a primeira definição para \corefigure, suspeito que você pretendia \letna outra direção salvar a definição existente de\figure

 \let\corefigure\figure

Responder3

Embora a resposta da Metafox fornecesse uma dica muito boa referenceprefix, ainda era apenas metade da solução. Aqui eu gostaria de fornecer uma solução completa e robusta com explicações, porque houve algumas armadilhas desagradáveis ​​antes que eu pudesse juntar tudo. Apresentarei as soluções para figuras, tabelas e fórmulas, os demais objetos flutuantes obedecerão ao mesmo esquema. Tenho certeza que algumas pessoas acharão útil.

PS: Deus os abençoe, amargurados, que votaram negativamente na minha pergunta.

Solução


Então, as primeiras coisas a definir são as legendas:

\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},
]

Existem muitas configurações, mas elas são listadas apenas para fins de integridade. Os importantes para nossa discussão são referenceprefix. A seguir, definimos formatos de referência:

\definereferenceformat
[infigure]

\definereferenceformat
[intable]

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

Preste atenção que dei um prefixo a todos eles in. Isto é importante porque na verdade os comandos acima definiram novas macros: \infigure[...], \intable[...], \informula[...]. Estas serão nossas macros auxiliares, e não vamos utilizá-las diretamente em nosso texto!

Finalmente, definimos nossas macros personalizadas com nomes amigáveis: \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
}

Acabamos. Agora você pode usar com segurança \figure[...], \table[...]e \formula[...]em seu texto, sem medo de nomear conflitos entre diferentes tipos de objetos flutuantes. Continue lendo se quiser saber mais sobre as armadilhas e como elas foram resolvidas.

Armadilhas


Primeiro, observe o sinal de porcentagem ( %) depois de \dofigure[#1]{e irmãos. Este evita espaço adicional parasita na frente das referências. Tente removê-lo e você verá do que estou falando.

Em segundo lugar, observe como \infigure[figure:#1]os irmãos estão envolvidos em

\leavevmode
\unskip
...
\ignorespaces
\unskip

Você pode tentar omiti-los para ver por si mesmo o que vai acontecer. Você deve notar espaçamentos estranhos em torno de todas as suas referências: para ser mais específico, parece que 2 espaços parasitas adicionais foram adicionados em torno das referências. Este é o problema que notei na \in[...]macro pura onde quer que seja usada, e naquelas definidas com \definereferenceformat(como nossas macros auxiliares \infigure[...], \intable[...], \informula[...]) somente se forem expandidas dentro de outras macros como nossas \figure[...], \table[...], e \formula[...].

Você poderia dizer: "OK, por que não tentar a maneira convencional:"

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

A resposta é que isso impedirá apenas o espaço parasita direito, mas um espaço parasita adicional à esquerda ainda permanecerá. Portanto, é importante manter as macros auxiliares envolvidas na construção acima para manter o espaçamento em torno das referências sendo composto corretamente.

informação relacionada