
Me resulta muy molesto que ConTeXt utilice el mismo espacio de nombres para referencias de objetos flotantes. En otras palabras, si das la misma referencia a una figura y a una tabla, entonces siempre te referirás a la que se definió primero, es decir, un choque obvio de nombres. Esto es una estupidez desde mi punto de vista. En ConTeXt Wiki he visto soluciones como \figure[figure:Your Reference]
, es decir, proponen enviar spam figure:
a table:
prefijos en todas sus referencias, lo que me parece bastante molesto una vez más.
Esto es lo que quiero hacer:
\let\corefigure\figure
\def
\figure{
\dosingleargument
\dofigure
}
\def
\dofigure[#1]{
\corefigure[figure:#1]
}
y
\let\corestartplacefigure\startplacefigure
\def
\startplacefigure{
\dotripleargument
\dostartplacefigure
}
\def
\dostartplacefigure[#1][#2][#3]{
# TODO: Somehow insert "figure:" into #1 after "reference="...
\corestartplacefigure[#1][#2][#3]
}
Lo mismo ocurriría con la mesa. Entonces, ¿cómo cumplir inteligentemente la TODO
cosita?
Buscando sugerencias y aclaraciones. Gracias.
Respuesta1
Puede establecer un prefijo para cada tipo de flotador con la referenceprefix
clave del \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
Respuesta2
\let\figure\corefigure
\def
\figure{
define \figure
dos veces, descartando la primera definición \corefigure
, sospecho que pretendías \let
en la otra dirección guardar la definición existente de\figure
\let\corefigure\figure
Respuesta3
Aunque la respuesta de Metafox proporcionó una muy buena pista referenceprefix
, todavía era solo la mitad de la solución. Aquí me gustaría brindar una solución completa y sólida con explicaciones porque hubo algunos errores desagradables antes de que pudiera reconstruirlo todo. Presentaré las soluciones para figuras, tablas y fórmulas, otros objetos flotantes obedecerán el mismo esquema. Estoy seguro de que a algunas personas les resultará útil.
PD: Dios los bendiga, amargados, que rechazaron mi pregunta.
Solución
Entonces, lo primero que debemos definir son los subtítulos:
\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},
]
Hay muchas configuraciones, pero se enumeran solo para que estén completas. Los importantes para nuestra discusión son referenceprefix
. A continuación, definimos formatos de referencia:
\definereferenceformat
[infigure]
\definereferenceformat
[intable]
\definereferenceformat
[informula][
left={(},
right={)},
]
Presta atención que a todos les puse un prefijo in
. Esto es importante porque, de hecho, los comandos anteriores han definido nuevas macros: \infigure[...]
, \intable[...]
, \informula[...]
. ¡Estas serán nuestras macros auxiliares y no las usaremos directamente en nuestro texto!
Finalmente, definimos nuestras macros personalizadas con nombres descriptivos: \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
}
Hemos terminado. Ahora puedes usar \figure[...]
, \table[...]
y de forma segura \formula[...]
en tu texto sin temor a conflictos de nombres entre diferentes tipos de objetos flotantes. Continúe leyendo si desea conocer los errores y cómo se resolvieron.
Escollos
Primero, observe el signo de porcentaje ( %
) después de \dofigure[#1]{
y hermanos. Éste evita espacio parásito adicional delante de las referencias. Intenta eliminarlo y verás de lo que estoy hablando.
En segundo lugar, observe cómo \infigure[figure:#1]
y los hermanos están envueltos en
\leavevmode
\unskip
...
\ignorespaces
\unskip
Puedes intentar omitirlos para ver por ti mismo lo que va a pasar. Deberías notar un espaciado extraño alrededor de todas tus referencias: para ser más específico, parece que se agregan 2 espacios parásitos adicionales alrededor de las referencias. Este es el problema que he notado en \in[...]
las macros puras dondequiera que se usen, y en las definidas con \definereferenceformat
(como nuestras macros auxiliares \infigure[...]
, \intable[...]
, \informula[...]
) solo si se expanden dentro de otras macros como nuestras \figure[...]
, \table[...]
y \formula[...]
.
Podrías decir: "Está bien, ¿por qué no intentarlo de la manera convencional?".
\def
\dofigure[#1]{%
\infigure[figure:#1]%
}
La respuesta es que solo impedirá el espacio parásito derecho, pero aún quedará un espacio parásito adicional de la izquierda. Por lo tanto, es importante mantener las macros auxiliares incluidas en la construcción anterior para mantener el espaciado alrededor de las referencias tipografiadas correctamente.