Hallo liebe TeXWelt-Community,

ich habe folgendes "Problem" bei der Erstellung einer Arbeitsblattes für die Schule. Ich möchte verschiedene Tikzpictures in einer enumerate-Auflistung mit multicols nebeneinander so darstellen, dass das tikzpicture bündig zur Nummerierung ist. Dazu habe ich bereits unter Aligning an enumeration item to the top of a tikzpicture gefunden wie das möglich ist. Nun bin ich ein Freund davon verkürzte Kommandos zu definieren die ich häufig brauche. So hätte ich anstatt baseline={($(current bounding box.north)-(0,1.6ex)$)} z.B. gerne topline verwendet. Das übliche \newcommand findet hier keine Anwendung, weil ich mir nur \topline als Befehl definieren könnte was ich aber in den Tikzpicture-Optionen nicht verwenden kann. Auch ein Tikzstyle zu definieren "nur" für dieses Kürzel erscheint mir nicht als passende Lösung. Hat jemand eine smarte Idee? Leider finde ich dazu nichts passendes im Netz. Hier noch ein Code-Beispiel um zu sehen, wie oft ich diese Tikzpicture-Option aufrufen muss. Dies ist dabei nur ein kurzer Ausschnitt aus dem Arbeitsblatt. Ich habe knapp 50 verschiedene Tikzpictures aufzurufen und jedes mal muss ich die Ausrichtung der Baseline mit dem "langen" Befehl ändern. Gibt es eine Möglichkeit dies als Kürzel zu definieren?

\documentclass[12pt]{article}

\usepackage{multicol}
\usepackage{enumerate}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{geometry}
\geometry{a4paper, top=15mm, left=15mm, right=20mm, bottom=15mm, headsep=10mm, footskip=10mm}

\begin{document}
Male die entsprechenden Bruchanteile aus.
\begin{multicols}{4}
    \begin{enumerate}[(a)]
        \item \begin{tikzpicture}[scale=0.75, baseline={($(current bounding box.north)-(0,2ex)$)}]
                \draw (0,0) rectangle (4,4);
                \foreach \i in {1,2,3} {
                        \draw (0,\i) -- (4,\i);
                    }
                \draw node at (2,-1) {$\dfrac{1}{4}$};
            \end{tikzpicture}
        \item \begin{tikzpicture}[scale=0.75, baseline={($(current bounding box.north)-(0,2ex)$)}]
                    \draw (0,0) rectangle (4,4);
                    \foreach \i in {0.5,1,...,3.5} {
                        \draw (0,\i) -- (4,\i);
                    }
                \draw node at (2,-1) {$\dfrac{2}{8}$};
            \end{tikzpicture}
        \item \begin{tikzpicture}[scale=0.75, baseline={($(current bounding box.north)-(0,2ex)$)}]
                \draw (0,0) rectangle(4,4);
                \draw (2,0) -- (2,4);
                \draw node at (2,-1) {$\dfrac{1}{2}$};
            \end{tikzpicture}
        \item \begin{tikzpicture}[scale=0.75, baseline={($(current bounding box.north)-(0,2ex)$)}]
                \draw (0,0) rectangle (4,4);
                    \draw (2,0) -- (2,4);
                    \draw (0,2) -- (4,2);
                \draw node at (2,-1) {$\dfrac{3}{4}$};
            \end{tikzpicture}
    \end{enumerate}
\end{multicols}
\end{document}

gefragt 15 Feb, 09:30

maqu's gravatar image

maqu
1166
Akzeptiert-Rate: 0%

bearbeitet 16 Feb, 12:37

stefan's gravatar image

stefan ♦♦
17.9k122947

Bei mir wird bei diesem beitrag der code nicht angezeigt. Ich sehe nur "Code, hier editierbar zum Übersetzen:", eine graue Linie und den Knopf "Ausgabe erzeugen". Mit dem kann ich zwar die ausgabe erzeugen, sehe aber nicht, worauf diese basiert. In der antwort @Cletus kann ich den code dagegen sehen. Das hatte ich bisher noch nie. Liegt das am beitrag oder irgendwo auf meiner seite. Hat das sonst noch jemand?

(16 Feb, 11:49) huibub

@huibub Da war html-Code im Beitrag, ich habe ihn entfernt. Ist es besser?

(16 Feb, 12:38) stefan ♦♦

@stefan Leider noch immer nicht. Der code blitzt beim neuladen der Seite jetzt kurz auf, wird aber sofort wieder eingeklappt. Ich komme da einfach nicht ran. Das ist aber bisher der einzige beitrag, bei dem ich das beobachten konnte.

(16 Feb, 14:45) huibub

@huibub tatsächlich kann ich alles sehen und auch die Ausgabe erzeugen, auch wenn ich nicht angemeldet bin und z.B. über den Browser am Handy schaue ... sry falls das an mir liegen sollte^^

(16 Feb, 21:15) maqu

Wenn Du topline als Option bei einer tikzpicture angeben willst, kannst du \pgfkeys verwenden:

\pgfkeys{
  /tikz/topline/.style={baseline={([yshift=#1]current bounding box.north)}},
  /tikz/topline/.default=-\ht\strutbox
}

oder

\pgfkeys{
  /tikz/.cd,
  topline/.style={baseline={([yshift=#1]current bounding box.north)}},
  topline/.default=-\ht\strutbox
}

oder kürzer

\tikzset{
  topline/.style={baseline={([yshift=#1]current bounding box.north)}},
  topline/.default=-\ht\strutbox
}

Damit lässt sich beispielsweise topline=-2ex als Option nutzen. Wird topline ohne Wert angegeben, dann wird der mit topline/.default eingestellte Standdardwert benutzt. Im Code oben wird dafür -\ht\strutbox benutzt, also die Höhe der \strut Box. Siehe dazu: Was macht der Befehl \strut?

Wird für topline kein optionales Argument benötigt, dann kann man auch

\tikzset{
  topline/.style={baseline={([yshift=-\ht\strutbox]current bounding box.north)}}
}

verwenden.

Beispiel:

\documentclass[12pt,a4paper]{article}
\usepackage{multicol}
\usepackage{enumerate}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{geometry}
\geometry{margin=15mm, right=20mm, headsep=10mm, footskip=10mm}

\tikzset{
  topline/.style={baseline={([yshift=#1]current bounding box.north)}},
  topline/.default=-\ht\strutbox
}

\begin{document}
Male die entsprechenden Bruchanteile aus.
\begin{multicols}{4}
  \begin{enumerate}[(a)]
    \item \begin{tikzpicture}[scale=0.75, topline]
        \draw (0,0) rectangle (4,4);
        \foreach \i in {1,2,3} {
                \draw (0,\i) -- (4,\i);
            }
        \draw node at (2,-1) {$\dfrac{1}{4}$};
      \end{tikzpicture}
    \item \begin{tikzpicture}[scale=0.75, topline]
            \draw (0,0) rectangle (4,4);
            \foreach \i in {0.5,1,...,3.5} {
                \draw (0,\i) -- (4,\i);
            }
        \draw node at (2,-1) {$\dfrac{2}{8}$};
      \end{tikzpicture}
    \item \begin{tikzpicture}[scale=0.75, topline]
        \draw (0,0) rectangle(4,4);
        \draw (2,0) -- (2,4);
        \draw node at (2,-1) {$\dfrac{1}{2}$};
      \end{tikzpicture}
    \item \begin{tikzpicture}[scale=0.75, topline]
        \draw (0,0) rectangle (4,4);
            \draw (2,0) -- (2,4);
            \draw (0,2) -- (4,2);
        \draw node at (2,-1) {$\dfrac{3}{4}$};
      \end{tikzpicture}
  \end{enumerate}
\end{multicols}
\end{document}

Da alle tikzpicture in der enumerate Umgebung die gleichen Optionen haben, kann man diese auch lokal für die gesamte Umgebung einstellen:

\documentclass[12pt,a4paper]{article}
\usepackage{multicol}
\usepackage{enumerate}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{geometry}
\geometry{margin=15mm, right=20mm, headsep=10mm, footskip=10mm}

\tikzset{
  topline/.style={baseline={([yshift=#1]current bounding box.north)}},
  topline/.default=-\ht\strutbox
}

\begin{document}
Male die entsprechenden Bruchanteile aus.
\begin{multicols}{4}
  \begin{enumerate}[(a)]
    \tikzset{every picture/.style={scale=0.75, topline}}% lokal innerhalb der enumerate-Umgebung
    \item \begin{tikzpicture}
        \draw (0,0) rectangle (4,4);
        \foreach \i in {1,2,3} {
                \draw (0,\i) -- (4,\i);
            }
        \draw node at (2,-1) {$\dfrac{1}{4}$};
      \end{tikzpicture}
    \item \begin{tikzpicture}
            \draw (0,0) rectangle (4,4);
            \foreach \i in {0.5,1,...,3.5} {
                \draw (0,\i) -- (4,\i);
            }
        \draw node at (2,-1) {$\dfrac{2}{8}$};
      \end{tikzpicture}
    \item \begin{tikzpicture}
        \draw (0,0) rectangle(4,4);
        \draw (2,0) -- (2,4);
        \draw node at (2,-1) {$\dfrac{1}{2}$};
      \end{tikzpicture}
    \item \begin{tikzpicture}
        \draw (0,0) rectangle (4,4);
            \draw (2,0) -- (2,4);
            \draw (0,2) -- (4,2);
        \draw node at (2,-1) {$\dfrac{3}{4}$};
      \end{tikzpicture}
  \end{enumerate}
\end{multicols}
\end{document}
Permanenter link

beantwortet 17 Feb, 14:25

esdd's gravatar image

esdd
17.4k244156
Akzeptiert-Rate: 62%

bearbeitet 20 Feb, 12:02

2

Bei verwendung von enumitem statt enumerate könnte man übrigens auch option before=\tikzset{every picture/.style={scale=0.75, topline}} verwenden. Soll das bei allen enumerate-umgebungen gleich sein, kann man die option auch global per \setlist setzen. Überhaupt bietet enumitem einige vorteile gegenüber enumerate, weshalb ich enumerate schon seit jahren nicht mehr verwendet habe.

(17 Feb, 19:06) huibub

@esdd Großartig, vielen Dank, genau das was ich gesucht hab. Ich ziehe die Variante mit tikzset vor. Auch für die Idee mit every picture/.style bin ich dir dankbar, smarte Variante. Ein paar Fragen habe ich noch: - du verwendest baseline={([yshift=#1]current bounding box.north)} statt baseline={($(current bounding box.north)-(0,1.6ex)$)}, warum?^^ Ich benötige dadurch die tikzbibliothek calc nicht mehr, aber was bewirkt [yshift=#1] genau, ist #1 nicht immer ein Platzhalter? - und warum ist es nötig das ein default-wert festgelegt werden muss? Was bewirkt genau -\ht\strutbox?

(17 Feb, 20:15) maqu

@huibub vielen Dank für den Hinweis. Worin liegen denn die Vorteile von enumitem gegenüber enumerate? Ich nutze eigentlich in all meinen Arbeitsblättern immer die enumerate-Umgebung. Sollte ich auf enumitem umsteigen und wenn ja, warum

(17 Feb, 20:17) maqu

@maqu Wenn dir der von @huibub explizit genannte Vorteil noch nicht genügt, dann vergleiche einfach einmal die Anleitungen der beiden Pakete. Das Paket enumerate bietet eigentlich nur die Möglichkeit, die Nummerierung von enumerate Aufzählungen zu ändern. Das Paket enumitem bietet dies ebenfalls und darüber hinaus sehr viele weitere Einstellmöglichkeiten für diverse Arten von Listen. Das heißt jetzt nicht, dass man immer enumitem verwenden muss und enumerate schlecht wäre. Wegen der unterschiedlichen Syntax müsste man aber den Code ändern, wenn man dann doch noch enumitem braucht.

(19 Feb, 09:12) gast3

@maqu Ja, #1 ist der Platzhalter für ein Argument. Damit dieses optional ist, muss ein Standardwert vorgeben sein. Das wird über topline/.default=-\ht\strutbox erledigt. \ht\strutbox ist dabei die Höhe der \strut Box. Siehe dazu: Was macht der Befehl \strut?. Wenn du das optionale Argument nicht benötigst, kannst du natürlich auch direkt \tikzset{topline/.style={baseline={([yshift=-\ht\strutbox]current bounding box.north)}}} verwenden.

(20 Feb, 11:58) esdd

@esdd danke für deine Erklärung ich habe es glaube verstanden, auch wenn deine Verlinkung mich immer nur auf meine Frage weiterleitet ^^ ... ich habe unter https://tex.stackexchange.com/questions/395871/how-do-i-get-the-height-and-depth-of-a-box-as-a-dimension jetzt nachvollziehen können wie das mit der strutbox funktioniert @Ijon Tichy ich habe mich jetzt ein bisschen mit enumitem beschäftigt und verwende das Paket nun auch anstelle des enumerate-Pakets

(23 Feb, 11:08) maqu
Ergebnis 5 von 6 show 1 more comments

Für so etwas kann man die Umgebung adjustbox aus dem gleichnamigen Paket verwenden. Das geht dann nicht nur mit TikZ-Bildern, sondern auch mit anderen Objekten.

\documentclass[12pt]{article}

\usepackage{multicol}
\usepackage{enumerate}
\usepackage{adjustbox}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{geometry}
\geometry{a4paper, top=15mm, left=15mm, right=20mm, bottom=15mm, headsep=10mm, footskip=10mm}

\newenvironment{toppicture}{\begin{adjustbox}{valign=t}\begin{tikzpicture}[scale=0.75]}{\end{tikzpicture}\end{adjustbox}}

\begin{document}
Male die entsprechenden Bruchanteile aus.
\begin{multicols}{4}
    \begin{enumerate}[(a)]
        \item \begin{toppicture}
                \draw (0,0) rectangle (4,4);
                \foreach \i in {1,2,3} {
                        \draw (0,\i) -- (4,\i);
                    }
                \node at (2,-1) {$\dfrac{1}{4}$};
            \end{toppicture}
        \item \begin{toppicture}
                    \draw (0,0) rectangle (4,4);
                    \foreach \i in {0.5,1,...,3.5} {
                        \draw (0,\i) -- (4,\i);
                    }
                \node at (2,-1) {$\dfrac{2}{8}$};
            \end{toppicture}
        \item \begin{toppicture}
                \draw (0,0) rectangle(4,4);
                \draw (2,0) -- (2,4);
                \node at (2,-1) {$\dfrac{1}{2}$};
            \end{toppicture}
        \item \begin{toppicture}
                \draw (0,0) rectangle (4,4);
                    \draw (2,0) -- (2,4);
                    \draw (0,2) -- (4,2);
                \node at (2,-1) {$\dfrac{3}{4}$};
            \end{toppicture}
    \end{enumerate}
\end{multicols}
\end{document}
Permanenter link

beantwortet 15 Feb, 12:59

Cletus's gravatar image

Cletus
1.5k34964
Akzeptiert-Rate: 75%

bearbeitet 15 Feb, 13:02

Hey Cletus, erstmal danke für deine Antwort. Ja die adjustbox-umgebung war mir nicht bekannt und löst tatsächlich mein vorheriges Problem mit dem aligning on top besser als mit der baseline zu arbeiten. Für dieses Arbeitsblatt löst auch dein neu definiertes environment mein Problem, aber auf anderen Arbeitsblättern, wo ich andere tikzpictures vielleicht anders scalen oder zusätzliche Optionen in das Tikzpicture einfügen möchte, kann ich dann die toppicture Umgebung nicht mehr nehmen. Wahrscheinlich ist es besser erst einmal um jedes Tikzpicture die entsprechende adjustbox-umgebung zu nutzen.

(16 Feb, 10:19) maqu

Ich dachte nur es gibt eine Möglichkeit eine tikzpicture-option zu definieren, die ich einfach angeben kann, wenn ich das tikzpicture oben bündig mit der enumerate-auflistung haben möchte ... das wäre die "noch etwas" einfachere Variante als jedes mal auf die adjustbox-umgebung zurückgreifen zu müssen ;D ... aber trotzdem Danke für die Antwort!

(16 Feb, 10:22) maqu

@maqu TikZ verwendet pgf, das intern pgfkeys zum deklarieren von optionen verwendet. Die anleitung findet sich in kapitel 87 "key management" der pgf anleitung.

(16 Feb, 11:45) huibub

@maqu Du kannst die eigene Umgebung auch mit einem optionalen Argument definieren, um unterschiedliche Skalierungen angeben zu können.

\newenvironment{toppicture}[1][]{\begin{adjustbox}{valign=t}\begin{tikzpicture}[#1]}{\end{tikzpicture}\end{adjustbox}}

(16 Feb, 18:27) Cletus

@huibub danke dir, aber leider bin ich aus Kapitel 87 der pgf-Anleitung nicht schlau geworden >.< mir ist aus den Beispielen dort nicht ersichtlich, wie ich eine Option für das tikzpicture selbst definieren kann ... vielleicht hast du einen Hinweis welchen Befehl genau ich dafür nutzen muss, dann lese ich mich da nochmal rein und probiere etwas herum @Cletus ja so kann man es natürlich auch machen ^^ ... ich dachte die Variablen die ich mit #1 usw für eine neue Umgebung definiere sind immer zwingend anzugeben, aber anscheinend nur optional

(16 Feb, 21:11) maqu

@maqu Siehe esdd's antwort, die genau das ausführt, was ich gemeint habe, und darüber hinaus noch ein wenig mehr.

(17 Feb, 19:09) huibub
Ergebnis 5 von 6 show 1 more comments

Keine eigene Antwort sondern als Ergänzung: die Verwendung von tasks für die Liste und \AddToHook, um das Setzen der TikZ-Option zu Beginn von tasks auszuführen. Damit fällt für das Beispiel die Kombination multicols/enumerate weg:

\documentclass[12pt,a4paper]{article}
\usepackage{tasks}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{geometry}
\geometry{margin=15mm, right=20mm, headsep=10mm, footskip=10mm}

\tikzset{
  topline/.style={baseline={([yshift=#1]current bounding box.north)}},
  topline/.default=-\ht\strutbox
}
\AddToHook{env/tasks/begin}{\tikzset{every picture/.style={scale=0.75, topline}}}

\settasks{
  label = (\alph*) ,
  label-width = 16pt
}

\begin{document}

Male die entsprechenden Bruchanteile aus.
\begin{tasks}(4)
  \task
    \begin{tikzpicture}
      \draw (0,0) rectangle (4,4);
      \foreach \i in {1,2,3} {
        \draw (0,\i) -- (4,\i);
      }
      \draw node at (2,-1) {$\dfrac{1}{4}$};
    \end{tikzpicture}
  \task
    \begin{tikzpicture}
      \draw (0,0) rectangle (4,4);
      \foreach \i in {0.5,1,...,3.5} {
        \draw (0,\i) -- (4,\i);
      }
      \draw node at (2,-1) {$\dfrac{2}{8}$};
    \end{tikzpicture}
  \task
    \begin{tikzpicture}
      \draw (0,0) rectangle(4,4);
      \draw (2,0) -- (2,4);
      \draw node at (2,-1) {$\dfrac{1}{2}$};
    \end{tikzpicture}
  \task
    \begin{tikzpicture}
      \draw (0,0) rectangle (4,4);
      \draw (2,0) -- (2,4);
      \draw (0,2) -- (4,2);
      \draw node at (2,-1) {$\dfrac{3}{4}$};
    \end{tikzpicture}
\end{tasks}

\end{document}
Permanenter link

beantwortet 19 Feb, 11:17

cgnieder's gravatar image

cgnieder
22.0k203463
Akzeptiert-Rate: 59%

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:

×27
×3

gestellte Frage: 15 Feb, 09:30

Frage wurde gesehen: 829 Mal

zuletzt geändert: 23 Feb, 11:08