ConTeXt: Evite conflictos de nombres de referencia en objetos flotantes de diferentes tipos

ConTeXt: Evite conflictos de nombres de referencia en objetos flotantes de diferentes tipos

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 TODOcosita?

Buscando sugerencias y aclaraciones. Gracias.

Respuesta1

Puede establecer un prefijo para cada tipo de flotador con la referenceprefixclave del \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

Respuesta2

\let\figure\corefigure

\def
\figure{

define \figuredos veces, descartando la primera definición \corefigure, sospecho que pretendías \leten 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.

información relacionada