ConTeXt: Verhindern Sie Referenznamenkonflikte in schwebenden Objekten unterschiedlichen Typs

ConTeXt: Verhindern Sie Referenznamenkonflikte in schwebenden Objekten unterschiedlichen Typs

Ich finde es sehr ärgerlich, dass ConTeXt für Referenzen von Floating-Objekten denselben Namensraum verwendet. Mit anderen Worten, wenn Sie einer Abbildung und einer Tabelle denselben Verweis geben, verweisen Sie immer auf die zuerst definierte, d. h. es kommt zu einem offensichtlichen Namenskonflikt. Das ist aus meiner Sicht dumm. Auf ConTeXt Wiki habe ich Workarounds wie gesehen , d. h. sie schlagen vor , alle Ihre Referenzen mit Präfixen \figure[figure:Your Reference]zu spammen , was ich wiederum ziemlich ärgerlich finde.figure:table:

Ich möchte Folgendes tun:

\let\corefigure\figure

\def
\figure{
  \dosingleargument
  \dofigure
}

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

Und

\let\corestartplacefigure\startplacefigure

\def
\startplacefigure{
  \dotripleargument
  \dostartplacefigure
}

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

Das Gleiche gilt für den Tisch. Wie kann man das TODODing also geschickt umsetzen?

Ich bin auf der Suche nach Vorschlägen und Erläuterungen. Danke.

Antwort1

referenceprefixMit dem Schlüssel für den Befehl können Sie für jeden Float-Typ ein Präfix festlegen \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

Antwort2

\let\figure\corefigure

\def
\figure{

definiert \figurezweimal und verwirft die erste Definition in \corefigure, ich vermute, Sie wollten das \letin die andere Richtung, um die vorhandene Definition von zu speichern\figure

 \let\corefigure\figure

Antwort3

Obwohl Metafoxs Antwort mit einen sehr guten Hinweis lieferte referenceprefix, war dies immer noch nur die Hälfte der Lösung. Hier möchte ich eine vollständige, robuste Lösung mit Erklärungen bereitstellen, da es einige böse Fallstricke gab, bevor ich alles zusammensetzen konnte. Ich werde die Lösungen für Abbildungen, Tabellen und Formeln präsentieren, andere schwebende Objekte folgen demselben Schema. Ich bin sicher, dass einige Leute sie nützlich finden werden.

PS: Gott segne euch, Bittermen, die meine Frage abgelehnt haben.

Lösung


Als Erstes müssen die Bildunterschriften definiert werden:

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

Es gibt viele Einstellungen, aber sie werden nur der Vollständigkeit halber aufgeführt. Die für unsere Diskussion wichtigen sind referenceprefix. Als nächstes definieren wir Referenzformate:

\definereferenceformat
[infigure]

\definereferenceformat
[intable]

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

Beachten Sie, dass ich allen ein Präfix gegeben habe in. Das ist wichtig, weil die obigen Befehle tatsächlich neue Makros definiert haben: \infigure[...], \intable[...], \informula[...]. Dies werden unsere Hilfsmakros sein und wir werden sie nicht direkt in unserem Text verwenden!

Schließlich definieren wir unsere benutzerdefinierten Makros mit benutzerfreundlichen Namen: \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
}

Wir sind fertig. Jetzt können Sie \figure[...], \table[...], und sicher \formula[...]in Ihrem Text verwenden, ohne Namenskonflikte zwischen verschiedenen Typen schwebender Objekte befürchten zu müssen. Lesen Sie weiter, wenn Sie mehr über Fallstricke und deren Lösung erfahren möchten.

Tücken


Beachten Sie zunächst das Prozentzeichen ( %) nach \dofigure[#1]{und Brüder. Dieses verhindert zusätzlichen parasitären Platz vor Referenzen. Versuchen Sie, es zu entfernen, und Sie werden sehen, wovon ich spreche.

Zweitens, beachten Sie, wie \infigure[figure:#1]und Brüder sind eingewickelt in

\leavevmode
\unskip
...
\ignorespaces
\unskip

Sie können versuchen, sie wegzulassen, um selbst zu sehen, was passieren wird. Sie sollten seltsame Abstände um alle Ihre Referenzen herum bemerken: Genauer gesagt, es scheint, als würden zwei zusätzliche parasitäre Leerzeichen um Referenzen herum hinzugefügt. Dies ist das Problem, das mir bei reinen \in[...]Makros aufgefallen ist, wo immer es verwendet wird, und bei denen, die mit definiert sind \definereferenceformat(wie unsere Hilfsmakros \infigure[...], \intable[...], ), nur wenn sie innerhalb anderer Makros wie unseren , , und \informula[...]erweitert werden .\figure[...]\table[...]\formula[...]

Sie könnten sagen: „OK, warum versuchen Sie es nicht auf herkömmliche Weise?“

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

Die Antwort ist, dass nur der rechte Parasitenraum verhindert wird, aber ein zusätzlicher Parasitenraum von links bleibt bestehen. Daher ist es wichtig, Hilfsmakros in die obige Konstruktion einzuschließen, damit die Abstände um Referenzen korrekt gesetzt werden.

verwandte Informationen