
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 TODO
coisa de maneira inteligente?
Procurando sugestões e esclarecimentos. Obrigado.
Responder1
Você pode definir um prefixo para cada tipo flutuante com a referenceprefix
chave do \setupcation
comando.
\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 \figure
duas vezes, descartando a primeira definição para \corefigure
, suspeito que você pretendia \let
na 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.