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 '18, 19:24

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

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 '18, 19:52) Skillmon

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

(09 Okt '18, 19: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 '18, 20: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 '18, 20: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 '18, 20:30) Skillmon

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

(09 Okt '18, 22:09) cis
Ergebnis 5 von 6 show 1 more comments

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 '18, 20:49

Skillmon's gravatar image

Skillmon
1.2k6
Akzeptiert-Rate: 46%

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:

×5

gestellte Frage: 09 Okt '18, 19:24

Frage wurde gesehen: 3,607 Mal

zuletzt geändert: 09 Okt '18, 22:09