Der folgende Code stellt eine Möglichkeit dar, neue (weil durch eine Umgebung gruppierte) Boxregister durch ihre Nummern, nicht durch
gefragt 26 Jun '13, 01:47 ctansearch cgnieder |
Wenn Du Register nur lokal verwenden willst, solltest Du trotzdem nicht bereits belegte Register dafür verwenden. Jedenfalls gilt das, wenn Du Seiteneffekte während der Abarbeitung Deines Codes nicht ausschließen kannst. Solche Seiteneffekte können beispielsweise dann auftreten, wenn man fremde Makros innerhalb der entsprechenden Gruppe verwendet oder Ausgaben produziert, die einen Aufruf der asynchronen Ausgaberoutine von LaTeX nach sich ziehen können. Der Grund für dieses Verbot ist einfach: Es ist nicht ausgeschlossen, dass die fremden Macros oder die Ausgaberoutine die Boxregister unverändert benötigen oder selbst verändern. Dies kann sogar global erfolgen, da einige Box-Primitiven auch Benötigt man einige wenige Register nur kurzzeitig, und will deshalb keine Register global belegen und damit dem Register-Pool entziehen, kann man die speziell dafür vom LaTeX-Kern vorgesehenen Register verwenden. Bei den Boxen ist das in erster Linie Darüber hinaus gibt es bei einigen Registern noch eine Art stillschweigenden Vorrat an lokal verwendbaren Registern. Bei den Boxen sind das die Boxen 0 bis 9, die sozusagen kurzzeitig verwendet werden können. Nach einer stillschweigenden Konvention sind die geraden Boxen 0, 2, 4, 6, und 8 dabei für lokale Änderungen vorgesehen. Man kann also beispielsweise mal eben Box 0 mit beliebigem Inhalt füllen, dann die Box manipulieren und direkt ausgeben. Zwischen dem Füllen der Box und der Ausgabe der Box sollten aber keine Aktionen stattfinden, die nicht unter der Kontrolle dessen stehen, der die Box füllt. Jede andere Anweisung darf die Box nämlich ebenfalls verwenden, kann sie also insbesondere auch löschen over verändern! Die ungeraden Boxen 1, 3, 5, 7 und 9 sind für globale Änderungen vorgesehen. Hier darf man also nicht einmal beim Füllen der Box beliebigen Code verwenden, weil dieser diese Boxen selbst (global) verändern könnte. Andere Boxen, die man nicht mit Bei den Boxen kommt hinzu, dass diverse davon für inserts (siehe Will man trotzdem einige Register lokal verwenden, so muss man Sorge dafür tragen, dass man diese Register aus dem Pool bezieht und kann sie auch nur dann wieder freigeben, wenn zwischenzeitlich nicht weitere Register belegt wurden. Dazu eine Beispielumgebung für LaTeX:
Innerhalb der Umgebung sind die lokalen Boxregister dann unter den Namen Die Umgebung kann theoretisch auch geschachtelt verwendet werden. Falls nicht mehr genügend Register zur Verfügung stehen, wird derzeit ggf. mehrfach ein Fehler ausgegeben. Einen noch besseren Ansatz bietet das Paket Als Merksatz gilt: Verwende keine Register, die Du nicht selbst mit der entsprechenden Anweisung des verwendeten Formats reserviert hast! Der Merksatz gilt nicht nur für LaTeX, sondern für alle Formate. Bei LaTeX und plainTeX heißt die Low-Level-Anweisung zur Reservierung von Boxregistern Die Pakete Obiger Beispielcode für die lokale Reservierung von Boxregistern ist ebenfalls ein Teilverstoß gegen den Merksatz, da er zusätzlich internes Wissen über die Implementierung von Die aufgezeigten Inkompatibilitäten sind nur ein sehr kleiner Ausschnitt aus den Gefahren, die aus Verstößen gegen den Merksatz resultieren. beantwortet 26 Jun '13, 09:23 saputello +1 Tolle Antwort. Schade, dass ich nur einmal stimme kann...
(26 Jun '13, 10:36)
cgnieder
@saputello Sehr hilfreiche Antwort. Danke "Man würde also fremden Code kompromittieren." Genau das Problem versuch(t)e ich zu lösen, bzw zu vermeiden.
(26 Jun '13, 12:44)
ctansearch
Tolle Antwort.
(26 Jun '13, 17:13)
Marco_D
@saputello Falls Du Dich erinnerst, war der Ausgangspunkt und die Kernfrage, ob und wie man Boxen reservieren kann. Ich habe also das Problem aufgezeigt und suche nach der Lösung. Der Inhalt des "Merksatz" war der Ausgangspunkt und das Ziel der Fragen, die ich dazu gestellt habe.
(26 Jun '13, 20:00)
ctansearch
@ctansearch: Die Frage, wie man Register reserviert, hatte ich eigentlich schon längst beantwortet: mit
(27 Jun '13, 08:37)
saputello
@Clemens: Du kannst mir ja Punkte dafür schenken. ;-) Eigentlich überlege ich, ob ich die Klarstellungen am Ende nicht wieder entferne, denn eigentlich war die Antwort ohne diese eher prägnanter und damit klarer …
(27 Jun '13, 10:23)
saputello
@saputello Tut mir leid, im Moment drehen wir uns im Kreis. Ich möchte wissen, wie man explizit und über die Nummer einer Box per \setboxxx diese für die Laufzeit eines Paketes reservieren kann, geschützt hält und wieder freigibt, nichts anderes.
(27 Jun '13, 10:59)
ctansearch
2
@ctansearch: solange alle Pakete
(27 Jun '13, 11:05)
Herbert
@ctansearch: Wir drehen uns nur im Kreis, wenn Du nicht verstehst, dass das was Du willst technisch nicht möglich ist, sondern nur durch Konventionen erreicht wird, gegen die Du aber bisher immer wieder verstößt.
(27 Jun '13, 12:54)
saputello
Ergebnis 5 von 9
show 4 more comments
|
Vielleicht meinst du so etwas:
TeX kümmert sich dann um die Belegeung (aus dem Logfile)
beantwortet 27 Jun '13, 12:29 Herbert So etwas ähnliches habe ich bereits in meiner Antwort zu http://texwelt.de/wissen/fragen/337/kann-man-in-texlatex-register-reservieren-bzw-blockieren gezeigt. BTW: Ich finde es recht unglücklich wie die offenbar wohl doch letztlich eine Frage über mehrere Fragen verteilt ist.
(27 Jun '13, 12:57)
saputello
|
und was ist jetzt deine Frage??
@ctansearch Du kannst Inline-Code darstellen, indem Du ihn zwischen Backticks schreibst
`\code@stuff
`, siehe die Markdown Syntax