
Kann in Fällen, in denen der zu setzende Eingabetext getrennt von der strukturierten Vorlage ist, die Eingabe die Höhe und Breite des sie umgebenden Felds bestimmen?
Eine Beispieleingabe. Zu ersetzende Fragezeichen (?) (Lua oder TeX).
The width of the parent box is ?
The height of the parent box is ?
Mehrere mögliche Vorlagen:
\ruledhbox to 10cm{\vbox to 4cm{ \input input }} % 10cm by 4cm
\ruledvbox to 4cm{\hsize=10cm \input input } % 10cm by 4cm
\framed
[width=10cm,
height=4cm,
align={middle,lohi},
offset=0.5cm]
{ \input input } % 9cm by 3cm
Die Abmessungen sind bedeutungslos, bis die Box verstaut wurde. Beginnen Sie daher wahrscheinlich damit.
Meine Erweiterung des \aftergroup
+\lastbox
Antwort:
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \askparent }}}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: } \afterafter }}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: }} \after }
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{
\setbox\storelast=\vbox to40pt{\hbox to30pt{width: }}
\xdef\parht{\the\ht\storelast}
\xdef\parwd{\the\wd\storelast}
\xdef\pardp{\the\dp\storelast}
\ifvmode\nointerlineskip\fi\box\storelast}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{
\setbox\storelast=\vbox to40pt{\hbox to30pt{width: }}
\xdef\parht{\the\ht\storelast}
\xdef\parwd{\the\wd\storelast}
\xdef\pardp{\the\dp\storelast}
\vbox to40pt{\hbox to30pt{width: }}}
}
Antwort1
Wenn Sie für Ihre Texte verwenden, \framed
können Sie die Breite des Inhalts im Feld mit den Befehlen \framedwidth
und \framedheight
festlegen. Eine Einschränkung hierbei ist, dass Sie nur dann einen verwendbaren Wert erhalten, wenn die Einstellungen für width
oder height
eine Länge größer als enthalten 0pt
.
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
Width: \framedwidth \par
Height: \framedheight
\stopframed
\stoptext
Um die Werte der Schlüssel width
und zu erhalten height
, können Sie die Befehle \localwidth
und verwenden \localheight
. Dabei sollten Sie sich bewusst sein, dass ConTeXt den Wert zurückgibt, der mit dem Schlüssel gesetzt wurde, d.h. wenn Sie width=fit
den \localwidth
Befehl setzen, erhalten Sie ihn fit
als Argument.
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
Width: \localwidth \par
Height: \localheight
\stopframed
\stoptext
Der letztmögliche Wert kann für den Hintergrund eines Rahmens verwendet werden, aber im Gegensatz zu den vorherigen Methoden erhalten Sie auch mit Einstellungen wie das richtige width
oder height
des Rahmens width=fit
.
\defineoverlay
[boxdimensions]
[\vbox\bgroup
\hbox {Width: \overlaywidth}
\hbox{Height: \overlayheight}
\egroup]
\setupframed % don't make global framed settings in a document
[background=boxdimensions]
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
%
\stopframed
\stoptext
Antwort2
Diese „Lösung“ ist sicherlich nicht universell und gut durchdacht, aber sie funktioniert für mich in einfachen Fällen mit einfachem TeX:
\newbox\storelast
\def\after{\setbox\storelast=\lastbox
{\globaldefs=1
\edef\parht{\the\ht\storelast}
\edef\parwd{\the\wd\storelast}
\edef\pardp{\the\dp\storelast}}
\ifvmode\nointerlineskip\fi\box\storelast}
\def\afterafter{\aftergroup\after}
\def\askparent{\aftergroup\afterafter}
\def\typeset#1{\let\parht\askparent\let\parwd\askparent\let\pardp\askparent
{\globaldefs=-1 \setbox0#1}#1}
Anschließend können Sie die Vorlage mit setzen \typeset{...}
. In der Eingabe können Sie , und verwenden \parwd
, um die Breite, Höhe bzw. Tiefe der übergeordneten Box zu erhalten. Das Argument von\parht
\pardp
\typeset
muss eine Kiste sein(es muss mit \hbox
, \vbox
... beginnen).
Ich habe zum Beispiel eine Datei mit dem Namen, input.tex
die enthält
width \parwd\ height \parht
.
Dann die folgenden Zeilen
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{\input input }}}}
\typeset{\vbox to50pt{\hbox to40pt{\vbox to30pt{\input input }}}}
Drucken (abgesehen von vielen über-/untervollen Kartons)
width 30.0pt height 40.0pt
width 40.0pt height 30.0pt
richtig. Allerdings
- Ich habe keine Ahnung, wie gut sich das bei komplexeren Konstrukten verhält;
- Bearbeiten:Wie Henri Menke in den Kommentaren anmerkt, kann das zweimalige Setzen der Box (mit
\setbox0#1
gefolgt von#1
) zu unerwarteten Nebeneffekten führen, beispielsweise wenn Zähler in der Box erhöht werden. Ich habe versucht, dieses Problem zu reduzieren, indem ich die\setbox0#1
in einer Gruppe mit ausgewertet habe\globaldefs=-1
, aber dies kann die Abmessungen der Box ändern, wenn Pakete verwendet werden, die auf globalen Definitionen basieren, wie z. B. , wastikz
zu falschen Ergebnissen führt; - Es wird davon ausgegangen, dass die Befehle
\parht
usw.wird nicht innerhalb einer Gruppe verwendetandere als die, die durch die Boxen erzeugt werden; - funktioniert nur, wenn die übergeordnete Boxnicht auf der Hauptvertikallisteda es
\lastbox
zur Bestimmung der Kastenabmessungen verwendet wird, die im externen vertikalen Modus leer sind.
Zum letzten Punkt betrachten wir das obige Beispiel, aber jetzt interessieren uns die Abmessungen der äußersten Box:
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{\input input }}}}
\typeset{\vbox to50pt{\hbox to40pt{\vbox to30pt{\input input }}}}
würde drucken
width 0.0pt height 0.0pt
width 0.0pt height 0.0pt
weil die äußerste Box im externen vertikalen Modus eingestellt ist. In diesem Fall müssten Sie Ihre Vorlage mit einer weiteren Box umschließen, wie
\typeset{\hbox{\hbox to50pt{\vbox to40pt{\hbox to30pt{}\input input }}}}
\typeset{\hbox{\vbox to50pt{\hbox to40pt{\vbox to30pt{}\input input }}}}
width 50.0pt height 40.0pt
width 40.0pt height 50.0pt
wie erwartet.