Wie kann man den eigentlich den betragsmäßig maximalen Wert auslesen, der z.B. in der foreach-Schleife

\foreach[] \x in {0,...,7}{ \pgfmathsetmacro{\y}{int(-\x*(\x-3)} \y

auftritt?

alt text

Im Beispiel wäre das also -28.

Öffne in Overleaf
\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{pgffor}

\begin{document}
\foreach[evaluate={\Max=max(1,0)}] \x in {0,...,7}{
\pgfmathsetmacro{\y}{int(-\x*(\x-3)}
\y, 
}
\end{document}

gefragt 09 Okt, 13:24

cis's gravatar image

cis
8.2k15167263
Akzeptiert: 71%

Benötigst du wirklich den betragsmäßig größten Wert, oder ist größter Wert ausreichend? Du könntest mit

\gdef\Max{0} \foreach \x in {0,...,7} {% \ifnum\Max<\x \xdef\Max{\x}% \fi }

arbeiten. Betragsmäßig wäre ein bisschen mehr allerdings ähnlich.

(09 Okt, 13:52) Skillmon

Ach, wenn ich das nur wüsste. -28 ist die längste auftretende Zeichenfolge. An die will ich rannkommen.

(09 Okt, 13:59) cis

Ich bin verwirrt. Möchtest du wissen, wie breit dein längster Eintrag wird, oder was tatsächlich den größten Betrag hat? Wenn es dir um die Länge geht, dann würde ich das ganz anders machen. Und geht es dir um die Anzahl an Token oder die tatsächliche Breite? Manchmal ist es gut, wenn du erklärst, was du machen möchtest.

(09 Okt, 14:07) Skillmon

"Manchmal ist es gut, wenn du erklärst, was du machen möchtest." Ja, das höre ich nicht zum ersten mal. Und wenn ich alles nenne, wird es zu lang und dann heißt es: brech mal runter auf ein MWE. Keine Ahnung, ich habe einen Blackout. Ich möchte das breiteste Element rauslesen und da dachte ich, dass müsste das betragsmäßig größte sein - ist natürlich nicht so 100%ig...

(09 Okt, 14:12) cis

@cis -10 ist breiter als 11, dein Ansatz funktioniert so also nicht wirklich. Ich schreibe gleich eine Antwort. Möchtest du den Inhalt des breitesten Eintrags, oder die Breite des breitesten Eintrags?

(09 Okt, 14:30) Skillmon

Ja, die Breite bekomme ich doch dann mit settowidth raus, dachte ich...

(09 Okt, 16:09) cis
Ergebnis 5 von 6 Alle anzeigen

Wenn du überprüfen möchtest, wie breit etwas ist, bleibt dir nicht wirklich etwas anderes übrig, als TeX es setzen zu lassen. Man kann mit \savebox (LaTeX) oder \setbox (TeX) Inhalte in ein Boxregister speichern (fertig gesetzt). Anschließend kann man mit \wd die Breite, \ht die Höhe und \dp die Tiefe der Box untersuchen (Tiefe ist die Länge, die der Boxinhalt unter die Grundlinie heraus sticht, Höhe diejenige Länge, die der Boxinhalt oberhalb der Grundlinie bemisst).

Da \foreach die einzelnen Schleifendurchgänge in einer Gruppe durchführt, müssen wir alles, was über einen Durchgang hinaus bestand haben soll, global definieren. Umgekehrt müssen wir nicht aufpassen, dass lokale Änderungen lokal bleiben. Wir können also, ohne uns weitere Gedanken machen zu müssen, Boxregister 0 lokal verwenden.

Um die Breite von etwas zu bestimmen, benutzen wir \setbox<register>\hbox{<etwas>} (eine \vbox, was die Alternative wäre, lässt keine Aufschlüsse über die Breite mehr zu, da sie immer \hsize breit ist). Wir verwenden also \setbox0\hbox{\x}, um die Breite eines Elementes prüfen zu können. Anschließend können wir mit \wd0 auf die Breite zurückgreifen.

Um zu überprüfen, welche Länge größer ist, verwenden wir \ifdim. Schließlich brauchen wir noch eine eigene Größe, die wir global ändern können. Diese erzeugen wir uns mit \newlength\WidestWidth. Das reserviert uns eines von TeXs Skipregistern und gibt ihm den Namen \WidestWidth (genau genommen ist das ein Macro, das die Zahl des Skipregisters enthält, das expandiert dann zu sowas wie \skip<register>).

Schließlich schreiben wir uns noch ein schönes Macro, damit wir den Code nicht jedes Mal wiederholen müssen. Das Macro nimmt als Argument die Liste entgegen, als optionales Argument einen Macronamen, in dem der Inhalt des breitesten Eintrags gespeichert werden soll.

Komplett:

Öffne in Overleaf
\documentclass[]{article}

\usepackage{pgffor}

\newlength\WidestWidth
\newcommand\GetWidestEntry[2][]
  {%
    \WidestWidth0pt
    \foreach\x in {#2}
      {%
        \setbox0\hbox{\x}%
        \ifdim\wd0>\WidestWidth
          \global\WidestWidth\wd0
          \if\relax\detokenize{#1}\relax
          \else
            \xdef#1{\x}%
          \fi
        \fi
      }%
  }

\begin{document}
\GetWidestEntry[\widestentry]{0,1,11,-10,9}
\widestentry\ is \the\WidestWidth\ wide.
\end{document}
Permanenter link

beantwortet 09 Okt, 14:49

Skillmon's gravatar image

Skillmon
2814

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×5

Frage gestellt: 09 Okt, 13:24

Frage wurde angeschaut: 102 Mal

Zuletzt aktualisiert: 09 Okt, 16:09