
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 TODO
Ding also geschickt umsetzen?
Ich bin auf der Suche nach Vorschlägen und Erläuterungen. Danke.
Antwort1
referenceprefix
Mit 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 \figure
zweimal und verwirft die erste Definition in \corefigure
, ich vermute, Sie wollten das \let
in 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.