Wie kann ich eine while-Schleife in plainTeX erstellen? Ich möchte in TeX dieselbe Funktionalität einer while-Schleife erreichen, wie sie z.B. in C Programmen möglich ist. gefragt 17 Jun '13, 12:15 ctansearch saputello |
Erste Idee: % !TEX pdftex \long\def\firstoftwo#1#2{#1} \long\def\secondoftwo#1#2{#2} % \ifnumber{<Zahlenbeziehung>}{<wahr>}{<falsch>}: \def\ifnumber#1{% \ifnum#1\relax \expandafter\firstoftwo \else \expandafter\secondoftwo \fi } % eine Schleife für \if-Abfragen mit der Syntax wie das oben definierte \ifnumber, % also mit {wahr}{falsch} Argumenten, die in der Schleife weggelassen werden: % \dowhile{<Bedingung>}{<Ausführung wenn Bedingung wahr>} \long\def\dowhile#1#2{% #1{#2\dowhile{#1}{#2}}{}% } % test, ob's funktioniert: \newcount\step \dowhile{\ifnumber{\the\step<3}}{\advance\step by 1 \the\step} % damit \while mit derselben Syntax definieren wie in ctansearchs Antwort: % \while[<Start>,<Obergrenze>,<Ausführung solange Zeiger kleiner Obergrenze>] \long\def\while[#1,#2,#3]{% % mit der Gruppe wird die Schleife schachtelbar \begingroup \step=#1 \dowhile {\ifnumber{\the\step<#2}} {#3\advance\step by 1 }% \endgroup } \while[0,3,4] \while[1,5,Schritt \the\step\par] \while[0,5,{a(\while[0,3,b]}) ] \bye Im LaTeX-Kernel kann man eine weitere Lösung finden: % !TEX pdftex \catcode`\@=11 \long\def\@gobble#1{} % Definition von \@whilenum aus dem LaTeX-Kernel: \long\def\@whilenum#1\do #2{% \ifnum #1\relax #2\relax\@iwhilenum{#1\relax #2\relax}% \fi} \long\def\@iwhilenum#1{% \ifnum #1% \expandafter\@iwhilenum \else \expandafter\@gobble \fi{#1}} \newcount\step % Test, ob's funktioniert: \@whilenum\the\step<3\do{\the\step \advance\step by 1 } % \while mit derselben Syntax definieren wie in ctansearchs Antwort: % \while[<Start>,<Obergrenze>,<Ausführung solange Zeiger kleiner Obergrenze>] \long\def\while[#1,#2,#3]{% \step=#1 \@whilenum\the\step<#2\do{#3\advance\step by 1 }% } \catcode`\@=12 \while[0,3,4] \while[1,5,Schritt \the\step\par] \bye |
Beispiel(entsp. Kommentaren korrigiert) % !TEX pdftex {\bf \TeX-Code} \vskip\baselineskip% \newcount\start% \newcount\stop% \def\while[#1,#2,#3]{% \start=#1 % \stop=#2 % \def\doit{#3}% \loop \ifnum\start<\the\stop \doit \advance\start by 1\repeat% \start=0 \stop=0}% \setbox0=\hbox{Test 1} \setbox1=\hbox{Test 2} \setbox2=\hbox{Test 3} \while[0,3,\expandafter\box\the\start]% \bye% % beantwortet 17 Jun '13, 12:17 ctansearch stefan ♦♦ 2
Nur eine Bemerkung: nach Kontrollsequenzen sind
(17 Jun '13, 12:22)
cgnieder
Funktioniert gut! Wenn ich nach Clemens's Tipp in die Folgezeile mit 1 beginne, also
(17 Jun '13, 12:31)
stefan ♦♦
1
Nach
(17 Jun '13, 22:52)
cgnieder
2
Die Wäre etwas anderes, wenn
(28 Jun '13, 21:44)
bernd
|
Falls jemand auf diese Frage stößt, sollte er bedenken, dass es sich hier um rein plain TeX handelt. LaTeX selbst bietet mit Hilfe verschiedenster Pakete weit aus bessere und effektivere Schleifen.
Selbst für plain TeX könnte man fertige Pakete haben... wenn ich mich recht erinnere, ist z.B. das
texapi
Paket generic...