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 (\ifvoid<nummer>) , sie reservieren und dann im eigenen Paket verwenden. Zum Schluss kann man sie dann wieder freigeben.

Die Frage ist nun, ob man Boxen im vorhinein prüfen und reservieren kann, sodass sie auch dann frei bleiben, wenn andere Anwender kein \ifvoid ausführen.

TeXBook Seite 121 und 210
Beispiel

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's gravatar image

ctansearch
(ausgesetzt)
Akzeptiert-Rate: 18%

bearbeitet 24 Apr '14, 21:35

cgnieder's gravatar image

cgnieder
22.1k253463


Konventionen in LaTeX und teilweise auch in plainTeX

\newbox ist eine Low-Level-Anweisung vergleichbar zu \newskip, \newdimen oder auch \def und \let. Auf LaTeX-Ebene sollte man stattdessen \newsavebox verwenden. Dies arbeitet ähnlich zu \newbox stellt aber wie \newcommand sicher, dass der Name noch nicht belegt ist. So ergibt beispielsweise:

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 \savebox, \sbox und \usebox. Auch diese sollte man nach Möglichkeit verwenden.

Klarstellungen zur Frage

Mir 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 \ifvoid nicht testet, ob ein Boxregister bereits reserviert wurde. Damit testet es auch nicht, ob ein Boxregister bereits anderweitig in Verwendung ist oder ob es zur allgemeinen Verwendung bereit steht. Vielmehr testet \ifvoid, ob ein Boxregister derzeit leer ist. Wobei ein leeres Boxregister wiederum nicht dasselbe wie eine leere \hbox oder eine leere \vbox ist, sondern ein Boxregister, das derzeit nichts enthält. LaTeX selbst hat beispielsweise mit \voidb@x ein Boxregister belegt, das aber niemals etwas enthalten darf. Dies wird beispielsweise verwendet, um mit \unhbox\voidb@x vom vertikalen in den horizontalen Modus zu wechseln, ohne dabei Inhalt in den Ausgabestrom einzufügen oder um ein anderes Boxregister wie \@tempboxa mit Hilfe von \setbox\@tempboxa\box\voidb@x wiederum zu leeren, ohne den bisherigen Inhalt in irgend einer Form zu verwenden. Dabei würde übrigens gleichzeitig auch \voidb@x leer, falls es nicht bereits leer wäre.

Ebenso reserviert man nicht zunächst ein Boxregister per \newbox\foo, um anschließend \foo per \chardef auf eine feste Nummer zu setzen. Vielmehr wird \foo mit Hilfe von \newbox\foo bereits auf die Nummer eines freien Boxregisters definiert, falls überhaupt noch ein freies Boxregister existiert. Eine anschließende Umdefinierung von \foo gibt auch keineswegs die Reservierung wieder auf. Vielmehr verliert man damit lediglich die klar definierte Zugriffsmöglichkeit auf das reservierte Register, falls man die zugehörige Nummer nicht anderweitig, etwa durch ein vorheriges \let\bar\foo speichert.

Fazit

Um es abschließend ganz deutlich zu sagen: Weder kann man mit \ifvoid testen, ob ein Boxregister bereits reserviert ist, noch kann man in einer sinnvollen Anwendung verhindern, dass Boxregister über ihre Nummer angesprochen werden.

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 \new… angefordert und darüber hinaus wird sichergestellt, dass die Namen für die Register wirklich neu sind, also nicht bereits anderweitig verwendet werden. So würde beispielsweise

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 LaTeX3

In 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 \tex_iftrue and Stelle von \iftrue. Diese TeX-Basisebene mit beispielsweise \tex_iftrue gilt allerdings auch nur für diejenigen, die LaTeX3 implementieren. Darüber liegt dann die LaTeX-Basisebene, die dann beispielsweise \if_true bereit stellt. Jeder, der nicht die Sprache LaTeX3 selbst implementiert, sollte min. diese Ebene einhalten. Wird dieses Schichtmodell eingehalten, ist es theoretisch möglich beispielsweise TeX selbst durch ein anderes Programm zu ersetzen. Dieses andere Programm könnte dann auch Möglichkeiten bereitstellen, um die Einhaltung der Konvention zu überwachen.

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 Konventionen

In 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 \secret@copy statt \usebox verwendet. Auf der anderen Seite kann man beispielsweise auch nicht verhindern, dass jemand den Quelltext einer C-Library nimmt und auf eine Funktion, die nicht über die Header-Datei offiziell als Teil der Schnittstelle definiert ist, per eigener Prototyp-Definition im eigenen Programm trotzdem zugreift. Selbst das Heraussuchen eines Einsprungpunktes in einer Library wäre theoretisch denkbar.

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änkungen

Bei 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 \new…-Makros zur Reservierung von Registern. Diese sind vergleichbar mit Funktionen zur Speicherverwaltung in grundlegenden Sprachbibliotheken. Unter diese Ebene zu gehen ist möglich, aber dann sollte es konsequent erfolgen, indem man die Anweisungen dieser Ebene komplett durch ein Alternativmodell ersetzt.

Lösungsideen

Tatsä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 Probleme

Allerdings 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 tex, etex, pdftex, luatex, xetex) einzubauen und dann auch noch LaTeX selbst komplett zu überarbeiten – letztlich neu zu implementieren. Bei LaTeX bis einschließlich LaTeX2ε war immer die Kompatibilität zu früheren Versionen ein hohes Gut. Änderungen, die diesem Gut entgegen stehen, wurden bis vor Kurzem nicht ohne Zwang eingeführt. Neuerdings gibt es für LaTeX selbst eine Art Kompatibilitätsebene, die mit dem Paket latexrelease gesteuert wird.

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.

Permanenter link

beantwortet 24 Jun '13, 08:45

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 04 Aug '16, 14:44

@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

@Clemens

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 \new… anzufordern und über die dabei erzeugten Namen darauf zuzugreifen. Das geht auch in einer Schleife. Du verwendest hingegen die Sprachimplementierungsebene. LaTeX liegt teilweise über der plainTeX-Ebene.

(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.

    \documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\begin{document}

\setbox0=\hbox{Inhalt0}
\setbox1=\hbox{Inhalt1}
\setbox2=\hbox{Inhalt2}
\setbox3=\hbox{Inhalt3}

\def\claimbox[#1]#2{
\newbox\claimedbox 
\chardef\claimedbox=#1 
\ifvoid#1 Box #1 ist leer und erhält (#2): \setbox#1=\hbox{#2}\else
Box #1 ist nicht leer und behält (\copy#1): \fi\copy#1}
\claimbox[0]{Inhalt0}

\claimbox[0]{Inhalt0}

\claimbox[1]{Inhalt1}

\claimbox[2]{Inhalt2}

\claimbox[3]{Inhalt3}

\claimbox[4]{Neuen Inhalt 4}

\end{document}
Permanenter link

beantwortet 24 Jun '13, 01:28

ctansearch's gravatar image

ctansearch
(ausgesetzt)
Akzeptiert-Rate: 18%

bearbeitet 24 Jun '13, 01:38

Ich sehe nicht, dass das auch nur ansatzweise eine Lösung darstellt. Insbesondere taugt \ifvoid nicht dazu, um zu erkennen, ob ein Boxregister frei verfügbar ist. Vielmehr kann man damit nur erkennen, ob es ein Boxregister im Augenblick einen Inhalt besitzt oder eine leere Box repräsentiert. Der LaTeX-Kern besitzt mit \voidb@x beispielsweise ein Boxregister, das immer void ist, und gerade deshalb nicht belegt werden darf! Außerdem ist es unsinnig, erst mit \newbox ein freies Register anzufordern und dieses dann nicht zu verwenden.

(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 \ifvoid# auch eine leere Box als Inhalt sieht: \setbox0=\hbox{} \ifvoid0J\else N\fi \bye Insofern kannst du mit \ifvoid nicht auf eine leere Box testen. Das ginge nur mit \ifdim\wd0=0pt Leer\else Nicht leer\fi

(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 ifvoid testen, ob ein Boxregister bereits reserviert ist, noch kann man in einer sinnvollen Anwendung verhindern, dass Boxregister über ihre Nummer angesprochen werden. Allerdings klingen Deine Fragen stark nach dem „XY-Problem“, und das verursacht ganz natürlicherweise Interpretationen. :)

(27 Jun '13, 12:26) cgnieder
1

@Herbert: Ja, ich meinte tatsächlich nicht eine leere \hbox oder eine leere \vbox, sondern ein leeres Boxregister.

@ctansearch: Ich sehe das Problem nicht darin, dass ich Deine Frage interpretiere, sondern darin, dass Du zum einen falsche Annahmen über die Bedeutung von \ifvoid machst und zum anderen die mehrfachen Hinweise auf Deine Fehlinterpretationen sowohl von Befehlen als auch von dem was TeX kann und was nicht, wenig beachtest. Dass Du zwecks beharren auf den Fehlannahmen, die Frage über mehrere Fragen verteilst und mich jetzt auch noch persönlich angreifst hilft dabei wenig.

(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

@saputello

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
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×22
×18
×6

gestellte Frage: 23 Jun '13, 21:51

Frage wurde gesehen: 23,118 Mal

zuletzt geändert: 04 Aug '16, 14:44