In der Frage „missverstandene-newbox“ haben wir festgestellt, daß es eine begrenzte Anzahl von Registern gibt. Um diese Register effektiv zu nutzen und um nicht mit anderen Paketen in Konflikt zu geraten, müsste man eine Anzahl solcher Register daraufhin prüfen, ob sie leer sind ( Die Frage ist nun, ob man Boxen im vorhinein prüfen und reservieren kann, sodass sie auch dann frei bleiben, wenn andere Anwender kein TeXBook Seite 121 und 210 Open in writeLaTeX
\documentclass[a4paper]{article} \usepackage[ngerman]{babel} \usepackage[utf8]{inputenc} \begin{document} \newbox\mybox %eine box benennen \chardef\mybox=45 %einer box eine registernummer zuweisen \setbox\mybox=\hbox{Mein Boxinhalt} %eine box füllen \ifvoid45 Box 45 ist leer \else Box 45 ist nicht leer \fi %eine Box auf Inhalt prüfen \copy\mybox %eine box ausgeben % \newbox\yourbox %eine neue box benennen \chardef\yourbox=45 %einer box registernummer zuweisen \setbox\yourbox=\hbox{Wird aber trotzdem überschrieben} %eine box füllen \copy\mybox %eine box ausgeben \copy\yourbox %die andere box ausgeben %beide Boxen haben denselben Inhalt %Die Frage ist, wie man die \mybox blockieren, bzw reservieren kann, damit sie %nicht überschrieben wird \end{document} gefragt 23 Jun '13, 21:51 ctansearch cgnieder |
Konventionen in LaTeX und teilweise auch in plainTeX
Open in Online-Editor
\newsavebox\documentclass
ebenso eine Fehlermeldung wie Open in Online-Editor
\newsavebox\mybox \newsavebox\mybox Dadurch wird effektiv verhindert, dass derselbe Name versehentlich mehrfach verwendet wird. Darüber hinaus bietet LaTeX für die Belegung und Verwendung von Boxen auch noch die Anweisungen Klarstellungen zur FrageMir ist aber ehrlich gesagt der Sinn der Frage nicht ganz klar. Um Missverständnisse zu vermeiden sei daher auf einige mögliche Irrtümer hingewiesen. So benötigt man beispielsweise kein neues Boxregister, wenn man lediglich an eine vorhandene Box etwas anhängen möchte. Tatsächlich kann man eine Box mit ihrem bisherigem und zusätzlich neuem Inhalt belegen. Je nach Anwendungsfall kann das beispielsweise mit (hier wieder teilweise Low-Level-TeX): Open in Online-Editor
\sbox\mybox{\unhbox\mybox\ und neuer Inhalt} oder Open in Online-Editor
\sbox\mybox{\box\mybox\ und neuer Inhalt} erfolgen. Näheres zu diesen Anweisungen und den Unterschiedenen ist beispielsweise TeX by Topic zu entnehmen. Ebenso sei darauf hingewiesen, dass Ebenso reserviert man nicht zunächst ein Boxregister per FazitUm es abschließend ganz deutlich zu sagen: Weder kann man mit Genau aus diesem Grund sollte man sich an die Konvention halten: Nur Boxregister verwenden, die man zuvor selbst mit den im Format dafür vorgesehenen Anweisungen reserviert hat oder für die eine bestimmte Form der freien Verwendbarkeit dokumentiert ist. Wie kann man mehrere Register auf einen Schlag reservieren?In einigen wenigen Fällen benötigt man mehrere Register auf einmal und möchte diese unter fortlaufenden Namen ansprechen können. Hier ein Beispiel dafür: Open in Online-Editor
\documentclass{article} \makeatletter % Argument 1: Basisname für die neuen Register % Argument 2: Art des Registers; erlaubt sind: count, dimen, skip, muskip, % box, toks, read oder write % Argument 3: Anzahl der Register % % Mögliche Fehlermeldungen: % % No romm for a new … % – Es gibt keine Register der angeforderten Art mehr. % % LaTeX Error: Command … already defined. % Or name \end... illegal, see p.192 of the manual. % – Ein aus dem angegebenen Basisnamen und der fortlaufenden kleinen % römischen Zahl gebildeter Name wird bereits anderweitig verwendet. \newcommand*{\newregisters}[3]{% \@tempcnta\z@ \@whilenum\@tempcnta <#3 \do{% \advance\@tempcnta by \@ne \expandafter\@ifdefinable\csname #1\romannumeral\the\@tempcnta\endcsname{% \csname new#2\expandafter\endcsname \csname #1\romannumeral\the\@tempcnta\endcsname }% }% } \makeatother \newregisters{MeineBox}{box}{10}% zehn Boxregister anfordern \begin{document} % Die 10 Boxregister mit Inhalt füllen: \sbox\MeineBoxi{Das ist Box i} \sbox\MeineBoxii{Das ist Box ii} \sbox\MeineBoxiii{Das ist Box iii} \sbox\MeineBoxiv{Das ist Box iv} \sbox\MeineBoxv{Das ist Box v} \sbox\MeineBoxvi{Das ist Box vi} \sbox\MeineBoxvii{Das ist Box vii} \sbox\MeineBoxviii{Das ist Box viii} \sbox\MeineBoxix{Das ist Box ix} \sbox\MeineBoxx{Das ist Box x} % Die 10 Boxregister ausgeben: Hier die 10 Boxen: \frame{\usebox\MeineBoxi}, \frame{\usebox\MeineBoxii}, \frame{\usebox\MeineBoxiii}, \frame{\usebox\MeineBoxiv}, \frame{\usebox\MeineBoxv}, \frame{\usebox\MeineBoxvi}, \frame{\usebox\MeineBoxvii}, \frame{\usebox\MeineBoxviii}, \frame{\usebox\MeineBoxix}, \frame{\usebox\MeineBoxx}. \end{document} In dem Beispiel werden alle Register sauber per Open in Online-Editor
\newregisters{MeineBoxen}{box}{5} \newregisters{MeineBoxen}{box}{2} zu einer Fehlermeldung: Open in Online-Editor
! LaTeX Error: Command \MeineBoxeni already defined. Or name \end... illegal, see p.192 of the manual. See the LaTeX manual or LaTeX Companion for explanation. Type H <return> for immediate help. ... l.30 \newregisters{MeineBoxen}{box}{2} führen. Konventionen in LaTeX3In LaTeX3 ist die TeX-Ebene von der LaTeX-Ebene durch wesentlich klarere Konventionen getrennt. Zum einen gibt es die plainTeX-Ebene zwischen der TeX-Ebene und der LaTeX-Ebene offiziell nicht mehr. Zum anderen ist es durch Konvention verboten, TeX-Primitive direkt zu verwenden. Stattdessen sind die entsprechenden Makros der TeX-Basisebene zu verwenden, beispielsweise Derzeit existiert LaTeX3 noch nicht als von LaTeX2ε unabhängiges Format. Stattdessen gibt es derzeit nur einige Kernbestandteile in Form von Paketen, die mit LaTeX2ε verwendet werden können. Daraus bedingt ist es auch vielfach leider noch nicht möglich, komplett innerhalb der LaTeX3-Schichten zu operieren. Stattdessen muss zumindest teilweise auch auf LaTeX2ε zurückgegriffen und damit das klar strukturierte Schichtenmodell verlassen werden. Kritik an KonventionenIn Deinen Fragen durchbrichst Du all diese Konventionen. Tatsächlich ermöglicht TeX als Sprache nicht, das effektiv zu verhindern. Selbst wenn man zur Verhinderung etwas wie Open in Online-Editor
\let\secret@box\box \let\box\undefined \let\secret@copy\copy \let\copy\undefined usw. in LaTeX einbauen würde, könnte man nicht verhindern, dass dann jemand Nur weil Dinge möglich sind, heißt es noch lange nicht, dass man sie tun sollte. Natürlich kann man den Vorwurf in den Raum stellen, dass sie nicht möglich sein sollten. Wenn aber bereits dieser Vorwurf zulässig ist, ist dann nicht umso mehr ein Vorwurf zulässig, wenn jemand wider besseren Wissens die Konventionen verletzt? Historische Begründung für EinschränkungenBei aller Liebe zu TeX ist zu bedenken, dass es eine sehr alte Sprache ist. Zu der Zeit, als TeX entworfen wurde, war gerade einmal Pascal als Leersprache im Kommen. Vielfach wurde noch in Assembler programmiert. Die erste Implementierung von TeX erfolge noch in einer wenig leistungsfähigen Script-Sprache. Maschinenunabhängige Programmierung war noch ein kaum beachteter Traum. Sicherheitsmechanismen bei der Programmierung waren gerade erst im Aufkeimen. Gleichzeitig war TeX ein Entwurf und eine Implementierung für einen sehr speziellen Einsatzzweck: Das Setzen von Büchern in einer ganz bestimmten Reihe. Dabei war im Übrigen noch gedacht, dass für jede Buchreihe oder eventuell sogar jedes Buch ein eigenes TeX-Format zu erstellen ist. Trotzdem gab es mit plainTeX bereits eine Art Grundebene, auf der diese Spezialformate aufbauen könnten. Diese Grundebene lieferte einfache Verwaltungsfunktionen, beispielsweise die LösungsideenTatsächlich gab es immer wieder Überlegungen, TeX um Scopes zu erweitern. Ein Scope ist dabei ein Bereich eines Programms, indem Variablen, Funktionen und andere Elemente der Sprache quasi eingeschlossen werden können. Außerhalb des entsprechenden Scope sind diese Elemente nicht sichtbar. Meines Wissens wurden Scopes für TeX erstmals in εχTEX implementiert. Resultierende neue ProblemeAllerdings gibt es bei LaTeX ein großes Problem mit solch gundlegenden Neuerungen: LaTeX ist kein monolithisches System. Stattdessen besteht es aus einem Kern und vielen Teilen, die von vielen unterschiedlichen Menschen hinzugefügt wurden. Die Einführung von grundlegenden Neuerungen bedeutet daher, dass nur ein Teil der LaTeX-Infrastuktur auf diese Neuerungen umgestellt werden. Für die Verwendung von Scopes bedeutet das, dass die Verwendung selbiger in LaTeX selbst entweder die Möglichkeit bieten müsste, dass es erlaubt wird, daraus auszubrechen, oder aber dass auf einen Schlag nicht nur sehr viele Dokumente, sondern auch die meisten Pakete und Klassen nicht mehr funktionierten. Darüber hinaus müsste man erst einmal jemand finden, der zum einen Scopes in die gängigen TeX-Maschinen (als da min. sind Diese Probleme bei LaTeX sind eine Ursache dafür, dass Neuerungen bei TeX selbst in letzter Zeit hauptsächlich aus dem ConTeXt-Bereich kommen. ConTeXt selbst ist im Kern eher ein Projekt von wenigen. Zwischen den wenigen, die LuaTeX entwickeln, und den wenigen, die ConTeXt entwickeln, besteht eine gewisse Schnittmenge. Wenn für ConTeXt neue Dinge erforderlich sind, wurden sie daher oft zügig in LuaTeX umgesetzt. Darüber hinaus besteht bei ConTeXt ein gewisses Diktat von oben. Wenn die Entwickler eine Änderung für sinnvoll hielten, wurde sie ggf. auch ohne Rücksicht auf die Anwender umgesetzt. Aus diesem unterschiedlichen Vorgehen resultiert die Vermutung: Wenn überhaupt besteht allenfalls bei LaTeX3 oder bei ConTeXt eine Chance die Einhaltung eines Schichtenmodells zu überwachen. Gleichzeitig resultiert aus einer derartigen Überwachung eine erheblich Inkompatibilität zu existierenden Formaten. Bei LaTeX2ε und erst recht bei plainTeX sollte man eine Überwachung der Konventionen nicht erwarten und stattdessen die Konventionen freiwillig einhalten. beantwortet 24 Jun '13, 08:45 saputello @saputello Zunächst vielen Dank für die Antwort. Ich muss zur Erklärung sagen, daß mich gerade die TeX-Basics besonders interessieren. Aber Dein Vorschlag ist auch noch keine Lösung, auch nicht in Latex, denn es wird zwar geprüft, ob die \newbox schon besteht, sie kann aber trotzdem überschrieben werden, wenn ein \setbox<nummer> zufällig diese Box anspricht. \newsavebox\mybox \chardef\mybox=45 \savebox\mybox{test} \usebox\mybox \setbox45=\hbox{trotzdem} \box45
(24 Jun '13, 21:19)
ctansearch
1
@ctansearch: es gibt keine Möglichkeit zu verhindern, dass eine Box, ein Makro oder was auch immer überschrieben wird. Das kann immer (ob absichtlich oder versehentlich) passieren, wenn man die TeX-Befehle nimmt. Wenn man wollte, könnte man aus LaTeX heraus den kompletten Kernel überschreiben. :)
(24 Jun '13, 21:50)
cgnieder
@ctansearch: Damit ganz deutlich wird, was mein Vorschlag umfasst, habe ich das am Ende der Antwort noch ergänzt. Dein Einwand geht nämlich genau an diesem Teil meines Vorschlags vorbei.
(26 Jun '13, 18:55)
saputello
@saputello Du mißverstehst Ich bin nicht über den Teil Deines Vorschlags hinweggegangen, sondern ich habe das Problem, das Latex an der Stelle hat, aufgezeigt und suche nach einer sicheren Lösung. Einfach zu verlangen, daß sich jeder an Konventionen hält ist zwar eine Lösung, aber es ist keine programmierte Lösung. Wenn Du Dich erinnerst, ich habe explizit danach gefragt, ob man Boxen reservieren kann. Welche Boxen das sein können, war noch gar nicht Thema.
(26 Jun '13, 19:57)
ctansearch
1
@ctansearch Wieso hat LaTeX ein Problem? TeX legt Beschränkungen auf, die auch darauf zurückzuführen sind, dass zu der Zeit, als es entstand, Speicherplatz begrenzt war. LaTeX (und die Konventionen die man für LaTeX eingeführt hat) sind ein Weg, mit den nun mal vorhandenen Beschränkungen umzugehen. Das kann einem gefallen oder nicht, ändern kann man es nicht. (Jedenfalls nicht, ohne TeX neu zu schreiben...)
(26 Jun '13, 20:06)
cgnieder
Die Möglichkeit, wechselseitig genutzte Speicherbereiche zu überschreiben ist ein Programmfehler, bzw ein Hindernis, zum Beispiel, wenn man Boxen per while-Schleife beschreiben und nutzen will und da suche ich halt nach einer Lösung. Wenn es nicht geht, dann geht's halt nicht. Aber versuchen kann man's ja.
(26 Jun '13, 20:17)
ctansearch
@ctansearch man müsste Knuth fragen um sicher zu gehen, aber ich vermute, dass es sich um eine bewusste Entscheidung gehandelt hat. Insofern ist Programmfehler die falsche Wortwahl. Und wenn man um den Umstand weiß, kann man damit ja auch umgehen :) Das ganze wäre wahrscheinlich erheblich leichter, wenn man wüsste, worauf Du am Schluß hinaus willst. Womöglich brauchst Du gar keine Boxen...
(26 Jun '13, 22:14)
cgnieder
@Clemens Na ja, sagen wir, es ist eine Fehlerquelle. Letztendlich geht es darum, daß ich für meine Anwendungen einen geschützten Speicherbereich haben will, der weder durch fremde Anwendungen gestört, noch durch den Kernel beeinflusst werden kann und der sicherstellt, daß meine (laienhaften) Programmierungen tatsächlich lokal bleiben. Wenn man so will, eine Sandbox oder ein "namespace" wie in c++. Eventuell, aber das ist bis jetzt nur eine skizzenhafte Idee, ergibt sich daraus sogar eine Rechtschreibprüfung in TeX.
(26 Jun '13, 22:56)
ctansearch
1
@ctansearch: Aus heutiger Sicht mag manches in TeX ein Designfehler sein. Darüber zu streiten ist müßig. Ein generelles Paradigma in der Softwaretechnik ist allerdings, dass man immer die oberste, passende Programmierebene verwendet. Bereits in plainTeX ist die unterste Ebene zur Verwendung von Registern eben nicht, beliebige Register über ihre Nummer anzusprechen, sondern Register mit
(27 Jun '13, 09:06)
saputello
Ich denke, dass die Aussage »Wenn die Entwickler eine Änderung für sinnvoll hielten, wurde sie ggf. auch ohne Rücksicht auf die Anwender umgesetzt.« zu ConTeXt nicht wirklich stimmt. Die Entwicklung von ConTeXt findet sehr stark Community-getrieben statt, weil neue Features werden dann implementiert wenn ein User auf der Mailing-Liste danach fragt.
(04 Aug '16, 13:51)
Henri
@Henri: Ich denke schon dass die Aussage stimmt. Unterhalte Dich mal mit Herbert Voß über sein ConTeXt-Buch. Das wurde u. a. deshalb nie fertig, weil an ConTeXt immer wieder Dinge geändert wurden und deshalb Beispiele, die eben noch funktionierten plötzlich nicht mehr funktionieren. Was Du dagegen ansprichst sind neue Features. Dass bei ConTeXt (und daraus bedingt bei LuaTeX) eine ganz andere Dynamik herrscht als bis vor Kurzem bei LaTeX habe ich ja explizit erwähnt.
(04 Aug '16, 14:40)
saputello
Ergebnis 5 von 11
show 6 more comments
|
Das Problem könnte man so lösen, wobei noch wünschenswert wäre, den Inhalt einer besetzten aber angeforderten (claimed) box in die jeweils folgende (oder nächste freie) Box zu verschieben. Das kann man evntl. durch fortschreitende Zähler und while-Schleifen erreichen. Morgen mehr.
beantwortet 24 Jun '13, 01:28 ctansearch Ich sehe nicht, dass das auch nur ansatzweise eine Lösung darstellt. Insbesondere taugt
(27 Jun '13, 10:09)
saputello
@ctansearch: Da ich aufgrund Deiner Selbstantwort vermute, dass Du etwas ganz anderes suchst, nämlich wie man eine fortlaufende Anzahl an Register reservieren und dann ansprechen kann, habe ich meine Antwort um den Bereich Wie kann man mehrere Register auf einen Schlag reservieren? ergänzt und auch darüber hinaus eine ganze Reihe an Informationen neu strukturiert hinzugefügt. Ich hoffe, damit ist die Frage, die Du über mehrere Fragen verteilt verklausuliert hast, nun tatsächlich beantwortet.
(27 Jun '13, 11:12)
saputello
@saputello: Wobei
(27 Jun '13, 11:21)
Herbert
@saputello Ich denke, ich habe meine Frage(n) sehr klar und deutlich gestellt, Es wäre besser, nicht so stark zu interpretieren, was ich vielleicht will oder darf, sondern die Fragen direkt zu beantworten. Trotzdem danke für die Informationen.
(27 Jun '13, 12:19)
ctansearch
1
@ctansearch Und Du hast doch auch eine klare und deutliche Antwort erhalten. Zitat: Weder kann man mit
(27 Jun '13, 12:26)
cgnieder
1
@Herbert: Ja, ich meinte tatsächlich nicht eine leere @ctansearch: Ich sehe das Problem nicht darin, dass ich Deine Frage interpretiere, sondern darin, dass Du zum einen falsche Annahmen über die Bedeutung von
(27 Jun '13, 13:07)
saputello
@saputello und @ctansearch - vielen Dank für die interessante Diskussion! saputellos Post ist ja echt Lesestoff. Bitte weiter im Kopf behalten, dass wir nur die technische Sache besprechen :-) persönlich war hier sicher nichts beabsichtigt.
(27 Jun '13, 13:16)
stefan ♦♦
@stefan @Clemens @herbert @saputello Abschließend: Die Antworten waren nicht so klar, wie es den Anschein hat, ausser der von Clemens. Manches hat sich widersprochen, besonders die Antworten von saputello, und da frage ich halt nach. Daß ich die Fragen über mehrere Fragen "verteilt" habe, liegt am System. Persönlich gemeint ist von mir hier gar nichts, ausser Danke.
(27 Jun '13, 21:45)
ctansearch
Offensichtlich treffen wir aufeinander, wenn es um solche Kernfragen geht. Offensichtlich bringen wir die Sache aber auch auf den Punkt und ein Stückchen weiter. Ich schlage ein \expandafter\saputello und \expandafter\ctansearch vor gefolgt von einem \relax :-)
(27 Jun '13, 22:38)
ctansearch
Ergebnis 5 von 9
show 4 more comments
|